---
title: C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/kernel.hpp
---
# C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/kernel.hpp
## Namespaces
| Name |
| -------------- |
| **[tk](Namespaces/namespacetk.md)** |
| **[tk::detail](Namespaces/namespacetk_1_1detail.md)** |
## Classes
| | Name |
| -------------- | -------------- |
| struct | **[tk::TaskHandle](Classes/structtk_1_1_task_handle.md)**
タスクの識別ハンドル |
| class | **[tk::PreemptGuard](Classes/classtk_1_1_preempt_guard.md)**
プリエンプション禁止をスコープ単位で安全に管理する RAII クラス |
## Defines
| | Name |
| -------------- | -------------- |
| | **[TK_TICKS_PER_SEC](Files/kernel_8hpp.md#define-tk-ticks-per-sec)** |
| | **[TK_TIME_SLICE_MS](Files/kernel_8hpp.md#define-tk-time-slice-ms)** |
| | **[TK_MAX_TASKS](Files/kernel_8hpp.md#define-tk-max-tasks)** |
| | **[TK_DEFAULT_STACK_SIZE](Files/kernel_8hpp.md#define-tk-default-stack-size)** |
| | **[TK_TASK](Files/kernel_8hpp.md#define-tk-task)**(fn, prio)
リンク時にタスクを自動登録するマクロ (静的タスク登録) |
## Macros Documentation
### define TK_TICKS_PER_SEC
```cpp
#define TK_TICKS_PER_SEC 1000u
```
1秒あたりのタイマースケジューラtick数 (Hz)
### define TK_TIME_SLICE_MS
```cpp
#define TK_TIME_SLICE_MS 10u
```
同一優先度タスク間のタイムスライス時間 (ミリ秒)
### define TK_MAX_TASKS
```cpp
#define TK_MAX_TASKS 32u
```
最大タスク数 (スロット0はCore0アイドル、スロット1はCore1アイドル専用)
### define TK_DEFAULT_STACK_SIZE
```cpp
#define TK_DEFAULT_STACK_SIZE (4 * 1024)
```
1タスクあたりのスタックサイズ (バイト)
### define TK_TASK
```cpp
#define 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");
```
リンク時にタスクを自動登録するマクロ (静的タスク登録)
**Parameters**:
* **fn** タスク関数名 (void fn(void* arg))
* **prio** タスク優先度 (例: [tk::PRIO_NORMAL](Namespaces/namespacetk.md#enumvalue-prio-normal))
main() の開始前に Pico SDK のランタイムイニシャライザを利用してタスクを登録します。
## Source code
```cpp
// tinykernel: minimal preemptive task scheduler for RP2350 (Pico 2, Cortex-M33)
#pragma once
#include
#include
#include "pico/runtime.h" // PICO_RUNTIME_INIT_FUNC (static task registration)
#ifndef TK_TICKS_PER_SEC
#define TK_TICKS_PER_SEC 1000u
#endif
#ifndef TK_TIME_SLICE_MS
#define TK_TIME_SLICE_MS 10u
#endif
#ifndef TK_MAX_TASKS
#define TK_MAX_TASKS 32u
#endif
#ifndef TK_DEFAULT_STACK_SIZE
#define TK_DEFAULT_STACK_SIZE (4 * 1024)
#endif
namespace tk {
using TaskFn = void (*)(void* arg);
enum Prio : uint32_t {
PRIO_REALTIME = 1,
PRIO_HIGH = 5,
PRIO_NORMAL = 9,
PRIO_LOW = 13,
};
struct TaskHandle {
uint8_t slot{0xFF};
bool is_valid() const { return slot != 0xFF; }
};
TaskHandle create(TaskFn fn, void* arg = nullptr, uint32_t prio = PRIO_NORMAL);
void start();
void yield();
void sleep_ms(uint32_t ms);
void exit(int code = 0);
uint64_t now_ms();
bool lock();
void unlock(bool was_enabled);
void preempt_disable();
void preempt_enable();
class PreemptGuard {
public:
PreemptGuard() { preempt_disable(); }
~PreemptGuard() { preempt_enable(); }
PreemptGuard(const PreemptGuard&) = delete;
PreemptGuard& operator=(const PreemptGuard&) = delete;
};
using task_mask_t = uint32_t;
namespace detail {
void static_register(const char* name, TaskFn fn, uint32_t prio);
uint32_t sched_lock();
void sched_unlock(uint32_t save);
void block_current_task_locked();
void wake_task_locked(TaskHandle handle);
uint8_t current_task_slot();
uint8_t find_highest_prio_waiter(task_mask_t wait_mask);
} // namespace detail
} // namespace tk
#define 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");
```
-------------------------------
Updated on 2026-10-02 at 14:01:32 +0900