せっかく頑張ったので、残念だったけど振り返ってみて次に繋げていこうと思います。
また、課題をレビューしてくださった人にもここで感謝を述べさせていただきます。ありがとうございました。今回課題を解いていくにあたっていろいろなことを学ばさせていただいたと思います。
提出資料は以下に置いておきます。
# やりたかったこと
MQTT プロトコルスタックや wireguard のスタックを持つ、FreeRTOS よりもミニマルで扱いやすい組み込み OS を作りたかった。
この組み込み OS を CPU と FPGA が一体化したチップである Zynq 上で動作できるように開発することで、一般的に Linux を使ってシステムを作りがちな Zynq プロセッサをもっと低リソースで使用できるのではないか。
# 主な原因
ダメだった原因はおそらく知識不足が大きかったのではないかと思います。
# そもそも組み込み OS とはなんぞやということをよく知らなかった
私は坂井先生が書かれた組み込み OS 自作本をもとに、「KOZOS」ベースで開発をしようと思っていました。組み込み OS 自作本を軽く読んでみたところ、頑張れば自分で別のハードウェアにも実装できるんじゃないか?みたいな考えに至ったのですが、考えが甘すぎました。
FreeRTOS の実装と、KOZOS の実装を睨めっこして自分で移植してみようと試してみたのですが、FreeRTOS の実装の仕様がとても大きく、とても今の自分では理解することが困難でした。port.S
というプログラムはアセンブラで書かれており、アセンブラはほとんどやってこなかったため解読が難しかったです。また、KOZOS の H8 開発ボードでの割り込みの実装と Zynq でのxscugic
やxscutimer
などを使用したタイマ割り込みなどの割り込みの実装は自分にとっては全然違うものに感じられ、似せて実装を進めていくことはだいぶ困難でした。
私は実用を前提に作るシステムに対してとてもモチベーションがあり、これまで OS を実用的に使用するというシチュエーションが全然思い浮かばなかったため、OS 関連の勉強は独学では全然してきませんでした。(この思想を持っていることが落ちた原因であるかもしれません。)しかし後から坂井先生のブログなどを色々漁ってみた結果、そもそも KOZOS 自体も組み込み OS としてではなく、組み込みではない一般的な CPU で動作することが前提の OS から始まったものであったことがわかりました。
https://kozos.jp/kozos/others.html
汎用 OS に対する知識はほとんどなく、全然違うものだと思っていたため OS に対する知識が薄いことについて特に何か思うところもありませんでした。
以上より、改めて本格的に組み込み OS を開発するためには、汎用 OS 自体に対する深い理解と経験が必要だったのではないかという結論に至りました。これからもっと実力や知識をつけて時間が取れた時には改めて頑張ってみたいと思います。
# Vitis での開発環境についての理解不足
Vitis は Zynq プロセッサをいい感じに使うためのソフトウェアです。Vitis でプログラムを書いていくと、コンパイル時に SD カードイメージが作成され、そのイメージを SD カードに書き込むことでそのまま書いたコードが起動できるみたいなのですが、このイメージには First Stage Boot Loader(FSBL)が含まれており、起動するためのブートローダが生成されるようです。
私はこの FSBL という用語自体は知っていたのですが、知っていただけでそれがブートローダの役割を持つことに全然考えが至らず、KOZOS のブートローダの実装から始めてしまいました。提出二日後にそのことに気づき、OS 自体の開発に移ることにはしたのですが、だいぶ無駄に近い時間を費やしてしまいました。その後割り込みがとても難しいことがわかり一旦放置をしていました。
# FreeRTOS についての知識不足
私は MQTT プロトコルスタックを実装したいと書いていたのですが、実は FreeRTOS にはすでに MQTT スタックが実装されていました。
https://qqq.freertos.org/Documentation/03-Libraries/03-FreeRTOS-core/02-coreMQTT/00-coreMQTT
これに関しては提出時には全く知らなかったです。FreeRTOS にもうすでに MQTT が実装されているとしたら、自分が実装しようと思っているものは wireguard くらいしか特徴付けるものがなくなってしまいます。しかもこの wireguard も low wight IP stack(lwIP)上に実装された GitHub に上がっている既存のコードをそのまま流用する予定だったので、自分自身がそのプロダクトに誇れるものがほとんどなくなってしまうことになります。
On The Air Update(OTA)もできるようにしたいということも書いたのですが、もうすでにありました。
https://qqq.freertos.org/Community/Blogs/2022/delta-over-the-air-updates
自分がやりたいと思っていたものはもうすでにほとんどが実装されていたということですね。全く持って調査不足です。
# SecHack との相性の悪さ
坂井ゼミの応募課題にはこのような記述があります。
開発はオンラインベースのため,マイコンボードなどの実機ではなくエミュレータで進めることを想定しています.実機利用は,起きる問題を自己解決できる場合に限ります.
私のプロジェクトは Zynq の実機上で実装されることが前提で開発する予定でした。今となっては Zynq も qemu などでデバッグできることを知っているのですが、当時は実機でしか動かないと思い込んでいたため、仮想環境に関する言及を一切しませんでした。そのため仮想環境に対する理解が甘かったのではないかとも思います。
そしてセキュリティを目的にしているイベントなのに OS 開発をメインで行い、セキュリティは二の次のような書き振りだったため、趣旨からも逸れていたのではないかと思います。
# まとめ
これらの原因によって今回はダメだったのではないかと思います。
これは 2025/05/27 時点の記事です(確定は 30 日)。落選が確定したわけではないため断定的に書いていますが、おそらく坂井ゼミは人気なので繰り上げで合格することはまずありえないと思うので自己分析も含めてこの記事を書きました。
私はこの結果を受けてまずは FreeRTOS についての知見を深めていきたいと思います。FreeRTOS をある程度実用レベルまで使えるようになったら、ドキュメントを書いてもっとたくさんの人が簡単に触れられるようにしていきたいと思います。
Qiita などにはもうある程度の数の記事が投稿されていますが、一つの大きなドキュメントの形でホストされているものはまだ多くないため、もっとフレンドリーに使えるようになれるドキュメントを書けるように知見を深めたいと思います。