めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

Zig版ASP3カーネルの静的API

こんばんは、めのんです!

今週に入ってからずっとZig版のTOPPERS/ASP3カーネルを読んでいますが、今回は静的APIを見ていきたいと思います。

静的APIというのはコンパイル時に解決されるAPIで、C版ではコンフィギュレータで前処理を行ってCのコードを生成します。 Zig版はどうなっているのかな? と思っていたのですが、どうやら静的APIもZigのようです。

今回はざっとした流れを見ていくことにします。 個々の静的APIは次回以降に主だったものを見ていけたらと思います。

静的API関連の定義はどこにあるのか調べるために「CRE_TSK」で検索してみました。 結構な数が見つかったのですが、最初にするのはやはりそのものずばりのファイル名が付いたkernel/static_api.zigでしょうね。

kernel/static_api.zigの中に次のような定義が見つかりました。 かなり長いのでかいつまんで引用することにします。

pub const CfgData = struct {
    // 各オブジェクトのコンフィギュレーションデータ
    tsk_list: LIST(T_TSK) = LIST(T_TSK){},
    
    (中略)
    
    // タスクの生成
    pub fn CRE_TSK(comptime p_self: *CfgData, comptime tsk_name: []const u8,
                   comptime ctsk: T_CTSK) void {
        comptime var p_tsk = addItem(T_TSK, &p_self.tsk_list);
        p_tsk.name = tsk_name;
        p_tsk.inib = comptime task.cre_tsk(ctsk)
            catch |err| reportError("CRE_TSK", err);
    }

    (以下略)

この静的APIを使っているところはどこかな? と検索してみると、sample/sample1_cfg.zigが見つかりました。

fn configuration(comptime cfg: *CfgData) void {
    tecs.configuration(cfg);
    cfg.CRE_TSK("TASK1", CTSK(TA_NULL, 1, task, MID_PRIORITY,
                              STACK_SIZE, null));

    (以下略)

そしてこのconfiguration関数はkernel/kernel_cfg.zigで定義されているgenConfig関数から呼び出されています。

‘‘‘ fn genConfig(comptime configuration: fn(*CfgData) void) type { @setEvalBranchQuota(10000); comptime var cfg = CfgData{}; configuration(&cfg); return GenCfgData(&cfg); } ‘‘‘

このgenConfig関数を呼び出しているところももちろんあるんですけど、今回はそこまでは追及しないことにします。

今回は本当にざっとした流れを見ただけですが、次回以降はもう少し深堀りしたいとおもいます。

それでは!!