Rustタスクを追加する

Rustで定義した関数は適切な属性を付加することでC言語から呼び出せるようになります。ここではこれを利用してRustの関数を静的RTOSタスクのエントリポイントとして登録する方法を説明します。

  1. 次の関数をRustプロジェクトのソースファイルに追加します。

    #[no_mangle]
    extern "C" fn root_task(_: isize) {
        println!("Hello, world!");
    }
    

    Note

    #[no_mangle] 属性 [Rustリファレンス] はシンボル名のマングリングを無効化し、関数名をそのままシンボル名として使うようにします。

    extern "C" を指定することでこの関数がC言語と互換なABIでコード生成されるようにします。

    引数の _ はパターンの一種であるワイルドカードパターン [Rustリファレンス] で、引数の値を捨てることを意味します。

    println!標準出力にフォーマット済み文字列を出力する手続き型マクロです。


  1. この関数をエントリポイントとして、タスクの定義をカーネル設定ファイルに追加します。

    kernel_cfg.c
    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,
        /* ... */
    };
    
    kernel_cfg.h
    enum {
        /* ... */
        ROOT_TASK,
        /* ... */
    };
    

  1. 実行すると、タスクが出力したメッセージがログ出力先で見えるはずです。

../../_images/task-output1.png