Rustタスクを追加する
Rustで定義した関数は適切な属性を付加することでC言語から呼び出せるようになります。ここではこれを利用してRustの関数を静的RTOSタスクのエントリポイントとして登録する方法を説明します。
次の関数をRustプロジェクトのソースファイルに追加します。
#[no_mangle] extern "C" fn root_task(_: isize) { println!("Hello, world!"); }
Note
#[no_mangle]
属性 (Rustリファレンス) はシンボル名のマングリングを無効化し、関数名をそのままシンボル名として使うようにします。extern "C"
(Rustリファレンス) を指定することでこの関数がC言語と互換なABIでコード生成されるようにします。引数の
_
はパターンの一種であるワイルドカードパターン (Rustリファレンス) で、引数の値を捨てることを意味します。println!
(Rustリファレンス) は標準出力にフォーマット済み文字列を出力する手続き型マクロです。
この関数をエントリポイントとして、タスクの定義をカーネル設定ファイルに追加します。
extern void root_task(intptr_t exinf); const TINIB _kernel_tinib_table[] = { /* ... */ { TA_ACT, 0, root_task, INT_PRIORITY(5), ROUND_STK_T(65536), NULL}, /* ... */ }; const ID _kernel_torder_table[] = { /* ... */ ROOT_TASK, /* ... */ };
enum { /* ... */ ROOT_TASK, /* ... */ };
実行すると、タスクが出力したメッセージがログ出力先で見えるはずです。