asp3_in_zig icon indicating copy to clipboard operation
asp3_in_zig copied to clipboard

TOPPERS/ASP3 Kernel written in Zig Programming Language

Results 14 asp3_in_zig issues
Sort by recently updated
recently updated
newest added

2021/10/20現在、 https://ziglang.org/download/ から入手できるzig 0.9.0-dev系の以下の最新版のzigでWIn10 WSL2のdebian上でmakeを実行すると、 Compiler Errorが発生します。 Zig7.1、 Zig8.0、Zig 8.1では発生しませんでした。 https://ziglang.org/builds/zig-linux-x86_64-0.9.0-dev.1433+4a76523b9.tar.xz エラーメッセージは以下の通りです。 $ make ruby ../tecsgen/tecsgen.rb ../sample/sample1.cdl -R -I. -I../include -I../target/ct11march/arm_gcc/common -I../arch/gcc -I.. -I../sample -I./gen -I../tecs_kernel --cpp "arm--D__TARGET_ARCH_ARM=6 -DTOPPERS_USE_QEMU -I....

コードサイズが大きい理由は,積極的にインライン展開を行うことなので,インライン展開を抑止したバージョンを optimize_size ブランチに作成した。これにより,ReleaseFastの場合のコードサイズは,gccで-O2の時とほぼ同等になったが,ReleaseSmallの場合のsample1のコードサイズは,gccで-Osの場合と比べて約3KB(約10%)大きい。サンプル調査した関数のサイズは,gccよりもむしろ小さいので,コードサイズを大きくしている原因が他にも何かあると思われる。他の原因で分析済みのものは以下の通り。 - ext_tskが2回リンクされていた(c_api.ext_tsk と task_term.ext_tsk)。2回リンクしないようにコードを修正済み。 - エラーコードを,Zigのエラー型から,C言語APIでの値に変換するためのオーバヘッド(itronErrorCode自身およびそれを呼び出すためのオーバヘッド)がある。Zigのエラー型の数値を符号だけ変えてリターンするようにしたところ,280バイト小さくなった(用いたコードをコメントとして残してある)。

tecsgenが生成するコンフィギュレーションファイル(tecsgen.cfg)を,cfg/genTecsCfg.rbによりZigによる記述に変換しているが,周期通知とアラーム通知を生成するための記述の変換に2つの制限がある。 - 拡張情報に渡すポインタを,[Zigの不具合](https://github.com/ziglang/zig/issues/5344)回避のためにimportSymbolを使って取り込む必要があるが,そのための記述を機械的な変換では生成できない。 - タイムイベントハンドラへのポインタを,[Zigの不具合](https://github.com/ziglang/zig/issues/4124)回避のために`&`を外して取り込む必要があるが,そのための記述を機械的な変換では生成できない。tecsgenのプラグインを変更して回避する方法はある。 そのため,tSample2は,そのままでは動作しない。動作させるためには,genに生成されるtecsgen_cfg.zigを,[tecsgen_cfg.zig.gz](https://github.com/toppers/asp3_in_zig/files/5079720/tecsgen_cfg.zig.gz)を展開したものに置き換える必要がある。

limitation
waiting

Zigにサイズが不明の配列を外部参照できないという制限(https://github.com/ziglang/zig/issues/4831 )があるため,それを回避するコードにしている。例えば,以下のコード。 ``` /// TCBのエリア // Zigの制限事項の回避:十分に大きいサイズの配列とする pub extern var _kernel_tcb_table: [1000]TCB; ```

waiting

Zigでは,サイズが0の配列は,定義できるがアクセスできないという制限(https://github.com/ziglang/zig/issues/5515 )があるため,それを回避するコードにしている。例えば,以下のコード。 ``` // Zigの制限の回避:BIND_CFG != nullの場合に,サイズ0の配列が // 出ないようにする pub export var _kernel_semcb_table: [if (option.BIND_CFG == null or tnum_sem > 0) tnum_sem else 1]SEMCB = undefined; ```

waiting

Zigにcomptimeが2回評価されるという不具合(https://github.com/ziglang/zig/issues/5380 )があるため,それを回避するために,`genConfig`にダミーのパラメータを渡している。 ``` // genConfigにvoid型のパラメータを渡すのは,Zigコンパイラの不具合の回 // 避のため(これがないと,genConfigが2回実行される). pub fn genConfig(comptime dummy: void) type { comptime var cfg = CfgData{}; target.configuration(&cfg); configuration(&cfg); return GenCfgData(&cfg); } ```

waiting

Zigにcomptimeを引数に持つ関数の返り値がanytypeになるという制限(https://github.com/ziglang/zig/issues/4984 )があるため,genConfigをkernel_cfg.zigで定義する方法がとれず,コンフィギュレーション記述中で定義している。

waiting

`make[1]: ディレクトリ '/cygdrive/v/ext3/ghq/src/github.com/ykominami/asp3_in_zig-cygwin/OBJ-ARM' に入ります zig build-obj --name objs/sample1_cfg --release-safe --main-pkg-path .. -ffunction-sections -target arm-freestanding-eabi -mcpu mpcore -DTARGET=\"ct11mpcore_gcc\" -DSRCDIR=\"..\" -DTECSGENDIR=\"OBJ-ARM/gen\" -D__TARGET_ARCH_ARM=6 -DTOPPERS_USE_QEMU -I. -I../include -I../target/ct11mpcore_gcc -I../arch/arm_gcc/common -I../arch/gcc -I.. -I../sample -I./gen -I../tecs_kernel...

アプリケーションとコンフィギュレーション技術を一体でコンパイルできるようにする。さらには,カーネルも含めて,システム全体を一体でコンパイルできるようにする。

enhancement

システムサービスをZigで記述する。

enhancement