| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
- <head>
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
- <meta http-equiv="X-UA-Compatible" content="IE=11"/>
- <meta name="generator" content="Doxygen 1.18.0"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <title>tinykernel: C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/sync.hpp Source File</title>
- <link href="tabs.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="codefolding.js"></script>
- <script type="text/javascript" src="clipboard.js"></script>
- <link href="navtree.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="navtreedata.js"></script>
- <script type="text/javascript" src="navtree.js"></script>
- <script type="text/javascript" src="cookie.js"></script>
- <link href="search/search.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="search/searchdata.js"></script>
- <script type="text/javascript" src="search/search.js"></script>
- <link href="doxygen.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
- <div id="titlearea">
- <table cellspacing="0" cellpadding="0">
- <tbody>
- <tr id="projectrow">
- <td id="projectalign">
- <div id="projectname">tinykernel
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- <!-- end header part -->
- <!-- Generated by Doxygen 1.18.0 -->
- <script type="text/javascript">
- let searchBox = new SearchBox("searchBox", "search/",'.html');
- </script>
- <script type="text/javascript">
- document.addEventListener('DOMContentLoaded', codefold.init);
- </script>
- <script type="application/json" id="doxygen-config">
- {
- "relPath": "",
- "generateTreeView": true,
- "searchEngine": true,
- "serverBasedSearch": false,
- "disableIndex": false,
- "dynamicMenus": true,
- "fullSidebar": false
- }
- </script>
- <script type="text/javascript" src="menudata.js"></script>
- <script type="text/javascript" src="menu.js"></script>
- <div id="main-nav-mobile">
- <div class="sm sm-dox"><input id="main-menu-state" type="checkbox"/>
- <label class="main-menu-btn" for="main-menu-state">
- <span class="main-menu-btn-icon"></span> Toggle main menu visibility</label>
- <span id="searchBoxPos1"></span>
- </div>
- </div><!-- main-nav-mobile -->
- <div id="main-nav">
- <ul class="sm sm-dox" id="main-menu">
- <li id="searchBoxPos2">
- <div id="MSearchBox" class="MSearchBoxInactive">
- <span class="left">
- <span id="MSearchSelect" class="search-icon"><span class="search-icon-dropdown"></span></span>
- <input type="text" id="MSearchField" value="" placeholder="Search" accesskey="S"/>
- </span><span class="right">
- <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><div id="MSearchCloseImg" class="close-icon"></div></a>
- </span>
- </div>
- </li>
- </ul>
- </div><!-- main-nav -->
- </div><!-- top -->
- <div id="side-nav" class="ui-resizable side-nav-resizable">
- <div id="nav-tree">
- <div id="nav-tree-contents">
- <div id="nav-sync" class="sync"></div>
- </div>
- </div>
- <div id="splitbar" class="ui-resizable-handle">
- </div>
- </div>
- <script type="text/javascript">
- document.addEventListener('DOMContentLoaded',() => { initNavTree('sync_8hpp_source.html','',''); });
- </script>
- <div id="container">
- <div id="doc-content">
- <!-- window showing the filter options -->
- <div id="MSearchSelectWindow">
- </div>
- <!-- iframe showing the search results (closed by default) -->
- <div id="MSearchResultsWindow">
- <div id="MSearchResults">
- <div class="SRPage">
- <div id="SRIndex">
- <div id="SRResults"></div>
- <div class="SRStatus" id="Loading">Loading...</div>
- <div class="SRStatus" id="Searching">Searching...</div>
- <div class="SRStatus" id="NoMatches">No Matches</div>
- </div>
- </div>
- </div>
- </div>
- <div class="header">
- <div class="headertitle"><div class="title">sync.hpp</div></div>
- </div><!--header-->
- <div class="contents">
- <a href="sync_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="preprocessor">#pragma once</span></div>
- <div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span> </div>
- <div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#include "<a class="code" href="kernel_8hpp.html">kernel.hpp</a>"</span></div>
- <div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include <cstdint></span></div>
- <div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span> </div>
- <div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacetk.html">tk</a> {</div>
- <div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span></div>
- <div class="foldopen" id="foldopen00024" data-start="{" data-end="};">
- <div class="line"><a id="l00024" name="l00024"></a><span class="lineno"><a class="line" href="classtk_1_1_semaphore.html"> 24</a></span><span class="keyword">class </span><a class="code hl_function" href="classtk_1_1_semaphore.html#a66c5ac90338a6fcc6a9c2f22f1586de8">Semaphore</a> {</div>
- <div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">public</span>:</div>
- <div class="foldopen" id="foldopen00031" data-start="{" data-end="}">
- <div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="classtk_1_1_semaphore.html#a66c5ac90338a6fcc6a9c2f22f1586de8"> 31</a></span> <span class="keyword">explicit</span> <a class="code hl_function" href="classtk_1_1_semaphore.html#a66c5ac90338a6fcc6a9c2f22f1586de8">Semaphore</a>(int32_t initial_count = 1, int32_t max_count = 1)</div>
- <div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> : count_(initial_count), max_count_(max_count) {}</div>
- </div>
- <div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span></div>
- <div class="foldopen" id="foldopen00039" data-start="{" data-end="}">
- <div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="classtk_1_1_semaphore.html#a863ccee07bc701a78342c14503955d73"> 39</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classtk_1_1_semaphore.html#a863ccee07bc701a78342c14503955d73">acquire</a>() {</div>
- <div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keywordflow">while</span> (count_ <= 0) {</div>
- <div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> uint8_t slot = <a class="code hl_function" href="namespacetk_1_1detail.html#a73a80d92a172d565201f99e8f31278e4">detail::current_task_slot</a>();</div>
- <div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> wait_mask_ |= (<a class="code hl_typedef" href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">task_mask_t</a>{1} << slot);</div>
- <div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a400363f36b5fb5dfc8aec11334471d0d">detail::block_current_task_locked</a>();</div>
- <div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="comment">// 他タスクから release() されて再開したら再チェック</span></div>
- <div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> }</div>
- <div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> count_--;</div>
- <div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> }</div>
- </div>
- <div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span></div>
- <div class="foldopen" id="foldopen00059" data-start="{" data-end="}">
- <div class="line"><a id="l00059" name="l00059"></a><span class="lineno"><a class="line" href="classtk_1_1_semaphore.html#a3a246c8afc866dc438186d0a53cad5c2"> 59</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classtk_1_1_semaphore.html#a3a246c8afc866dc438186d0a53cad5c2">try_acquire</a>() {</div>
- <div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordtype">bool</span> success = <span class="keyword">false</span>;</div>
- <div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">if</span> (count_ > 0) {</div>
- <div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> count_--;</div>
- <div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> success = <span class="keyword">true</span>;</div>
- <div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> }</div>
- <div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keywordflow">return</span> success;</div>
- <div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> }</div>
- </div>
- <div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span></div>
- <div class="foldopen" id="foldopen00073" data-start="{" data-end="}">
- <div class="line"><a id="l00073" name="l00073"></a><span class="lineno"><a class="line" href="classtk_1_1_semaphore.html#a7bb8eb8b0bd69b2f6b0a4d89d0f5b07b"> 73</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classtk_1_1_semaphore.html#a7bb8eb8b0bd69b2f6b0a4d89d0f5b07b">release</a>() {</div>
- <div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keywordflow">if</span> (count_ < max_count_) {</div>
- <div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> count_++;</div>
- <div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> }</div>
- <div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">if</span> (wait_mask_ != 0) {</div>
- <div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> uint8_t slot = <a class="code hl_function" href="namespacetk_1_1detail.html#a70ba35e0daee086ad86770f1e39c9b35">detail::find_highest_prio_waiter</a>(wait_mask_);</div>
- <div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordflow">if</span> (slot != 0xFF) {</div>
- <div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> wait_mask_ &= ~(<a class="code hl_typedef" href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">task_mask_t</a>{1} << slot);</div>
- <div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <a class="code hl_function" href="namespacetk_1_1detail.html#ab19385598f18560cb574cc86174ececa">detail::wake_task_locked</a>(<a class="code hl_struct" href="structtk_1_1_task_handle.html">TaskHandle</a>{slot});</div>
- <div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> }</div>
- <div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> }</div>
- <div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> }</div>
- </div>
- <div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span></div>
- <div class="foldopen" id="foldopen00089" data-start="{" data-end="}">
- <div class="line"><a id="l00089" name="l00089"></a><span class="lineno"><a class="line" href="classtk_1_1_semaphore.html#ae53b9c57cc25fafb242a21776f112701"> 89</a></span> int32_t <a class="code hl_function" href="classtk_1_1_semaphore.html#ae53b9c57cc25fafb242a21776f112701">count</a>()<span class="keyword"> const </span>{</div>
- <div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> int32_t c = count_;</div>
- <div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">return</span> c;</div>
- <div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> }</div>
- </div>
- <div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> </div>
- <div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="keyword">private</span>:</div>
- <div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> int32_t count_;</div>
- <div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> int32_t max_count_;</div>
- <div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <a class="code hl_typedef" href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">task_mask_t</a> wait_mask_{0};</div>
- <div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span>};</div>
- </div>
- <div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span></div>
- <div class="line"><a id="l00105" name="l00105"></a><span class="lineno"><a class="line" href="namespacetk.html#ab1f2fa3d79e99f13610bd330a0df928b"> 105</a></span><span class="keyword">using </span><a class="code hl_typedef" href="namespacetk.html#ab1f2fa3d79e99f13610bd330a0df928b">BinarySemaphore</a> = <a class="code hl_class" href="classtk_1_1_semaphore.html">Semaphore</a>;</div>
- <div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span></div>
- <div class="foldopen" id="foldopen00123" data-start="{" data-end="};">
- <div class="line"><a id="l00123" name="l00123"></a><span class="lineno"><a class="line" href="classtk_1_1_mutex.html"> 123</a></span><span class="keyword">class </span><a class="code hl_function" href="classtk_1_1_mutex.html#a8b17431db60f4ab48a3859b2ca722eb1">Mutex</a> {</div>
- <div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span><span class="keyword">public</span>:</div>
- <div class="line"><a id="l00125" name="l00125"></a><span class="lineno"><a class="line" href="classtk_1_1_mutex.html#a8b17431db60f4ab48a3859b2ca722eb1"> 125</a></span> <a class="code hl_function" href="classtk_1_1_mutex.html#a8b17431db60f4ab48a3859b2ca722eb1">Mutex</a>() = <span class="keywordflow">default</span>;</div>
- <div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span></div>
- <div class="foldopen" id="foldopen00132" data-start="{" data-end="}">
- <div class="line"><a id="l00132" name="l00132"></a><span class="lineno"><a class="line" href="classtk_1_1_mutex.html#a7f5645bba55df2db263f92a954802c27"> 132</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classtk_1_1_mutex.html#a7f5645bba55df2db263f92a954802c27">lock</a>() {</div>
- <div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> uint8_t my_slot = <a class="code hl_function" href="namespacetk_1_1detail.html#a73a80d92a172d565201f99e8f31278e4">detail::current_task_slot</a>();</div>
- <div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">while</span> (locked_) {</div>
- <div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> wait_mask_ |= (<a class="code hl_typedef" href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">task_mask_t</a>{1} << my_slot);</div>
- <div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a400363f36b5fb5dfc8aec11334471d0d">detail::block_current_task_locked</a>();</div>
- <div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> }</div>
- <div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> locked_ = <span class="keyword">true</span>;</div>
- <div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> owner_slot_ = my_slot;</div>
- <div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> }</div>
- </div>
- <div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span></div>
- <div class="foldopen" id="foldopen00152" data-start="{" data-end="}">
- <div class="line"><a id="l00152" name="l00152"></a><span class="lineno"><a class="line" href="classtk_1_1_mutex.html#a666dd03fb22c5cb855e3145f76a58b9c"> 152</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classtk_1_1_mutex.html#a666dd03fb22c5cb855e3145f76a58b9c">try_lock</a>() {</div>
- <div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> uint8_t my_slot = <a class="code hl_function" href="namespacetk_1_1detail.html#a73a80d92a172d565201f99e8f31278e4">detail::current_task_slot</a>();</div>
- <div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordtype">bool</span> success = <span class="keyword">false</span>;</div>
- <div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">if</span> (!locked_) {</div>
- <div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> locked_ = <span class="keyword">true</span>;</div>
- <div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> owner_slot_ = my_slot;</div>
- <div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> success = <span class="keyword">true</span>;</div>
- <div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> }</div>
- <div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">return</span> success;</div>
- <div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> }</div>
- </div>
- <div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span></div>
- <div class="foldopen" id="foldopen00171" data-start="{" data-end="}">
- <div class="line"><a id="l00171" name="l00171"></a><span class="lineno"><a class="line" href="classtk_1_1_mutex.html#ae8d5dfd5655b5aa54d63db6e0cf2f707"> 171</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classtk_1_1_mutex.html#ae8d5dfd5655b5aa54d63db6e0cf2f707">unlock</a>() {</div>
- <div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> uint8_t my_slot = <a class="code hl_function" href="namespacetk_1_1detail.html#a73a80d92a172d565201f99e8f31278e4">detail::current_task_slot</a>();</div>
- <div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keywordflow">if</span> (locked_ && owner_slot_ == my_slot) {</div>
- <div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> locked_ = <span class="keyword">false</span>;</div>
- <div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> owner_slot_ = 0xFF;</div>
- <div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="keywordflow">if</span> (wait_mask_ != 0) {</div>
- <div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> uint8_t slot = <a class="code hl_function" href="namespacetk_1_1detail.html#a70ba35e0daee086ad86770f1e39c9b35">detail::find_highest_prio_waiter</a>(wait_mask_);</div>
- <div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keywordflow">if</span> (slot != 0xFF) {</div>
- <div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> wait_mask_ &= ~(<a class="code hl_typedef" href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">task_mask_t</a>{1} << slot);</div>
- <div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <a class="code hl_function" href="namespacetk_1_1detail.html#ab19385598f18560cb574cc86174ececa">detail::wake_task_locked</a>(<a class="code hl_struct" href="structtk_1_1_task_handle.html">TaskHandle</a>{slot});</div>
- <div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> }</div>
- <div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> }</div>
- <div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> }</div>
- <div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> }</div>
- </div>
- <div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span></div>
- <div class="foldopen" id="foldopen00189" data-start="{" data-end="}">
- <div class="line"><a id="l00189" name="l00189"></a><span class="lineno"><a class="line" href="classtk_1_1_mutex.html#acf574e35540879481f1f6e5452a504ab"> 189</a></span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classtk_1_1_mutex.html#acf574e35540879481f1f6e5452a504ab">is_locked</a>()<span class="keyword"> const </span>{</div>
- <div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> uint32_t save = <a class="code hl_function" href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">detail::sched_lock</a>();</div>
- <div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordtype">bool</span> lk = locked_;</div>
- <div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <a class="code hl_function" href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">detail::sched_unlock</a>(save);</div>
- <div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keywordflow">return</span> lk;</div>
- <div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> }</div>
- </div>
- <div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> </div>
- <div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span><span class="keyword">private</span>:</div>
- <div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordtype">bool</span> locked_{<span class="keyword">false</span>};</div>
- <div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> uint8_t owner_slot_{0xFF};</div>
- <div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <a class="code hl_typedef" href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">task_mask_t</a> wait_mask_{0};</div>
- <div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span>};</div>
- </div>
- <div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span></div>
- <div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span><span class="keyword">template</span> <<span class="keyword">typename</span> Lockable></div>
- <div class="foldopen" id="foldopen00211" data-start="{" data-end="};">
- <div class="line"><a id="l00211" name="l00211"></a><span class="lineno"><a class="line" href="classtk_1_1_lock_guard.html"> 211</a></span><span class="keyword">class </span><a class="code hl_function" href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb">LockGuard</a> {</div>
- <div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="keyword">public</span>:</div>
- <div class="line"><a id="l00217" name="l00217"></a><span class="lineno"><a class="line" href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb"> 217</a></span> <span class="keyword">explicit</span> <a class="code hl_function" href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb">LockGuard</a>(Lockable& m) : m_(m) { m_.lock(); }</div>
- <div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span></div>
- <div class="line"><a id="l00220" name="l00220"></a><span class="lineno"><a class="line" href="classtk_1_1_lock_guard.html#a52eeb50abee00bd0ed16cfa6618ce40f"> 220</a></span> <a class="code hl_function" href="classtk_1_1_lock_guard.html#a52eeb50abee00bd0ed16cfa6618ce40f">~LockGuard</a>() { m_.unlock(); }</div>
- <div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> </div>
- <div class="line"><a id="l00222" name="l00222"></a><span class="lineno"><a class="line" href="classtk_1_1_lock_guard.html#af9bc86bc2036c4b8e54633ddee811604"> 222</a></span> <a class="code hl_function" href="classtk_1_1_lock_guard.html#af9bc86bc2036c4b8e54633ddee811604">LockGuard</a>(<span class="keyword">const</span> <a class="code hl_function" href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb">LockGuard</a>&) = <span class="keyword">delete</span>;</div>
- <div class="line"><a id="l00223" name="l00223"></a><span class="lineno"><a class="line" href="classtk_1_1_lock_guard.html#a3f121f8aa1307f0f6e6e608cf138340c"> 223</a></span> <a class="code hl_function" href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb">LockGuard</a>& <a class="code hl_function" href="classtk_1_1_lock_guard.html#a3f121f8aa1307f0f6e6e608cf138340c">operator=</a>(<span class="keyword">const</span> <a class="code hl_function" href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb">LockGuard</a>&) = <span class="keyword">delete</span>;</div>
- <div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> </div>
- <div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span><span class="keyword">private</span>:</div>
- <div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> Lockable& m_;</div>
- <div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span>};</div>
- </div>
- <div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> </div>
- <div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span>} <span class="comment">// namespace tk</span></div>
- <div class="ttc" id="aclasstk_1_1_lock_guard_html_a3a922c7edf84ce25ef67151c322bb0eb"><div class="ttname"><a href="classtk_1_1_lock_guard.html#a3a922c7edf84ce25ef67151c322bb0eb">tk::LockGuard::LockGuard</a></div><div class="ttdeci">LockGuard(Lockable &m)</div><div class="ttdoc">ロック対象を受け取り、即座に lock() します</div><div class="ttdef"><b>Definition</b> sync.hpp:217</div></div>
- <div class="ttc" id="aclasstk_1_1_lock_guard_html_a3f121f8aa1307f0f6e6e608cf138340c"><div class="ttname"><a href="classtk_1_1_lock_guard.html#a3f121f8aa1307f0f6e6e608cf138340c">tk::LockGuard::operator=</a></div><div class="ttdeci">LockGuard & operator=(const LockGuard &)=delete</div></div>
- <div class="ttc" id="aclasstk_1_1_lock_guard_html_a52eeb50abee00bd0ed16cfa6618ce40f"><div class="ttname"><a href="classtk_1_1_lock_guard.html#a52eeb50abee00bd0ed16cfa6618ce40f">tk::LockGuard::~LockGuard</a></div><div class="ttdeci">~LockGuard()</div><div class="ttdef"><b>Definition</b> sync.hpp:220</div></div>
- <div class="ttc" id="aclasstk_1_1_lock_guard_html_af9bc86bc2036c4b8e54633ddee811604"><div class="ttname"><a href="classtk_1_1_lock_guard.html#af9bc86bc2036c4b8e54633ddee811604">tk::LockGuard::LockGuard</a></div><div class="ttdeci">LockGuard(const LockGuard &)=delete</div></div>
- <div class="ttc" id="aclasstk_1_1_mutex_html_a666dd03fb22c5cb855e3145f76a58b9c"><div class="ttname"><a href="classtk_1_1_mutex.html#a666dd03fb22c5cb855e3145f76a58b9c">tk::Mutex::try_lock</a></div><div class="ttdeci">bool try_lock()</div><div class="ttdoc">ミューテックスのロックを試みます (ノンブロッキング)</div><div class="ttdef"><b>Definition</b> sync.hpp:152</div></div>
- <div class="ttc" id="aclasstk_1_1_mutex_html_a7f5645bba55df2db263f92a954802c27"><div class="ttname"><a href="classtk_1_1_mutex.html#a7f5645bba55df2db263f92a954802c27">tk::Mutex::lock</a></div><div class="ttdeci">void lock()</div><div class="ttdoc">ミューテックスをロックします (空くまでブロック待機)</div><div class="ttdef"><b>Definition</b> sync.hpp:132</div></div>
- <div class="ttc" id="aclasstk_1_1_mutex_html_a8b17431db60f4ab48a3859b2ca722eb1"><div class="ttname"><a href="classtk_1_1_mutex.html#a8b17431db60f4ab48a3859b2ca722eb1">tk::Mutex::Mutex</a></div><div class="ttdeci">Mutex()=default</div></div>
- <div class="ttc" id="aclasstk_1_1_mutex_html_acf574e35540879481f1f6e5452a504ab"><div class="ttname"><a href="classtk_1_1_mutex.html#acf574e35540879481f1f6e5452a504ab">tk::Mutex::is_locked</a></div><div class="ttdeci">bool is_locked() const</div><div class="ttdef"><b>Definition</b> sync.hpp:189</div></div>
- <div class="ttc" id="aclasstk_1_1_mutex_html_ae8d5dfd5655b5aa54d63db6e0cf2f707"><div class="ttname"><a href="classtk_1_1_mutex.html#ae8d5dfd5655b5aa54d63db6e0cf2f707">tk::Mutex::unlock</a></div><div class="ttdeci">void unlock()</div><div class="ttdoc">ミューテックスのロックを解除します</div><div class="ttdef"><b>Definition</b> sync.hpp:171</div></div>
- <div class="ttc" id="aclasstk_1_1_semaphore_html"><div class="ttname"><a href="classtk_1_1_semaphore.html">tk::Semaphore</a></div><div class="ttdoc">計数セマフォ (Counting Semaphore) / バイナリセマフォ</div><div class="ttdef"><b>Definition</b> sync.hpp:24</div></div>
- <div class="ttc" id="aclasstk_1_1_semaphore_html_a3a246c8afc866dc438186d0a53cad5c2"><div class="ttname"><a href="classtk_1_1_semaphore.html#a3a246c8afc866dc438186d0a53cad5c2">tk::Semaphore::try_acquire</a></div><div class="ttdeci">bool try_acquire()</div><div class="ttdoc">資源の獲得を試みます (ノンブロッキング)</div><div class="ttdef"><b>Definition</b> sync.hpp:59</div></div>
- <div class="ttc" id="aclasstk_1_1_semaphore_html_a66c5ac90338a6fcc6a9c2f22f1586de8"><div class="ttname"><a href="classtk_1_1_semaphore.html#a66c5ac90338a6fcc6a9c2f22f1586de8">tk::Semaphore::Semaphore</a></div><div class="ttdeci">Semaphore(int32_t initial_count=1, int32_t max_count=1)</div><div class="ttdoc">セマフォを初期化します</div><div class="ttdef"><b>Definition</b> sync.hpp:31</div></div>
- <div class="ttc" id="aclasstk_1_1_semaphore_html_a7bb8eb8b0bd69b2f6b0a4d89d0f5b07b"><div class="ttname"><a href="classtk_1_1_semaphore.html#a7bb8eb8b0bd69b2f6b0a4d89d0f5b07b">tk::Semaphore::release</a></div><div class="ttdeci">void release()</div><div class="ttdoc">資源を返却し、待機中タスクがあれば最優先度のタスクを 1 つ起床させます</div><div class="ttdef"><b>Definition</b> sync.hpp:73</div></div>
- <div class="ttc" id="aclasstk_1_1_semaphore_html_a863ccee07bc701a78342c14503955d73"><div class="ttname"><a href="classtk_1_1_semaphore.html#a863ccee07bc701a78342c14503955d73">tk::Semaphore::acquire</a></div><div class="ttdeci">void acquire()</div><div class="ttdoc">資源を獲得するまで現在のタスクをブロックします</div><div class="ttdef"><b>Definition</b> sync.hpp:39</div></div>
- <div class="ttc" id="aclasstk_1_1_semaphore_html_ae53b9c57cc25fafb242a21776f112701"><div class="ttname"><a href="classtk_1_1_semaphore.html#ae53b9c57cc25fafb242a21776f112701">tk::Semaphore::count</a></div><div class="ttdeci">int32_t count() const</div><div class="ttdef"><b>Definition</b> sync.hpp:89</div></div>
- <div class="ttc" id="akernel_8hpp_html"><div class="ttname"><a href="kernel_8hpp.html">kernel.hpp</a></div></div>
- <div class="ttc" id="anamespacetk_1_1detail_html_a400363f36b5fb5dfc8aec11334471d0d"><div class="ttname"><a href="namespacetk_1_1detail.html#a400363f36b5fb5dfc8aec11334471d0d">tk::detail::block_current_task_locked</a></div><div class="ttdeci">void block_current_task_locked()</div><div class="ttdef"><b>Definition</b> scheduler.cpp:333</div></div>
- <div class="ttc" id="anamespacetk_1_1detail_html_a5b8fa6406a867edf8c4410fcb03c6523"><div class="ttname"><a href="namespacetk_1_1detail.html#a5b8fa6406a867edf8c4410fcb03c6523">tk::detail::sched_lock</a></div><div class="ttdeci">uint32_t sched_lock()</div><div class="ttdef"><b>Definition</b> scheduler.cpp:325</div></div>
- <div class="ttc" id="anamespacetk_1_1detail_html_a70ba35e0daee086ad86770f1e39c9b35"><div class="ttname"><a href="namespacetk_1_1detail.html#a70ba35e0daee086ad86770f1e39c9b35">tk::detail::find_highest_prio_waiter</a></div><div class="ttdeci">uint8_t find_highest_prio_waiter(task_mask_t wait_mask)</div><div class="ttdef"><b>Definition</b> scheduler.cpp:355</div></div>
- <div class="ttc" id="anamespacetk_1_1detail_html_a73a80d92a172d565201f99e8f31278e4"><div class="ttname"><a href="namespacetk_1_1detail.html#a73a80d92a172d565201f99e8f31278e4">tk::detail::current_task_slot</a></div><div class="ttdeci">uint8_t current_task_slot()</div><div class="ttdef"><b>Definition</b> scheduler.cpp:349</div></div>
- <div class="ttc" id="anamespacetk_1_1detail_html_a80be9b2429346faf161eab01f595684b"><div class="ttname"><a href="namespacetk_1_1detail.html#a80be9b2429346faf161eab01f595684b">tk::detail::sched_unlock</a></div><div class="ttdeci">void sched_unlock(uint32_t save)</div><div class="ttdef"><b>Definition</b> scheduler.cpp:329</div></div>
- <div class="ttc" id="anamespacetk_1_1detail_html_ab19385598f18560cb574cc86174ececa"><div class="ttname"><a href="namespacetk_1_1detail.html#ab19385598f18560cb574cc86174ececa">tk::detail::wake_task_locked</a></div><div class="ttdeci">void wake_task_locked(TaskHandle handle)</div><div class="ttdef"><b>Definition</b> scheduler.cpp:340</div></div>
- <div class="ttc" id="anamespacetk_html"><div class="ttname"><a href="namespacetk.html">tk</a></div><div class="ttdef"><b>Definition</b> actor.hpp:9</div></div>
- <div class="ttc" id="anamespacetk_html_ab1f2fa3d79e99f13610bd330a0df928b"><div class="ttname"><a href="namespacetk.html#ab1f2fa3d79e99f13610bd330a0df928b">tk::BinarySemaphore</a></div><div class="ttdeci">Semaphore BinarySemaphore</div><div class="ttdoc">バイナリセマフォ (初期値1, 最大1) の型エイリアス</div><div class="ttdef"><b>Definition</b> sync.hpp:105</div></div>
- <div class="ttc" id="anamespacetk_html_add371a241ec6c1695ef4e67935317edd"><div class="ttname"><a href="namespacetk.html#add371a241ec6c1695ef4e67935317edd">tk::task_mask_t</a></div><div class="ttdeci">uint32_t task_mask_t</div><div class="ttdef"><b>Definition</b> kernel.hpp:165</div></div>
- <div class="ttc" id="astructtk_1_1_task_handle_html"><div class="ttname"><a href="structtk_1_1_task_handle.html">tk::TaskHandle</a></div><div class="ttdoc">タスクの識別ハンドル</div><div class="ttdef"><b>Definition</b> kernel.hpp:49</div></div>
- </div><!-- fragment --></div><!-- contents -->
- </div><!-- doc-content -->
- </div><!-- container -->
- <!-- start footer part -->
- <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
- <ul>
- <li class="navelem"><a href="dir_9b10c2ff4e034627dc7271865b055c64.html">Pico_Projects</a></li><li class="navelem"><a href="dir_01f710e8c634e538c6d9f00c5eaf4f2e.html">tinykernel</a></li><li class="navelem"><a href="dir_065670814960ad9cf60e14e38242ec92.html">tinykernel</a></li><li class="navelem"><a href="dir_34ae86e414c9a960c5c39d1d6b15c7a8.html">include</a></li><li class="navelem"><a href="dir_91e9b2eecded889eb8782a5ba7843b6a.html">tinykernel</a></li><li class="navelem"><a href="sync_8hpp.html">sync.hpp</a></li>
- <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.18.0 </li>
- </ul>
- </div>
- </body>
- </html>
|