tinykernel
読み取り中…
検索中…
一致する文字列を見つけられません
tk 名前空間

名前空間

namespace  detail

クラス

class  Actor
 メッセージ駆動型タスク (アクター) の基底クラス [詳解]
class  EventHub
 メッセージ型ごとの超軽量 Pub/Sub ディスパッチャ [詳解]
class  LockGuard
 ミューテックスのロックをスコープ単位で安全に管理する RAII クラス (std::lock_guard 相当) [詳解]
struct  Message
 デフォルトの軽量メッセージ構造体 [詳解]
class  Mutex
 所有権・優先度順ウェイクアップ・RAII 対応のミューテックス (排他ロック) [詳解]
class  PreemptGuard
 プリエンプション禁止をスコープ単位で安全に管理する RAII クラス [詳解]
class  Semaphore
 計数セマフォ (Counting Semaphore) / バイナリセマフォ [詳解]
struct  TaskHandle
 タスクの識別ハンドル [詳解]

型定義

using TaskFn = void (*)(void* arg)
using task_mask_t = uint32_t
using BinarySemaphore = Semaphore
 バイナリセマフォ (初期値1, 最大1) の型エイリアス

列挙型

enum  Prio : uint32_t { PRIO_REALTIME = 1 , PRIO_HIGH = 5 , PRIO_NORMAL = 9 , PRIO_LOW = 13 }
 タスクの優先度レベル [詳解]

関数

template<typename MsgType>
size_t publish (const MsgType &msg)
 メッセージの型を指定して、購読しているすべての Actor へ同報配信します
size_t publish (uint32_t id, uintptr_t arg=0)
 tk::Message 型の同報配信ショートカット
TaskHandle create (TaskFn fn, void *arg=nullptr, uint32_t prio=PRIO_NORMAL)
 タスクを生成・登録します
void start ()
 tinykernel スケジューラを起動します
void yield ()
 現在実行中のタスクを一時中断し、同優先度の他のタスクへ CPU を譲渡します
void sleep_ms (uint32_t ms)
 現在のタスクを指定時間スリープさせます
void exit (int code=0)
 現在のタスクを終了・破棄します
uint64_t now_ms ()
 システム起動時からの経過時間をミリ秒単位で取得します
bool lock ()
 ハードウェアスピンロックと全割り込み禁止によるクリティカルセクションに入ります
void unlock (bool was_enabled)
 tk::lock() で入ったクリティカルセクションを抜けます
void preempt_disable ()
 自コアのタスクスイッチ (プリエンプション) を一時的に禁止します
void preempt_enable ()
 自コアのタスクスイッチ (プリエンプション) を再開します

型定義詳解

◆ BinarySemaphore

バイナリセマフォ (初期値1, 最大1) の型エイリアス

◆ task_mask_t

using tk::task_mask_t = uint32_t

◆ TaskFn

using tk::TaskFn = void (*)(void* arg)

タスク関数のシグネチャ (void func(void* arg))

列挙型詳解

◆ Prio

enum tk::Prio : uint32_t

タスクの優先度レベル

数値が小さいほど高優先度です。0..15 の範囲で指定します (15 はアイドルタスク専用)。

列挙値
PRIO_REALTIME 

リアルタイム最優先

PRIO_HIGH 

高優先度

PRIO_NORMAL 

通常優先度 (デフォルト)

PRIO_LOW 

低優先度

関数詳解

◆ create()

tk::TaskHandle tk::create ( TaskFn fn,
void * arg = nullptr,
uint32_t prio = PRIO_NORMAL )

タスクを生成・登録します

tk::start() を呼び出す前に登録する必要があります。

引数
fnタスク関数ポインタ (void (*)(void* arg))
argタスク関数に渡すユーザー引数ポインタ (省略時: nullptr)
prioタスクの優先度 (省略時: tk::PRIO_NORMAL)
戻り値
TaskHandle 生成されたタスクのハンドル。登録失敗時は is_valid() が false

◆ exit()

void tk::exit ( int code = 0)

現在のタスクを終了・破棄します

引数
code終了コード (予約用、省略時: 0)
覚え書き
タスク関数の末尾に到達した場合は自動的に呼ばれます。

◆ lock()

bool tk::lock ( )

ハードウェアスピンロックと全割り込み禁止によるクリティカルセクションに入ります

戻り値
true 呼び出し前の割り込みが有効だった場合
false 呼び出し前の割り込みが無効だった場合
警告
長時間のロックは避けてください。数マイクロ秒以内のレジスタ操作等に使用します。

◆ now_ms()

uint64_t tk::now_ms ( )

システム起動時からの経過時間をミリ秒単位で取得します

戻り値
uint64_t 経過ミリ秒数 (分解能: 1 / TK_TICKS_PER_SEC 秒)

◆ preempt_disable()

void tk::preempt_disable ( )

自コアのタスクスイッチ (プリエンプション) を一時的に禁止します

割り込み (SysTick やタイマー、NVIC) は停止しないため、通信クロックや時刻更新を 阻害することなく、自タスクの処理をアトミックに実行できます。ネスト (入れ子) 呼び出しに対応しています。

参照
tk::PreemptGuard, tk::preempt_enable()

◆ preempt_enable()

void tk::preempt_enable ( )

自コアのタスクスイッチ (プリエンプション) を再開します

ネストカウンタが 0 に戻った時点で、保留されていたタスクスイッチが即座に実行されます。

参照
tk::PreemptGuard, tk::preempt_disable()

◆ publish() [1/2]

template<typename MsgType>
size_t tk::publish ( const MsgType & msg)
inline

メッセージの型を指定して、購読しているすべての Actor へ同報配信します

送信側は Actor のインスタンスや名前を知る必要がありません (完全疎結合)。 メッセージの実体は各 Actor のキューへ値コピーされるため、スタック上のローカル変数でも安全に渡せます。

テンプレート引数
MsgType配信するメッセージ型
引数
msg送信するメッセージ
戻り値
size_t 配信に成功した Actor の数
MyEvent ev{1, "Button Pressed"};
tk::publish(ev); // MyEvent を受け付けるすべての Actor に届く
size_t publish(const MsgType &msg)
メッセージの型を指定して、購読しているすべての Actor へ同報配信します
定義 actor.hpp:135

◆ publish() [2/2]

size_t tk::publish ( uint32_t id,
uintptr_t arg = 0 )
inline

tk::Message 型の同報配信ショートカット

引数
idメッセージID
arg引数 (省略時: 0)
戻り値
size_t 配信に成功した Actor の数

◆ sleep_ms()

void tk::sleep_ms ( uint32_t ms)

現在のタスクを指定時間スリープさせます

スリープ中はタスクが休止状態になり、CPU は他のタスクへ自動的に割り当てられます (CPU消費ゼロ)。

引数
msスリープする時間 (ミリ秒)
覚え書き
タスクコンテキスト内から呼び出す必要があります。

◆ start()

void tk::start ( )

tinykernel スケジューラを起動します

Core 0 のスケジューラを開始し、Core 1 を自動ブートしてデュアルコア並行実行を開始します。 この関数から制御が戻ることはありません (Never returns)。

◆ unlock()

void tk::unlock ( bool was_enabled)

tk::lock() で入ったクリティカルセクションを抜けます

引数
was_enabledtk::lock() の戻り値

◆ yield()

void tk::yield ( )

現在実行中のタスクを一時中断し、同優先度の他のタスクへ CPU を譲渡します

覚え書き
タスクコンテキスト内から呼び出す必要があります。