kernel.hpp stdint.h stddef.h pico/runtime.h C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/actor.hpp C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/sync.hpp C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/src/scheduler.cpp tk::TaskHandle tk::PreemptGuard tk tk::detail TK_TICKS_PER_SEC 1000u 1秒あたりのタイマースケジューラtick数 (Hz) TK_TIME_SLICE_MS 10u 同一優先度タスク間のタイムスライス時間 (ミリ秒) TK_MAX_TASKS 32u 最大タスク数 (スロット0はCore0アイドル、スロット1はCore1アイドル専用) TK_DEFAULT_STACK_SIZE (4 * 1024) 1タスクあたりのスタックサイズ (バイト) TK_TASK fn prio static void tk_register_##fn(void) { \ ::tk::detail::static_register(#fn, fn, (prio)); \ } \ PICO_RUNTIME_INIT_FUNC(tk_register_##fn, "ZZ900"); リンク時にタスクを自動登録するマクロ (静的タスク登録) main() の開始前に Pico SDK のランタイムイニシャライザを利用してタスクを登録します。 fn タスク関数名 (void fn(void* arg)) prio タスク優先度 (例: tk::PRIO_NORMAL) //tinykernel:minimalpreemptivetaskschedulerforRP2350(Pico2,Cortex-M33) #pragmaonce #include<stdint.h> #include<stddef.h> #include"pico/runtime.h"//PICO_RUNTIME_INIT_FUNC(statictaskregistration) #ifndefTK_TICKS_PER_SEC #defineTK_TICKS_PER_SEC1000u #endif #ifndefTK_TIME_SLICE_MS #defineTK_TIME_SLICE_MS10u #endif #ifndefTK_MAX_TASKS #defineTK_MAX_TASKS32u #endif #ifndefTK_DEFAULT_STACK_SIZE #defineTK_DEFAULT_STACK_SIZE(4*1024) #endif namespacetk{ usingTaskFn=void(*)(void*arg); enumPrio:uint32_t{ PRIO_REALTIME=1, PRIO_HIGH=5, PRIO_NORMAL=9, PRIO_LOW=13, }; structTaskHandle{ uint8_tslot{0xFF}; boolis_valid()const{returnslot!=0xFF;} }; TaskHandlecreate(TaskFnfn,void*arg=nullptr,uint32_tprio=PRIO_NORMAL); voidstart(); voidyield(); voidsleep_ms(uint32_tms); voidexit(intcode=0); uint64_tnow_ms(); boollock(); voidunlock(boolwas_enabled); voidpreempt_disable(); voidpreempt_enable(); classPreemptGuard{ public: PreemptGuard(){preempt_disable();} ~PreemptGuard(){preempt_enable();} PreemptGuard(constPreemptGuard&)=delete; PreemptGuard&operator=(constPreemptGuard&)=delete; }; usingtask_mask_t=uint32_t; namespacedetail{ voidstatic_register(constchar*name,TaskFnfn,uint32_tprio); uint32_tsched_lock(); voidsched_unlock(uint32_tsave); voidblock_current_task_locked(); voidwake_task_locked(TaskHandlehandle); uint8_tcurrent_task_slot(); uint8_tfind_highest_prio_waiter(task_mask_twait_mask); }//namespacedetail }//namespacetk #defineTK_TASK(fn,prio)\ staticvoidtk_register_##fn(void){\ ::tk::detail::static_register(#fn,fn,(prio));\ }\ PICO_RUNTIME_INIT_FUNC(tk_register_##fn,"ZZ900");