scheduler_8cpp.xml 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. <?xml version='1.0' encoding='UTF-8' standalone='no'?>
  2. <doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.18.0" xml:lang="ja">
  3. <compounddef id="scheduler_8cpp" kind="file" language="C++">
  4. <compoundname>scheduler.cpp</compoundname>
  5. <includes refid="kernel_8hpp" local="yes">tinykernel/kernel.hpp</includes>
  6. <includes local="no">cstring</includes>
  7. <includes local="yes">pico/platform.h</includes>
  8. <includes local="yes">pico/multicore.h</includes>
  9. <includes local="yes">hardware/sync.h</includes>
  10. <includes refid="port__m33_8h" local="yes">port/m33/port_m33.h</includes>
  11. <incdepgraph>
  12. <node id="2">
  13. <label>tinykernel/kernel.hpp</label>
  14. <link refid="kernel_8hpp"/>
  15. <childnode refid="3" relation="include">
  16. </childnode>
  17. <childnode refid="4" relation="include">
  18. </childnode>
  19. <childnode refid="5" relation="include">
  20. </childnode>
  21. </node>
  22. <node id="10">
  23. <label>port/m33/port_m33.h</label>
  24. <link refid="port__m33_8h"/>
  25. <childnode refid="3" relation="include">
  26. </childnode>
  27. <childnode refid="11" relation="include">
  28. </childnode>
  29. </node>
  30. <node id="1">
  31. <label>C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp</label>
  32. <link refid="scheduler_8cpp"/>
  33. <childnode refid="2" relation="include">
  34. </childnode>
  35. <childnode refid="6" relation="include">
  36. </childnode>
  37. <childnode refid="7" relation="include">
  38. </childnode>
  39. <childnode refid="8" relation="include">
  40. </childnode>
  41. <childnode refid="9" relation="include">
  42. </childnode>
  43. <childnode refid="10" relation="include">
  44. </childnode>
  45. </node>
  46. <node id="6">
  47. <label>cstring</label>
  48. </node>
  49. <node id="11">
  50. <label>hardware/structs/scb.h</label>
  51. </node>
  52. <node id="9">
  53. <label>hardware/sync.h</label>
  54. </node>
  55. <node id="8">
  56. <label>pico/multicore.h</label>
  57. </node>
  58. <node id="7">
  59. <label>pico/platform.h</label>
  60. </node>
  61. <node id="5">
  62. <label>pico/runtime.h</label>
  63. </node>
  64. <node id="4">
  65. <label>stddef.h</label>
  66. </node>
  67. <node id="3">
  68. <label>stdint.h</label>
  69. </node>
  70. </incdepgraph>
  71. <innerclass refid="struct_fpu_ctx" prot="public">FpuCtx</innerclass>
  72. <innernamespace refid="namespacetk">tk</innernamespace>
  73. <innernamespace refid="namespacetk_1_1detail">tk::detail</innernamespace>
  74. <sectiondef kind="var">
  75. <memberdef kind="variable" id="scheduler_8cpp_1ad7a9acf1577e1fc4ff193d79edf9e254" prot="public" static="no" mutable="no">
  76. <type><ref refid="struct_fpu_ctx" kindref="compound">FpuCtx</ref></type>
  77. <definition>FpuCtx tk_fpu_scratch[TK_NUM_CORES]</definition>
  78. <argsstring>[TK_NUM_CORES]</argsstring>
  79. <name>tk_fpu_scratch</name>
  80. <initializer>= {}</initializer>
  81. <briefdescription>
  82. </briefdescription>
  83. <detaileddescription>
  84. </detaileddescription>
  85. <inbodydescription>
  86. </inbodydescription>
  87. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" line="113" column="20" bodyfile="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" bodystart="113" bodyend="113"/>
  88. </memberdef>
  89. </sectiondef>
  90. <sectiondef kind="func">
  91. <memberdef kind="function" id="scheduler_8cpp_1a4728919288dacba97228c27b1c996108" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
  92. <type>void</type>
  93. <definition>void isr_systick</definition>
  94. <argsstring>(void)</argsstring>
  95. <name>isr_systick</name>
  96. <param>
  97. <type>void</type>
  98. </param>
  99. <briefdescription>
  100. </briefdescription>
  101. <detaileddescription>
  102. </detaileddescription>
  103. <inbodydescription>
  104. </inbodydescription>
  105. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" line="117" column="17" bodyfile="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" bodystart="117" bodyend="151"/>
  106. </memberdef>
  107. <memberdef kind="function" id="scheduler_8cpp_1a10d391ed68d7bf5406e9dbcd1c69d1da" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
  108. <type>uintptr_t</type>
  109. <definition>uintptr_t tk_switch_context</definition>
  110. <argsstring>(uintptr_t cur_sp)</argsstring>
  111. <name>tk_switch_context</name>
  112. <param>
  113. <type>uintptr_t</type>
  114. <declname>cur_sp</declname>
  115. </param>
  116. <briefdescription>
  117. </briefdescription>
  118. <detaileddescription>
  119. </detaileddescription>
  120. <inbodydescription>
  121. </inbodydescription>
  122. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" line="154" column="22" bodyfile="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" bodystart="154" bodyend="184"/>
  123. </memberdef>
  124. <memberdef kind="function" id="scheduler_8cpp_1a155a1d0ce79cec9569b0634e8186ddfd" prot="public" static="yes" const="no" explicit="no" inline="no" virt="non-virtual">
  125. <type>void</type>
  126. <definition>static void core_start_routine</definition>
  127. <argsstring>(uint32_t core)</argsstring>
  128. <name>core_start_routine</name>
  129. <param>
  130. <type>uint32_t</type>
  131. <declname>core</declname>
  132. </param>
  133. <briefdescription>
  134. </briefdescription>
  135. <detaileddescription>
  136. </detaileddescription>
  137. <inbodydescription>
  138. </inbodydescription>
  139. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" line="222" column="13" bodyfile="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" bodystart="222" bodyend="241"/>
  140. </memberdef>
  141. <memberdef kind="function" id="scheduler_8cpp_1a3d2cebe4591c5bb602b5de639f66a35f" prot="public" static="yes" const="no" explicit="no" inline="no" virt="non-virtual">
  142. <type>void</type>
  143. <definition>static void core1_entry</definition>
  144. <argsstring>(void)</argsstring>
  145. <name>core1_entry</name>
  146. <param>
  147. <type>void</type>
  148. </param>
  149. <briefdescription>
  150. </briefdescription>
  151. <detaileddescription>
  152. </detaileddescription>
  153. <inbodydescription>
  154. </inbodydescription>
  155. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" line="243" column="13" bodyfile="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" bodystart="243" bodyend="245"/>
  156. </memberdef>
  157. <memberdef kind="function" id="scheduler_8cpp_1ad29ac857f58c5bf7c0220403c6624f32" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
  158. <type>void</type>
  159. <definition>void tk_task_return_trampoline</definition>
  160. <argsstring>(void)</argsstring>
  161. <name>tk_task_return_trampoline</name>
  162. <param>
  163. <type>void</type>
  164. </param>
  165. <briefdescription>
  166. </briefdescription>
  167. <detaileddescription>
  168. </detaileddescription>
  169. <inbodydescription>
  170. </inbodydescription>
  171. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" line="308" column="17" bodyfile="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp" bodystart="308" bodyend="310"/>
  172. </memberdef>
  173. </sectiondef>
  174. <briefdescription>
  175. </briefdescription>
  176. <detaileddescription>
  177. </detaileddescription>
  178. <programlisting>
  179. <codeline lineno="1"><highlight class="preprocessor">#include<sp/>&quot;<ref refid="kernel_8hpp" kindref="compound">tinykernel/kernel.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
  180. <codeline lineno="2"><highlight class="normal"></highlight></codeline>
  181. <codeline lineno="3"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;cstring&gt;</highlight><highlight class="normal"></highlight></codeline>
  182. <codeline lineno="4"><highlight class="normal"></highlight></codeline>
  183. <codeline lineno="5"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;pico/platform.h&quot;</highlight><highlight class="normal"></highlight></codeline>
  184. <codeline lineno="6"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;pico/multicore.h&quot;</highlight><highlight class="normal"></highlight></codeline>
  185. <codeline lineno="7"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;hardware/sync.h&quot;</highlight><highlight class="normal"></highlight></codeline>
  186. <codeline lineno="8"><highlight class="normal"></highlight></codeline>
  187. <codeline lineno="9"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="port__m33_8h" kindref="compound">port/m33/port_m33.h</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
  188. <codeline lineno="10"><highlight class="normal"></highlight></codeline>
  189. <codeline lineno="11" refid="struct_fpu_ctx" refkind="compound"><highlight class="normal"></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal"><ref refid="struct_fpu_ctx" kindref="compound">FpuCtx</ref><sp/>{</highlight></codeline>
  190. <codeline lineno="12"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">float</highlight><highlight class="normal"><sp/><ref refid="struct_fpu_ctx_1ad2c3227e92b86055b7c97fbd0ee5c445" kindref="member">s</ref>[32];</highlight></codeline>
  191. <codeline lineno="13"><highlight class="normal">};</highlight></codeline>
  192. <codeline lineno="14"><highlight class="normal"></highlight><highlight class="keyword">static_assert</highlight><highlight class="normal">(</highlight><highlight class="keyword">sizeof</highlight><highlight class="normal">(<ref refid="struct_fpu_ctx" kindref="compound">FpuCtx</ref>)<sp/>==<sp/>128,<sp/></highlight><highlight class="stringliteral">&quot;FPU<sp/>context<sp/>layout<sp/>must<sp/>match<sp/>context.S&quot;</highlight><highlight class="normal">);</highlight></codeline>
  193. <codeline lineno="15"><highlight class="normal"></highlight></codeline>
  194. <codeline lineno="16"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal">{</highlight></codeline>
  195. <codeline lineno="17"><highlight class="normal"></highlight></codeline>
  196. <codeline lineno="18"><highlight class="normal"></highlight><highlight class="keyword">constexpr</highlight><highlight class="normal"><sp/>uint32_t<sp/>TK_NUM_CORES<sp/>=<sp/>2;</highlight></codeline>
  197. <codeline lineno="19"><highlight class="normal"></highlight></codeline>
  198. <codeline lineno="20"><highlight class="normal"></highlight><highlight class="keyword">enum<sp/>class</highlight><highlight class="normal"><sp/>State<sp/>:<sp/>uint8_t<sp/>{<sp/>Free<sp/>=<sp/>0,<sp/>Ready,<sp/>Running,<sp/>Sleeping,<sp/>Blocked,<sp/>Terminated<sp/>};</highlight></codeline>
  199. <codeline lineno="21"><highlight class="normal"></highlight></codeline>
  200. <codeline lineno="22"><highlight class="normal"></highlight><highlight class="keyword">struct<sp/></highlight><highlight class="normal">TaskSlot<sp/>{</highlight></codeline>
  201. <codeline lineno="23"><highlight class="normal"><sp/><sp/><sp/><sp/>State<sp/>state;</highlight></codeline>
  202. <codeline lineno="24"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1a8908cf1e54cdc4e14ac3003126722cfc" kindref="member">tk::TaskFn</ref><sp/>fn;</highlight></codeline>
  203. <codeline lineno="25"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*<sp/>arg;</highlight></codeline>
  204. <codeline lineno="26"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>name;</highlight></codeline>
  205. <codeline lineno="27"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>prio;<sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>0..15,<sp/>lower<sp/>is<sp/>higher<sp/>priority</highlight><highlight class="normal"></highlight></codeline>
  206. <codeline lineno="28"><highlight class="normal"><sp/><sp/><sp/><sp/>uintptr_t<sp/>sp;<sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>saved<sp/>SP<sp/>(points<sp/>at<sp/>the<sp/>core8<sp/>frame);<sp/>0<sp/>=<sp/>not<sp/>started<sp/>yet</highlight><highlight class="normal"></highlight></codeline>
  207. <codeline lineno="29"><highlight class="normal"><sp/><sp/><sp/><sp/>int64_t<sp/>wake_tick;</highlight></codeline>
  208. <codeline lineno="30"><highlight class="normal"><sp/><sp/><sp/><sp/>int32_t<sp/>slice_left;</highlight></codeline>
  209. <codeline lineno="31"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>is_idle;</highlight></codeline>
  210. <codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/>FpuCtx<sp/>fpu;</highlight></codeline>
  211. <codeline lineno="33"><highlight class="normal">};</highlight></codeline>
  212. <codeline lineno="34"><highlight class="normal"></highlight></codeline>
  213. <codeline lineno="35"><highlight class="normal"></highlight><highlight class="keyword">static_assert</highlight><highlight class="normal">(<ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref><sp/>&lt;=<sp/>255,<sp/></highlight><highlight class="stringliteral">&quot;slot<sp/>index<sp/>must<sp/>fit<sp/>in<sp/>a<sp/>byte&quot;</highlight><highlight class="normal">);</highlight></codeline>
  214. <codeline lineno="36"><highlight class="normal"></highlight></codeline>
  215. <codeline lineno="37"><highlight class="normal"></highlight><highlight class="keyword">alignas</highlight><highlight class="normal">(16)<sp/></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>TaskSlot<sp/>g_slots[<ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>];<sp/><sp/></highlight><highlight class="comment">//<sp/>slot<sp/>0<sp/>=<sp/>idle0,<sp/>slot<sp/>1<sp/>=<sp/>idle1</highlight><highlight class="normal"></highlight></codeline>
  216. <codeline lineno="38"><highlight class="normal"></highlight><highlight class="keyword">alignas</highlight><highlight class="normal">(8)<sp/></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal"><sp/>g_stacks[<ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>][<ref refid="kernel_8hpp_1afde197f9493ef5bdb5b715ce8b52148d" kindref="member">TK_DEFAULT_STACK_SIZE</ref>];</highlight></codeline>
  217. <codeline lineno="39"><highlight class="normal"></highlight></codeline>
  218. <codeline lineno="40"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>uint8_t<sp/>g_cur[TK_NUM_CORES]<sp/>=<sp/>{0,<sp/>1};</highlight></codeline>
  219. <codeline lineno="41"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">volatile</highlight><highlight class="normal"><sp/>uint32_t<sp/>g_preempt_disabled[TK_NUM_CORES]<sp/>=<sp/>{0,<sp/>0};</highlight></codeline>
  220. <codeline lineno="42"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>int64_t<sp/>g_tick<sp/>=<sp/>0;</highlight></codeline>
  221. <codeline lineno="43"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>g_started<sp/>=<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
  222. <codeline lineno="44"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>uint8_t<sp/>g_rr_last[16]<sp/>=<sp/>{0};</highlight></codeline>
  223. <codeline lineno="45"><highlight class="normal"></highlight></codeline>
  224. <codeline lineno="46"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>spin_lock_t*<sp/>g_sched_lock<sp/>=<sp/></highlight><highlight class="keyword">nullptr</highlight><highlight class="normal">;</highlight></codeline>
  225. <codeline lineno="47"><highlight class="normal"></highlight></codeline>
  226. <codeline lineno="48"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">inline</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>ensure_sched_lock(</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">)<sp/>{</highlight></codeline>
  227. <codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!g_sched_lock)<sp/>{</highlight></codeline>
  228. <codeline lineno="50"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>lock_num<sp/>=<sp/>spin_lock_claim_unused(</highlight><highlight class="keyword">true</highlight><highlight class="normal">);</highlight></codeline>
  229. <codeline lineno="51"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_sched_lock<sp/>=<sp/>spin_lock_instance(lock_num);</highlight></codeline>
  230. <codeline lineno="52"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  231. <codeline lineno="53"><highlight class="normal">}</highlight></codeline>
  232. <codeline lineno="54"><highlight class="normal"></highlight></codeline>
  233. <codeline lineno="55"><highlight class="normal"></highlight><highlight class="keyword">constexpr</highlight><highlight class="normal"><sp/>uint32_t<sp/>kIdlePrio<sp/>=<sp/>15u;</highlight></codeline>
  234. <codeline lineno="56"><highlight class="normal"></highlight><highlight class="keyword">constexpr</highlight><highlight class="normal"><sp/>int32_t<sp/>kSliceTicks<sp/>=<sp/>(int32_t)(((uint64_t)<ref refid="kernel_8hpp_1af32989639aecb5479b4239639fd133f7" kindref="member">TK_TIME_SLICE_MS</ref><sp/>*<sp/><ref refid="kernel_8hpp_1a5c791131c5ad22ed87a8d3ca2cd57d33" kindref="member">TK_TICKS_PER_SEC</ref><sp/>+<sp/>999u)<sp/>/<sp/>1000u);</highlight></codeline>
  235. <codeline lineno="57"><highlight class="normal"></highlight><highlight class="keyword">static_assert</highlight><highlight class="normal">(kSliceTicks<sp/>&gt;=<sp/>1,<sp/></highlight><highlight class="stringliteral">&quot;time<sp/>slice<sp/>must<sp/>be<sp/>at<sp/>least<sp/>one<sp/>tick&quot;</highlight><highlight class="normal">);</highlight></codeline>
  236. <codeline lineno="58"><highlight class="normal"></highlight></codeline>
  237. <codeline lineno="59"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">inline</highlight><highlight class="normal"><sp/>uint32_t<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>(</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">)<sp/>{</highlight></codeline>
  238. <codeline lineno="60"><highlight class="normal"><sp/><sp/><sp/><sp/>ensure_sched_lock();</highlight></codeline>
  239. <codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>spin_lock_blocking(g_sched_lock);</highlight></codeline>
  240. <codeline lineno="62"><highlight class="normal">}</highlight></codeline>
  241. <codeline lineno="63"><highlight class="normal"></highlight></codeline>
  242. <codeline lineno="64"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">inline</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(uint32_t<sp/>save)<sp/>{</highlight></codeline>
  243. <codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/>spin_unlock(g_sched_lock,<sp/>save);</highlight></codeline>
  244. <codeline lineno="66"><highlight class="normal">}</highlight></codeline>
  245. <codeline lineno="67"><highlight class="normal"></highlight></codeline>
  246. <codeline lineno="68"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>idle_fn(</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*<sp/>arg)<sp/>{</highlight></codeline>
  247. <codeline lineno="69"><highlight class="normal"><sp/><sp/><sp/><sp/>(void)arg;</highlight></codeline>
  248. <codeline lineno="70"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(;;)<sp/>{</highlight></codeline>
  249. <codeline lineno="71"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>__asm__<sp/></highlight><highlight class="keyword">volatile</highlight><highlight class="normal">(</highlight><highlight class="stringliteral">&quot;wfi&quot;</highlight><highlight class="normal">);</highlight></codeline>
  250. <codeline lineno="72"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  251. <codeline lineno="73"><highlight class="normal">}</highlight></codeline>
  252. <codeline lineno="74"><highlight class="normal"></highlight></codeline>
  253. <codeline lineno="75"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keyword">inline</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>is_runnable(uint32_t<sp/>slot_idx,<sp/>uint32_t<sp/>core)<sp/>{</highlight></codeline>
  254. <codeline lineno="76"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/>TaskSlot&amp;<sp/>s<sp/>=<sp/>g_slots[slot_idx];</highlight></codeline>
  255. <codeline lineno="77"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(s.is_idle)<sp/>{</highlight></codeline>
  256. <codeline lineno="78"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>slot_idx<sp/>==<sp/>core;<sp/></highlight><highlight class="comment">//<sp/>Core<sp/>0<sp/>only<sp/>runs<sp/>idle<sp/>0,<sp/>Core<sp/>1<sp/>only<sp/>runs<sp/>idle<sp/>1</highlight><highlight class="normal"></highlight></codeline>
  257. <codeline lineno="79"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  258. <codeline lineno="80"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>s.state<sp/>==<sp/>State::Ready;</highlight></codeline>
  259. <codeline lineno="81"><highlight class="normal">}</highlight></codeline>
  260. <codeline lineno="82"><highlight class="normal"></highlight></codeline>
  261. <codeline lineno="83"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Highest<sp/>priority<sp/>level<sp/>with<sp/>at<sp/>least<sp/>one<sp/>runnable<sp/>task<sp/>for<sp/>this<sp/>core.</highlight><highlight class="normal"></highlight></codeline>
  262. <codeline lineno="84"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>int32_t<sp/>find_prio_level(uint32_t<sp/>core)<sp/>{</highlight></codeline>
  263. <codeline lineno="85"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>p<sp/>=<sp/>0;<sp/>p<sp/>&lt;<sp/>16u;<sp/>++p)<sp/>{</highlight></codeline>
  264. <codeline lineno="86"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>i<sp/>=<sp/>0;<sp/>i<sp/>&lt;<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;<sp/>++i)<sp/>{</highlight></codeline>
  265. <codeline lineno="87"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_slots[i].prio<sp/>==<sp/>p<sp/>&amp;&amp;<sp/>is_runnable(i,<sp/>core))<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>(int32_t)p;</highlight></codeline>
  266. <codeline lineno="88"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  267. <codeline lineno="89"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  268. <codeline lineno="90"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>(int32_t)kIdlePrio;</highlight></codeline>
  269. <codeline lineno="91"><highlight class="normal">}</highlight></codeline>
  270. <codeline lineno="92"><highlight class="normal"></highlight></codeline>
  271. <codeline lineno="93"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>uint32_t<sp/>pick_round_robin(uint32_t<sp/>level,<sp/>uint32_t<sp/>core)<sp/>{</highlight></codeline>
  272. <codeline lineno="94"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(level<sp/>==<sp/>kIdlePrio)<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>core;</highlight></codeline>
  273. <codeline lineno="95"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>k<sp/>=<sp/>1;<sp/>k<sp/>&lt;=<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;<sp/>++k)<sp/>{</highlight></codeline>
  274. <codeline lineno="96"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>i<sp/>=<sp/>(g_rr_last[level]<sp/>+<sp/>k)<sp/>%<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;</highlight></codeline>
  275. <codeline lineno="97"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(i<sp/>&gt;=<sp/>TK_NUM_CORES<sp/>&amp;&amp;<sp/>g_slots[i].prio<sp/>==<sp/>level<sp/>&amp;&amp;<sp/>is_runnable(i,<sp/>core))<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>i;</highlight></codeline>
  276. <codeline lineno="98"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  277. <codeline lineno="99"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>core;</highlight></codeline>
  278. <codeline lineno="100"><highlight class="normal">}</highlight></codeline>
  279. <codeline lineno="101"><highlight class="normal"></highlight></codeline>
  280. <codeline lineno="102"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Choose<sp/>the<sp/>next<sp/>task<sp/>for<sp/>the<sp/>given<sp/>core.</highlight><highlight class="normal"></highlight></codeline>
  281. <codeline lineno="103"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/>uint32_t<sp/>select_next(uint32_t<sp/>core)<sp/>{</highlight></codeline>
  282. <codeline lineno="104"><highlight class="normal"><sp/><sp/><sp/><sp/>int32_t<sp/>level<sp/>=<sp/>find_prio_level(core);</highlight></codeline>
  283. <codeline lineno="105"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(level<sp/>&lt;<sp/>0)<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>core;</highlight></codeline>
  284. <codeline lineno="106"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>pick_round_robin((uint32_t)level,<sp/>core);</highlight></codeline>
  285. <codeline lineno="107"><highlight class="normal">}</highlight></codeline>
  286. <codeline lineno="108"><highlight class="normal"></highlight></codeline>
  287. <codeline lineno="109"><highlight class="normal">}<sp/><sp/></highlight><highlight class="comment">//<sp/>namespace</highlight><highlight class="normal"></highlight></codeline>
  288. <codeline lineno="110"><highlight class="normal"></highlight></codeline>
  289. <codeline lineno="111"><highlight class="normal"></highlight><highlight class="comment">//<sp/>Referenced<sp/>(unmangled)<sp/>from<sp/>context.S:<sp/>scratch<sp/>area<sp/>per-core<sp/>for<sp/>FPU<sp/>state<sp/>transfer.</highlight><highlight class="normal"></highlight></codeline>
  290. <codeline lineno="112"><highlight class="normal"></highlight><highlight class="keyword">extern</highlight><highlight class="normal"><sp/></highlight><highlight class="stringliteral">&quot;C&quot;</highlight><highlight class="normal"><sp/>{</highlight></codeline>
  291. <codeline lineno="113"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">alignas</highlight><highlight class="normal">(8)<sp/><ref refid="struct_fpu_ctx" kindref="compound">FpuCtx</ref><sp/><ref refid="scheduler_8cpp_1ad7a9acf1577e1fc4ff193d79edf9e254" kindref="member">tk_fpu_scratch</ref>[TK_NUM_CORES]<sp/>=<sp/>{};</highlight></codeline>
  292. <codeline lineno="114"><highlight class="normal">}</highlight></codeline>
  293. <codeline lineno="115"><highlight class="normal"></highlight></codeline>
  294. <codeline lineno="116"><highlight class="normal"></highlight><highlight class="comment">//<sp/>SysTick<sp/>interrupt<sp/>handler:<sp/>advances<sp/>ticks<sp/>on<sp/>Core<sp/>0,<sp/>wakes<sp/>sleeping<sp/>tasks,<sp/>and<sp/>checks<sp/>time<sp/>slices.</highlight><highlight class="normal"></highlight></codeline>
  295. <codeline lineno="117"><highlight class="normal"></highlight><highlight class="keyword">extern</highlight><highlight class="normal"><sp/></highlight><highlight class="stringliteral">&quot;C&quot;</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="scheduler_8cpp_1a4728919288dacba97228c27b1c996108" kindref="member">isr_systick</ref>(</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">)<sp/>{</highlight></codeline>
  296. <codeline lineno="118"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  297. <codeline lineno="119"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  298. <codeline lineno="120"><highlight class="normal"></highlight></codeline>
  299. <codeline lineno="121"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>need_switch<sp/>=<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
  300. <codeline lineno="122"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(core<sp/>==<sp/>0)<sp/>{</highlight></codeline>
  301. <codeline lineno="123"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>++g_tick;</highlight></codeline>
  302. <codeline lineno="124"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>i<sp/>=<sp/>TK_NUM_CORES;<sp/>i<sp/>&lt;<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;<sp/>++i)<sp/>{</highlight></codeline>
  303. <codeline lineno="125"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>s<sp/>=<sp/>g_slots[i];</highlight></codeline>
  304. <codeline lineno="126"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(s.state<sp/>==<sp/>State::Sleeping<sp/>&amp;&amp;<sp/>g_tick<sp/>&gt;=<sp/>s.wake_tick)<sp/>{</highlight></codeline>
  305. <codeline lineno="127"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>s.state<sp/>=<sp/>State::Ready;</highlight></codeline>
  306. <codeline lineno="128"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>need_switch<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  307. <codeline lineno="129"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  308. <codeline lineno="130"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  309. <codeline lineno="131"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  310. <codeline lineno="132"><highlight class="normal"></highlight></codeline>
  311. <codeline lineno="133"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>cur<sp/>=<sp/>g_slots[g_cur[core]];</highlight></codeline>
  312. <codeline lineno="134"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(cur.is_idle)<sp/>{</highlight></codeline>
  313. <codeline lineno="135"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(find_prio_level(core)<sp/>&lt;<sp/>(int32_t)kIdlePrio)<sp/>{</highlight></codeline>
  314. <codeline lineno="136"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>need_switch<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  315. <codeline lineno="137"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  316. <codeline lineno="138"><highlight class="normal"><sp/><sp/><sp/><sp/>}<sp/></highlight><highlight class="keywordflow">else</highlight><highlight class="normal"><sp/>{</highlight></codeline>
  317. <codeline lineno="139"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>--cur.slice_left;</highlight></codeline>
  318. <codeline lineno="140"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(cur.slice_left<sp/>&lt;=<sp/>0)<sp/>{</highlight></codeline>
  319. <codeline lineno="141"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>cur.slice_left<sp/>=<sp/>kSliceTicks;</highlight></codeline>
  320. <codeline lineno="142"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>need_switch<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  321. <codeline lineno="143"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  322. <codeline lineno="144"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  323. <codeline lineno="145"><highlight class="normal"></highlight></codeline>
  324. <codeline lineno="146"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  325. <codeline lineno="147"><highlight class="normal"></highlight></codeline>
  326. <codeline lineno="148"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(need_switch)<sp/>{</highlight></codeline>
  327. <codeline lineno="149"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  328. <codeline lineno="150"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  329. <codeline lineno="151"><highlight class="normal">}</highlight></codeline>
  330. <codeline lineno="152"><highlight class="normal"></highlight></codeline>
  331. <codeline lineno="153"><highlight class="normal"></highlight><highlight class="comment">//<sp/>PendSV<sp/>context<sp/>switch<sp/>function:<sp/>saves<sp/>cur_sp,<sp/>selects<sp/>next<sp/>task,<sp/>and<sp/>returns<sp/>next<sp/>SP.</highlight><highlight class="normal"></highlight></codeline>
  332. <codeline lineno="154"><highlight class="normal"></highlight><highlight class="keyword">extern</highlight><highlight class="normal"><sp/></highlight><highlight class="stringliteral">&quot;C&quot;</highlight><highlight class="normal"><sp/>uintptr_t<sp/><ref refid="scheduler_8cpp_1a10d391ed68d7bf5406e9dbcd1c69d1da" kindref="member">tk_switch_context</ref>(uintptr_t<sp/>cur_sp)<sp/>{</highlight></codeline>
  333. <codeline lineno="155"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  334. <codeline lineno="156"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  335. <codeline lineno="157"><highlight class="normal"></highlight></codeline>
  336. <codeline lineno="158"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>cur<sp/>=<sp/>g_slots[g_cur[core]];</highlight></codeline>
  337. <codeline lineno="159"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_preempt_disabled[core]<sp/>&gt;<sp/>0<sp/>&amp;&amp;<sp/>cur.state<sp/>==<sp/>State::Running)<sp/>{</highlight></codeline>
  338. <codeline lineno="160"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  339. <codeline lineno="161"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>cur_sp;</highlight></codeline>
  340. <codeline lineno="162"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  341. <codeline lineno="163"><highlight class="normal"></highlight></codeline>
  342. <codeline lineno="164"><highlight class="normal"><sp/><sp/><sp/><sp/>cur.sp<sp/>=<sp/>cur_sp;</highlight></codeline>
  343. <codeline lineno="165"><highlight class="normal"><sp/><sp/><sp/><sp/>memcpy(&amp;cur.fpu,<sp/>&amp;<ref refid="scheduler_8cpp_1ad7a9acf1577e1fc4ff193d79edf9e254" kindref="member">tk_fpu_scratch</ref>[core],<sp/></highlight><highlight class="keyword">sizeof</highlight><highlight class="normal">(cur.fpu));</highlight></codeline>
  344. <codeline lineno="166"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(cur.state<sp/>==<sp/>State::Running)<sp/>{</highlight></codeline>
  345. <codeline lineno="167"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>cur.state<sp/>=<sp/>State::Ready;</highlight></codeline>
  346. <codeline lineno="168"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  347. <codeline lineno="169"><highlight class="normal"></highlight></codeline>
  348. <codeline lineno="170"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>next<sp/>=<sp/>select_next(core);</highlight></codeline>
  349. <codeline lineno="171"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>nxt<sp/>=<sp/>g_slots[next];</highlight></codeline>
  350. <codeline lineno="172"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(nxt.sp<sp/>==<sp/>0)<sp/>{</highlight></codeline>
  351. <codeline lineno="173"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>nxt.sp<sp/>=<sp/><ref refid="port__m33_8h_1a57df28e1d96b701ef5b9713cae179462" kindref="member">tk_port_make_frame</ref>(</highlight><highlight class="keyword">reinterpret_cast&lt;</highlight><highlight class="normal">uint8_t*</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(&amp;g_stacks[next][0]),</highlight></codeline>
  352. <codeline lineno="174"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="kernel_8hpp_1afde197f9493ef5bdb5b715ce8b52148d" kindref="member">TK_DEFAULT_STACK_SIZE</ref>,<sp/></highlight><highlight class="keyword">reinterpret_cast&lt;</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(nxt.fn),<sp/>nxt.arg);</highlight></codeline>
  353. <codeline lineno="175"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  354. <codeline lineno="176"><highlight class="normal"><sp/><sp/><sp/><sp/>nxt.state<sp/>=<sp/>State::Running;</highlight></codeline>
  355. <codeline lineno="177"><highlight class="normal"><sp/><sp/><sp/><sp/>memcpy(&amp;<ref refid="scheduler_8cpp_1ad7a9acf1577e1fc4ff193d79edf9e254" kindref="member">tk_fpu_scratch</ref>[core],<sp/>&amp;nxt.fpu,<sp/></highlight><highlight class="keyword">sizeof</highlight><highlight class="normal">(nxt.fpu));</highlight></codeline>
  356. <codeline lineno="178"><highlight class="normal"><sp/><sp/><sp/><sp/>nxt.slice_left<sp/>=<sp/>kSliceTicks;</highlight></codeline>
  357. <codeline lineno="179"><highlight class="normal"><sp/><sp/><sp/><sp/>g_rr_last[nxt.prio]<sp/>=<sp/>(uint8_t)next;</highlight></codeline>
  358. <codeline lineno="180"><highlight class="normal"><sp/><sp/><sp/><sp/>g_cur[core]<sp/>=<sp/>(uint8_t)next;</highlight></codeline>
  359. <codeline lineno="181"><highlight class="normal"></highlight></codeline>
  360. <codeline lineno="182"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  361. <codeline lineno="183"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>nxt.sp;</highlight></codeline>
  362. <codeline lineno="184"><highlight class="normal">}</highlight></codeline>
  363. <codeline lineno="185"><highlight class="normal"></highlight></codeline>
  364. <codeline lineno="186"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal"><ref refid="namespacetk_1_1detail" kindref="compound">tk::detail</ref><sp/>{</highlight></codeline>
  365. <codeline lineno="187"><highlight class="normal"></highlight></codeline>
  366. <codeline lineno="188"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1_1detail_1a447e4ec89b3f2748451891219b7e3738" kindref="member">static_register</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">char</highlight><highlight class="normal">*<sp/>name,<sp/><ref refid="namespacetk_1a8908cf1e54cdc4e14ac3003126722cfc" kindref="member">TaskFn</ref><sp/>fn,<sp/>uint32_t<sp/>prio)<sp/>{</highlight></codeline>
  367. <codeline lineno="189"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(prio<sp/>&gt;=<sp/>kIdlePrio)<sp/>prio<sp/>=<sp/>14u;</highlight></codeline>
  368. <codeline lineno="190"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>i<sp/>=<sp/>TK_NUM_CORES;<sp/>i<sp/>&lt;<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;<sp/>++i)<sp/>{</highlight></codeline>
  369. <codeline lineno="191"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_slots[i].state<sp/>==<sp/>State::Free)<sp/>{</highlight></codeline>
  370. <codeline lineno="192"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i]<sp/>=<sp/>TaskSlot{};</highlight></codeline>
  371. <codeline lineno="193"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].fn<sp/>=<sp/>fn;</highlight></codeline>
  372. <codeline lineno="194"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].name<sp/>=<sp/>name;</highlight></codeline>
  373. <codeline lineno="195"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].prio<sp/>=<sp/>prio;</highlight></codeline>
  374. <codeline lineno="196"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].state<sp/>=<sp/>State::Ready;</highlight></codeline>
  375. <codeline lineno="197"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal">;</highlight></codeline>
  376. <codeline lineno="198"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  377. <codeline lineno="199"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  378. <codeline lineno="200"><highlight class="normal">}</highlight></codeline>
  379. <codeline lineno="201"><highlight class="normal"></highlight></codeline>
  380. <codeline lineno="202"><highlight class="normal">}<sp/><sp/></highlight><highlight class="comment">//<sp/>namespace<sp/>tk::detail</highlight><highlight class="normal"></highlight></codeline>
  381. <codeline lineno="203"><highlight class="normal"></highlight></codeline>
  382. <codeline lineno="204"><highlight class="normal"><ref refid="structtk_1_1_task_handle" kindref="compound">tk::TaskHandle</ref><sp/><ref refid="namespacetk_1a6e721332f5a7d85998345ed218de7394" kindref="member">tk::create</ref>(TaskFn<sp/>fn,<sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*<sp/>arg,<sp/>uint32_t<sp/>prio)<sp/>{</highlight></codeline>
  383. <codeline lineno="205"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskHandle<sp/>h{0xFF};</highlight></codeline>
  384. <codeline lineno="206"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(prio<sp/>&gt;=<sp/>kIdlePrio)<sp/>prio<sp/>=<sp/>14u;</highlight></codeline>
  385. <codeline lineno="207"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>i<sp/>=<sp/>TK_NUM_CORES;<sp/>i<sp/>&lt;<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;<sp/>++i)<sp/>{</highlight></codeline>
  386. <codeline lineno="208"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_slots[i].state<sp/>==<sp/>State::Free)<sp/>{</highlight></codeline>
  387. <codeline lineno="209"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i]<sp/>=<sp/>TaskSlot{};</highlight></codeline>
  388. <codeline lineno="210"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].fn<sp/>=<sp/>fn;</highlight></codeline>
  389. <codeline lineno="211"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].arg<sp/>=<sp/>arg;</highlight></codeline>
  390. <codeline lineno="212"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].name<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;dyn&quot;</highlight><highlight class="normal">;</highlight></codeline>
  391. <codeline lineno="213"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].prio<sp/>=<sp/>prio;</highlight></codeline>
  392. <codeline lineno="214"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>g_slots[i].state<sp/>=<sp/>State::Ready;</highlight></codeline>
  393. <codeline lineno="215"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>h.slot<sp/>=<sp/>(uint8_t)i;</highlight></codeline>
  394. <codeline lineno="216"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>h;</highlight></codeline>
  395. <codeline lineno="217"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  396. <codeline lineno="218"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  397. <codeline lineno="219"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>h;</highlight></codeline>
  398. <codeline lineno="220"><highlight class="normal">}</highlight></codeline>
  399. <codeline lineno="221"><highlight class="normal"></highlight></codeline>
  400. <codeline lineno="222"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>core_start_routine(uint32_t<sp/>core)<sp/>{</highlight></codeline>
  401. <codeline lineno="223"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="port__m33_8c_1ac9d435a65b90e71074dd44f97b1103f8" kindref="member">tk_port_init</ref>(<ref refid="kernel_8hpp_1a5c791131c5ad22ed87a8d3ca2cd57d33" kindref="member">TK_TICKS_PER_SEC</ref>);</highlight></codeline>
  402. <codeline lineno="224"><highlight class="normal"></highlight></codeline>
  403. <codeline lineno="225"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  404. <codeline lineno="226"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>next<sp/>=<sp/>select_next(core);</highlight></codeline>
  405. <codeline lineno="227"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>nxt<sp/>=<sp/>g_slots[next];</highlight></codeline>
  406. <codeline lineno="228"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(nxt.sp<sp/>==<sp/>0)<sp/>{</highlight></codeline>
  407. <codeline lineno="229"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>nxt.sp<sp/>=<sp/><ref refid="port__m33_8h_1a57df28e1d96b701ef5b9713cae179462" kindref="member">tk_port_make_frame</ref>(</highlight><highlight class="keyword">reinterpret_cast&lt;</highlight><highlight class="normal">uint8_t*</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(&amp;g_stacks[next][0]),</highlight></codeline>
  408. <codeline lineno="230"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="kernel_8hpp_1afde197f9493ef5bdb5b715ce8b52148d" kindref="member">TK_DEFAULT_STACK_SIZE</ref>,<sp/></highlight><highlight class="keyword">reinterpret_cast&lt;</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">*</highlight><highlight class="keyword">&gt;</highlight><highlight class="normal">(nxt.fn),<sp/>nxt.arg);</highlight></codeline>
  409. <codeline lineno="231"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  410. <codeline lineno="232"><highlight class="normal"><sp/><sp/><sp/><sp/>nxt.state<sp/>=<sp/>State::Running;</highlight></codeline>
  411. <codeline lineno="233"><highlight class="normal"><sp/><sp/><sp/><sp/>memcpy(&amp;<ref refid="scheduler_8cpp_1ad7a9acf1577e1fc4ff193d79edf9e254" kindref="member">tk_fpu_scratch</ref>[core],<sp/>&amp;nxt.fpu,<sp/></highlight><highlight class="keyword">sizeof</highlight><highlight class="normal">(nxt.fpu));</highlight></codeline>
  412. <codeline lineno="234"><highlight class="normal"><sp/><sp/><sp/><sp/>nxt.slice_left<sp/>=<sp/>kSliceTicks;</highlight></codeline>
  413. <codeline lineno="235"><highlight class="normal"><sp/><sp/><sp/><sp/>g_rr_last[nxt.prio]<sp/>=<sp/>(uint8_t)next;</highlight></codeline>
  414. <codeline lineno="236"><highlight class="normal"><sp/><sp/><sp/><sp/>g_cur[core]<sp/>=<sp/>(uint8_t)next;</highlight></codeline>
  415. <codeline lineno="237"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  416. <codeline lineno="238"><highlight class="normal"></highlight></codeline>
  417. <codeline lineno="239"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="port__m33_8h_1aaf06c4f2c498c86ed2c595d9bfe4caab" kindref="member">tk_port_start</ref>(nxt.sp);<sp/><sp/></highlight><highlight class="comment">//<sp/>never<sp/>returns</highlight><highlight class="normal"></highlight></codeline>
  418. <codeline lineno="240"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(;;)<sp/>__asm__<sp/></highlight><highlight class="keyword">volatile</highlight><highlight class="normal">(</highlight><highlight class="stringliteral">&quot;wfi&quot;</highlight><highlight class="normal">);</highlight></codeline>
  419. <codeline lineno="241"><highlight class="normal">}</highlight></codeline>
  420. <codeline lineno="242"><highlight class="normal"></highlight></codeline>
  421. <codeline lineno="243"><highlight class="normal"></highlight><highlight class="keyword">static</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/>core1_entry(</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">)<sp/>{</highlight></codeline>
  422. <codeline lineno="244"><highlight class="normal"><sp/><sp/><sp/><sp/>core_start_routine(1);</highlight></codeline>
  423. <codeline lineno="245"><highlight class="normal">}</highlight></codeline>
  424. <codeline lineno="246"><highlight class="normal"></highlight></codeline>
  425. <codeline lineno="247"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1a675f1829b87e2a43239b6f80a526d0ed" kindref="member">tk::start</ref>()<sp/>{</highlight></codeline>
  426. <codeline lineno="248"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_started)<sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(;;)<sp/>__asm__<sp/></highlight><highlight class="keyword">volatile</highlight><highlight class="normal">(</highlight><highlight class="stringliteral">&quot;wfi&quot;</highlight><highlight class="normal">);</highlight></codeline>
  427. <codeline lineno="249"><highlight class="normal"><sp/><sp/><sp/><sp/>g_started<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  428. <codeline lineno="250"><highlight class="normal"></highlight></codeline>
  429. <codeline lineno="251"><highlight class="normal"><sp/><sp/><sp/><sp/>ensure_sched_lock();</highlight></codeline>
  430. <codeline lineno="252"><highlight class="normal"></highlight></codeline>
  431. <codeline lineno="253"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Core<sp/>0<sp/>Idle<sp/>Task</highlight><highlight class="normal"></highlight></codeline>
  432. <codeline lineno="254"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>idle0<sp/>=<sp/>g_slots[0];</highlight></codeline>
  433. <codeline lineno="255"><highlight class="normal"><sp/><sp/><sp/><sp/>idle0.fn<sp/>=<sp/>idle_fn;</highlight></codeline>
  434. <codeline lineno="256"><highlight class="normal"><sp/><sp/><sp/><sp/>idle0.name<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;idle0&quot;</highlight><highlight class="normal">;</highlight></codeline>
  435. <codeline lineno="257"><highlight class="normal"><sp/><sp/><sp/><sp/>idle0.prio<sp/>=<sp/>kIdlePrio;</highlight></codeline>
  436. <codeline lineno="258"><highlight class="normal"><sp/><sp/><sp/><sp/>idle0.is_idle<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  437. <codeline lineno="259"><highlight class="normal"><sp/><sp/><sp/><sp/>idle0.state<sp/>=<sp/>State::Ready;</highlight></codeline>
  438. <codeline lineno="260"><highlight class="normal"></highlight></codeline>
  439. <codeline lineno="261"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Core<sp/>1<sp/>Idle<sp/>Task</highlight><highlight class="normal"></highlight></codeline>
  440. <codeline lineno="262"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>idle1<sp/>=<sp/>g_slots[1];</highlight></codeline>
  441. <codeline lineno="263"><highlight class="normal"><sp/><sp/><sp/><sp/>idle1.fn<sp/>=<sp/>idle_fn;</highlight></codeline>
  442. <codeline lineno="264"><highlight class="normal"><sp/><sp/><sp/><sp/>idle1.name<sp/>=<sp/></highlight><highlight class="stringliteral">&quot;idle1&quot;</highlight><highlight class="normal">;</highlight></codeline>
  443. <codeline lineno="265"><highlight class="normal"><sp/><sp/><sp/><sp/>idle1.prio<sp/>=<sp/>kIdlePrio;</highlight></codeline>
  444. <codeline lineno="266"><highlight class="normal"><sp/><sp/><sp/><sp/>idle1.is_idle<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  445. <codeline lineno="267"><highlight class="normal"><sp/><sp/><sp/><sp/>idle1.state<sp/>=<sp/>State::Ready;</highlight></codeline>
  446. <codeline lineno="268"><highlight class="normal"></highlight></codeline>
  447. <codeline lineno="269"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Launch<sp/>Core<sp/>1</highlight><highlight class="normal"></highlight></codeline>
  448. <codeline lineno="270"><highlight class="normal"><sp/><sp/><sp/><sp/>multicore_launch_core1(core1_entry);</highlight></codeline>
  449. <codeline lineno="271"><highlight class="normal"></highlight></codeline>
  450. <codeline lineno="272"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>Launch<sp/>Core<sp/>0</highlight><highlight class="normal"></highlight></codeline>
  451. <codeline lineno="273"><highlight class="normal"><sp/><sp/><sp/><sp/>core_start_routine(0);</highlight></codeline>
  452. <codeline lineno="274"><highlight class="normal">}</highlight></codeline>
  453. <codeline lineno="275"><highlight class="normal"></highlight></codeline>
  454. <codeline lineno="276"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1a8081956b0a19b87d5b7c81b772373397" kindref="member">tk::yield</ref>()<sp/>{</highlight></codeline>
  455. <codeline lineno="277"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  456. <codeline lineno="278"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  457. <codeline lineno="279"><highlight class="normal"><sp/><sp/><sp/><sp/>g_slots[g_cur[core]].slice_left<sp/>=<sp/>0;</highlight></codeline>
  458. <codeline lineno="280"><highlight class="normal"><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  459. <codeline lineno="281"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  460. <codeline lineno="282"><highlight class="normal">}</highlight></codeline>
  461. <codeline lineno="283"><highlight class="normal"></highlight></codeline>
  462. <codeline lineno="284"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1aae83f84121085578a7568437a8dc2447" kindref="member">tk::sleep_ms</ref>(uint32_t<sp/>ms)<sp/>{</highlight></codeline>
  463. <codeline lineno="285"><highlight class="normal"><sp/><sp/><sp/><sp/>uint64_t<sp/>ticks<sp/>=<sp/>((uint64_t)ms<sp/>*<sp/><ref refid="kernel_8hpp_1a5c791131c5ad22ed87a8d3ca2cd57d33" kindref="member">TK_TICKS_PER_SEC</ref><sp/>+<sp/>999u)<sp/>/<sp/>1000u;</highlight></codeline>
  464. <codeline lineno="286"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(ticks<sp/>&lt;<sp/>1u)<sp/>ticks<sp/>=<sp/>1u;</highlight></codeline>
  465. <codeline lineno="287"><highlight class="normal"><sp/><sp/><sp/><sp/>int32_t<sp/>sleep_ticks<sp/>=<sp/>(int32_t)(ticks<sp/>&gt;<sp/>0x7FFFFFFFu<sp/>?<sp/>0x7FFFFFFFu<sp/>:<sp/>ticks);</highlight></codeline>
  466. <codeline lineno="288"><highlight class="normal"></highlight></codeline>
  467. <codeline lineno="289"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  468. <codeline lineno="290"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  469. <codeline lineno="291"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>cur<sp/>=<sp/>g_slots[g_cur[core]];</highlight></codeline>
  470. <codeline lineno="292"><highlight class="normal"><sp/><sp/><sp/><sp/>cur.state<sp/>=<sp/>State::Sleeping;</highlight></codeline>
  471. <codeline lineno="293"><highlight class="normal"><sp/><sp/><sp/><sp/>cur.wake_tick<sp/>=<sp/>g_tick<sp/>+<sp/>sleep_ticks;</highlight></codeline>
  472. <codeline lineno="294"><highlight class="normal"><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  473. <codeline lineno="295"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  474. <codeline lineno="296"><highlight class="normal">}</highlight></codeline>
  475. <codeline lineno="297"><highlight class="normal"></highlight></codeline>
  476. <codeline lineno="298"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1aba50cfc62cb8be71cf96df7f495a7a3d" kindref="member">tk::exit</ref>(</highlight><highlight class="keywordtype">int</highlight><highlight class="normal"><sp/>code)<sp/>{</highlight></codeline>
  477. <codeline lineno="299"><highlight class="normal"><sp/><sp/><sp/><sp/>(void)code;</highlight></codeline>
  478. <codeline lineno="300"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  479. <codeline lineno="301"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  480. <codeline lineno="302"><highlight class="normal"><sp/><sp/><sp/><sp/>g_slots[g_cur[core]].state<sp/>=<sp/>State::Terminated;</highlight></codeline>
  481. <codeline lineno="303"><highlight class="normal"><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  482. <codeline lineno="304"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  483. <codeline lineno="305"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(;;)<sp/>__asm__<sp/></highlight><highlight class="keyword">volatile</highlight><highlight class="normal">(</highlight><highlight class="stringliteral">&quot;wfi&quot;</highlight><highlight class="normal">);</highlight></codeline>
  484. <codeline lineno="306"><highlight class="normal">}</highlight></codeline>
  485. <codeline lineno="307"><highlight class="normal"></highlight></codeline>
  486. <codeline lineno="308"><highlight class="normal"></highlight><highlight class="keyword">extern</highlight><highlight class="normal"><sp/></highlight><highlight class="stringliteral">&quot;C&quot;</highlight><highlight class="normal"><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="scheduler_8cpp_1ad29ac857f58c5bf7c0220403c6624f32" kindref="member">tk_task_return_trampoline</ref>(</highlight><highlight class="keywordtype">void</highlight><highlight class="normal">)<sp/>{</highlight></codeline>
  487. <codeline lineno="309"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1aba50cfc62cb8be71cf96df7f495a7a3d" kindref="member">tk::exit</ref>(0);</highlight></codeline>
  488. <codeline lineno="310"><highlight class="normal">}</highlight></codeline>
  489. <codeline lineno="311"><highlight class="normal"></highlight></codeline>
  490. <codeline lineno="312"><highlight class="normal">uint64_t<sp/><ref refid="namespacetk_1a46e15375fba47cbd1a93278f17e77848" kindref="member">tk::now_ms</ref>()<sp/>{</highlight></codeline>
  491. <codeline lineno="313"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>(uint64_t)g_tick<sp/>*<sp/>1000u<sp/>/<sp/><ref refid="kernel_8hpp_1a5c791131c5ad22ed87a8d3ca2cd57d33" kindref="member">TK_TICKS_PER_SEC</ref>;</highlight></codeline>
  492. <codeline lineno="314"><highlight class="normal">}</highlight></codeline>
  493. <codeline lineno="315"><highlight class="normal"></highlight></codeline>
  494. <codeline lineno="316"><highlight class="normal"></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1a6540aa25eb8562f6d6c8b37977d6cfe8" kindref="member">tk::lock</ref>()<sp/>{</highlight></codeline>
  495. <codeline lineno="317"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  496. <codeline lineno="318"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>save<sp/>==<sp/>0;<sp/></highlight><highlight class="comment">//<sp/>PRIMASK<sp/>was<sp/>0<sp/>(enabled)</highlight><highlight class="normal"></highlight></codeline>
  497. <codeline lineno="319"><highlight class="normal">}</highlight></codeline>
  498. <codeline lineno="320"><highlight class="normal"></highlight></codeline>
  499. <codeline lineno="321"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1a752b12f6862815c94a52347af52578b7" kindref="member">tk::unlock</ref>(</highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>was_enabled)<sp/>{</highlight></codeline>
  500. <codeline lineno="322"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(was_enabled<sp/>?<sp/>0<sp/>:<sp/>1);</highlight></codeline>
  501. <codeline lineno="323"><highlight class="normal">}</highlight></codeline>
  502. <codeline lineno="324"><highlight class="normal"></highlight></codeline>
  503. <codeline lineno="325"><highlight class="normal">uint32_t<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">tk::detail::sched_lock</ref>()<sp/>{</highlight></codeline>
  504. <codeline lineno="326"><highlight class="normal"><sp/><sp/><sp/><sp/>return<sp/>::sched_lock();</highlight></codeline>
  505. <codeline lineno="327"><highlight class="normal">}</highlight></codeline>
  506. <codeline lineno="328"><highlight class="normal"></highlight></codeline>
  507. <codeline lineno="329"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">tk::detail::sched_unlock</ref>(uint32_t<sp/>save)<sp/>{</highlight></codeline>
  508. <codeline lineno="330"><highlight class="normal"><sp/><sp/><sp/><sp/>::sched_unlock(save);</highlight></codeline>
  509. <codeline lineno="331"><highlight class="normal">}</highlight></codeline>
  510. <codeline lineno="332"><highlight class="normal"></highlight></codeline>
  511. <codeline lineno="333"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1_1detail_1a400363f36b5fb5dfc8aec11334471d0d" kindref="member">tk::detail::block_current_task_locked</ref>()<sp/>{</highlight></codeline>
  512. <codeline lineno="334"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  513. <codeline lineno="335"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>cur<sp/>=<sp/>g_slots[g_cur[core]];</highlight></codeline>
  514. <codeline lineno="336"><highlight class="normal"><sp/><sp/><sp/><sp/>cur.state<sp/>=<sp/>State::Blocked;</highlight></codeline>
  515. <codeline lineno="337"><highlight class="normal"><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  516. <codeline lineno="338"><highlight class="normal">}</highlight></codeline>
  517. <codeline lineno="339"><highlight class="normal"></highlight></codeline>
  518. <codeline lineno="340"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1_1detail_1ab19385598f18560cb574cc86174ececa" kindref="member">tk::detail::wake_task_locked</ref>(TaskHandle<sp/>handle)<sp/>{</highlight></codeline>
  519. <codeline lineno="341"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(handle.slot<sp/>&gt;=<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>)<sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal">;</highlight></codeline>
  520. <codeline lineno="342"><highlight class="normal"><sp/><sp/><sp/><sp/>TaskSlot&amp;<sp/>s<sp/>=<sp/>g_slots[handle.slot];</highlight></codeline>
  521. <codeline lineno="343"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(s.state<sp/>==<sp/>State::Blocked)<sp/>{</highlight></codeline>
  522. <codeline lineno="344"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>s.state<sp/>=<sp/>State::Ready;</highlight></codeline>
  523. <codeline lineno="345"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  524. <codeline lineno="346"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  525. <codeline lineno="347"><highlight class="normal">}</highlight></codeline>
  526. <codeline lineno="348"><highlight class="normal"></highlight></codeline>
  527. <codeline lineno="349"><highlight class="normal">uint8_t<sp/><ref refid="namespacetk_1_1detail_1a73a80d92a172d565201f99e8f31278e4" kindref="member">tk::detail::current_task_slot</ref>()<sp/>{</highlight></codeline>
  528. <codeline lineno="350"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>g_cur[get_core_num()];</highlight></codeline>
  529. <codeline lineno="351"><highlight class="normal">}</highlight></codeline>
  530. <codeline lineno="352"><highlight class="normal"></highlight></codeline>
  531. <codeline lineno="353"><highlight class="normal"></highlight><highlight class="keyword">static_assert</highlight><highlight class="normal">(<ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref><sp/>&lt;=<sp/></highlight><highlight class="keyword">sizeof</highlight><highlight class="normal">(<ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">tk::task_mask_t</ref>)<sp/>*<sp/>8,<sp/></highlight><highlight class="stringliteral">&quot;TK_MAX_TASKS<sp/>must<sp/>fit<sp/>in<sp/>task_mask_t&quot;</highlight><highlight class="normal">);</highlight></codeline>
  532. <codeline lineno="354"><highlight class="normal"></highlight></codeline>
  533. <codeline lineno="355"><highlight class="normal">uint8_t<sp/><ref refid="namespacetk_1_1detail_1a70ba35e0daee086ad86770f1e39c9b35" kindref="member">tk::detail::find_highest_prio_waiter</ref>(task_mask_t<sp/>wait_mask)<sp/>{</highlight></codeline>
  534. <codeline lineno="356"><highlight class="normal"><sp/><sp/><sp/><sp/>uint8_t<sp/>best_slot<sp/>=<sp/>0xFF;</highlight></codeline>
  535. <codeline lineno="357"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>best_prio<sp/>=<sp/>0xFFFFFFFFu;</highlight></codeline>
  536. <codeline lineno="358"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">for</highlight><highlight class="normal"><sp/>(uint32_t<sp/>i<sp/>=<sp/>0;<sp/>i<sp/>&lt;<sp/><ref refid="kernel_8hpp_1a22e1d9f532aa297014c125110226443c" kindref="member">TK_MAX_TASKS</ref>;<sp/>++i)<sp/>{</highlight></codeline>
  537. <codeline lineno="359"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(wait_mask<sp/>&amp;<sp/>(task_mask_t{1}<sp/>&lt;&lt;<sp/>i))<sp/>{</highlight></codeline>
  538. <codeline lineno="360"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_slots[i].prio<sp/>&lt;<sp/>best_prio)<sp/>{</highlight></codeline>
  539. <codeline lineno="361"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>best_prio<sp/>=<sp/>g_slots[i].prio;</highlight></codeline>
  540. <codeline lineno="362"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>best_slot<sp/>=<sp/>(uint8_t)i;</highlight></codeline>
  541. <codeline lineno="363"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  542. <codeline lineno="364"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  543. <codeline lineno="365"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  544. <codeline lineno="366"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>best_slot;</highlight></codeline>
  545. <codeline lineno="367"><highlight class="normal">}</highlight></codeline>
  546. <codeline lineno="368"><highlight class="normal"></highlight></codeline>
  547. <codeline lineno="369"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1a3254a7e2a9f5ed3abe44e8cf62a8dcfe" kindref="member">tk::preempt_disable</ref>()<sp/>{</highlight></codeline>
  548. <codeline lineno="370"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  549. <codeline lineno="371"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  550. <codeline lineno="372"><highlight class="normal"><sp/><sp/><sp/><sp/>++g_preempt_disabled[core];</highlight></codeline>
  551. <codeline lineno="373"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  552. <codeline lineno="374"><highlight class="normal">}</highlight></codeline>
  553. <codeline lineno="375"><highlight class="normal"></highlight></codeline>
  554. <codeline lineno="376"><highlight class="normal"></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="namespacetk_1a70e6ee5f456e67a24ce13ff0fd04e4d9" kindref="member">tk::preempt_enable</ref>()<sp/>{</highlight></codeline>
  555. <codeline lineno="377"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>core<sp/>=<sp/>get_core_num();</highlight></codeline>
  556. <codeline lineno="378"><highlight class="normal"><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">sched_lock</ref>();</highlight></codeline>
  557. <codeline lineno="379"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_preempt_disabled[core]<sp/>&gt;<sp/>0)<sp/>{</highlight></codeline>
  558. <codeline lineno="380"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>--g_preempt_disabled[core];</highlight></codeline>
  559. <codeline lineno="381"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(g_preempt_disabled[core]<sp/>==<sp/>0)<sp/>{</highlight></codeline>
  560. <codeline lineno="382"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>tk_port_trigger_pendsv();</highlight></codeline>
  561. <codeline lineno="383"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  562. <codeline lineno="384"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  563. <codeline lineno="385"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">sched_unlock</ref>(save);</highlight></codeline>
  564. <codeline lineno="386"><highlight class="normal">}</highlight></codeline>
  565. </programlisting>
  566. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp"/>
  567. </compounddef>
  568. </doxygen>