tinykernel
Loading...
Searching...
No Matches
kernel.hpp
Go to the documentation of this file.
1// tinykernel: minimal preemptive task scheduler for RP2350 (Pico 2, Cortex-M33)
2#pragma once
3
4#include <stdint.h>
5#include <stddef.h>
6
7#include "pico/runtime.h" // PICO_RUNTIME_INIT_FUNC (static task registration)
8
10#ifndef TK_TICKS_PER_SEC
11#define TK_TICKS_PER_SEC 1000u
12#endif
13
15#ifndef TK_TIME_SLICE_MS
16#define TK_TIME_SLICE_MS 10u
17#endif
18
20#ifndef TK_MAX_TASKS
21#define TK_MAX_TASKS 32u
22#endif
23
25#ifndef TK_DEFAULT_STACK_SIZE
26#define TK_DEFAULT_STACK_SIZE (4 * 1024)
27#endif
28
29namespace tk {
30
32using TaskFn = void (*)(void* arg);
33
39enum Prio : uint32_t {
43 PRIO_LOW = 13,
44};
45
49struct TaskHandle {
50 uint8_t slot{0xFF};
51
53 bool is_valid() const { return slot != 0xFF; }
54};
55
66TaskHandle create(TaskFn fn, void* arg = nullptr, uint32_t prio = PRIO_NORMAL);
67
74void start();
75
81void yield();
82
91void sleep_ms(uint32_t ms);
92
99void exit(int code = 0);
100
106uint64_t now_ms();
107
115bool lock();
116
122void unlock(bool was_enabled);
123
132void preempt_disable();
133
141void preempt_enable();
142
164
165using task_mask_t = uint32_t;
166
167namespace detail {
168void static_register(const char* name, TaskFn fn, uint32_t prio);
169uint32_t sched_lock();
170void sched_unlock(uint32_t save);
172void wake_task_locked(TaskHandle handle);
173uint8_t current_task_slot();
174uint8_t find_highest_prio_waiter(task_mask_t wait_mask);
175} // namespace detail
176
177} // namespace tk
178
187#define TK_TASK(fn, prio) \
188 static void tk_register_##fn(void) { \
189 ::tk::detail::static_register(#fn, fn, (prio)); \
190 } \
191 PICO_RUNTIME_INIT_FUNC(tk_register_##fn, "ZZ900");
~PreemptGuard()
Definition kernel.hpp:159
PreemptGuard(const PreemptGuard &)=delete
PreemptGuard()
Definition kernel.hpp:158
PreemptGuard & operator=(const PreemptGuard &)=delete
Definition kernel.hpp:167
void block_current_task_locked()
Definition scheduler.cpp:333
void static_register(const char *name, TaskFn fn, uint32_t prio)
Definition scheduler.cpp:188
uint32_t sched_lock()
Definition scheduler.cpp:325
uint8_t find_highest_prio_waiter(task_mask_t wait_mask)
Definition scheduler.cpp:355
uint8_t current_task_slot()
Definition scheduler.cpp:349
void sched_unlock(uint32_t save)
Definition scheduler.cpp:329
void wake_task_locked(TaskHandle handle)
Definition scheduler.cpp:340
Definition actor.hpp:9
void preempt_disable()
自コアのタスクスイッチ (プリエンプション) を一時的に禁止します
Definition scheduler.cpp:369
Prio
タスクの優先度レベル
Definition kernel.hpp:39
@ PRIO_NORMAL
通常優先度 (デフォルト)
Definition kernel.hpp:42
@ PRIO_HIGH
高優先度
Definition kernel.hpp:41
@ PRIO_REALTIME
リアルタイム最優先
Definition kernel.hpp:40
@ PRIO_LOW
低優先度
Definition kernel.hpp:43
uint64_t now_ms()
システム起動時からの経過時間をミリ秒単位で取得します
Definition scheduler.cpp:312
bool lock()
ハードウェアスピンロックと全割り込み禁止によるクリティカルセクションに入ります
Definition scheduler.cpp:316
void start()
tinykernel スケジューラを起動します
Definition scheduler.cpp:247
TaskHandle create(TaskFn fn, void *arg=nullptr, uint32_t prio=PRIO_NORMAL)
タスクを生成・登録します
Definition scheduler.cpp:204
void preempt_enable()
自コアのタスクスイッチ (プリエンプション) を再開します
Definition scheduler.cpp:376
void unlock(bool was_enabled)
tk::lock() で入ったクリティカルセクションを抜けます
Definition scheduler.cpp:321
void yield()
現在実行中のタスクを一時中断し、同優先度の他のタスクへ CPU を譲渡します
Definition scheduler.cpp:276
void(*)(void *arg) TaskFn
Definition kernel.hpp:32
void sleep_ms(uint32_t ms)
現在のタスクを指定時間スリープさせます
Definition scheduler.cpp:284
void exit(int code=0)
現在のタスクを終了・破棄します
Definition scheduler.cpp:298
uint32_t task_mask_t
Definition kernel.hpp:165
タスクの識別ハンドル
Definition kernel.hpp:49
uint8_t slot
タスクスロット番号 (0xFF は無効/失敗)
Definition kernel.hpp:50
bool is_valid() const
Definition kernel.hpp:53