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関数を呼び出しているところももちろんあるんですけど、今回はそこまでは追及しないことにします。
今回は本当にざっとした流れを見ただけですが、次回以降はもう少し深堀りしたいとおもいます。
それでは!!