目的
μT-Kernel 3.0の移植例を通し、その勘どころ(みたいなもの)を知っていただこうという記事です。
μT-Kernel
μT-Kernelとは
μT-Kernelとは、ずばり組み込み向けのRTOSです。高いリアルタイム性・軽量・移植しやすさが特徴。
μT-Kernel | トロンフォーラム
https://www.tron.org/ja/tron-project/what-is-t-kernel/mt-kernel/
μT-Kernel 3.0
その最新バージョン、μT-Kernel 3.0が2019年12月にリリースされています。
なお残念ながら、対応ボードは以下の2種類のみ。
- TX03 M367 IoT-Engine
- RX231 IoT-Engine
ただ、このバージョンでは更に移植性が増したとのこと。
ということで、手持ちのボード「B-L475E-IOT01A - STM32L4 Discovery kit IoT node」に移植してみることにしました。
成果物と解説
ソースコード
先に紹介してしまいますが(笑)、以下です。
imagou/mtkernel_3: micro T-Kernel 3.0
https://github.com/imagou/mtkernel_3/
実装手順
おことわり
実装レベルは、以下の最低限なものとしてあります。
製品に載せるには色々と不足・問題がありますが、取っ掛かりとしてはよいかと・・・。
- UARTでデバッグログが出力できる
- RTOSとして期待通り(?)に動く(ディスパッチ、タイマ)
1. 移植対象ディレクトリをコピーして作成
移植対象ディレクトリは、以下の3つがあります。
- 対象ボード(今回の場合、「B-L475E-IOT01A」)
- 対象マイコン(今回の場合、「STM32L475」)
- 対象マイコンのコア(今回の場合、「ARM Cortex-M4」)
これらを、既存のディレクトリをコピーし、作成します。
今回は「TX03 M367 IoT-Engine」をコピー元として選択しました(ARM Cortex-M3ベースなため、近しい)。
2. ビルドを通す
対象のボード、マイコン、コアに対応するよう、オプション定義をします。
(そうしないと、ビルド対象が切り替わらない)
以下のmakefile差分が参考になるかと思います。
Comparing tron-forum:master...imagou:develop_B-L475E-IOT01A · tron-forum/mtkernel_3
https://github.com/tron-forum/mtkernel_3/compare/master...imagou:develop_B-L475E-IOT01A#diff-1b00c5e169d416dfd6d5ad9b7aa4d23f
ビルド方法は、上記makefileが配置されているディレクトリにて、makeと打つだけです。
3. IDEへの取り込み
デバッグは必須なため、IDEに取り込みます。
私は以下を参考にし(手前味噌)、STマイクロのIDE、STM32CubeIDEに取り込みました。
STM32CubeIDEでTOPPERS/ASPカーネルを動かす - 本編 - Qiita
https://qiita.com/imagou/items/1a09d9afecc3f62e22d1
4. リセット後の動作確認
IDEにて、リセット後にハンドラが呼び出されることを確認しておきます。
(ここがまともじゃないと、デバッグどころではありません)
今回はマッピング(ベクタテーブルとハンドラ)の調整が必要でした。
5. ひたすら実装
以降は、コピーしたままでは当然動かないので、頑張って実装します。
といってもゼロベースは辛いので、今回は以下を参考にしました。
- STM32CubeIDEで、実動作するプロジェクト
- TOPPERS ASP-Kernel STM32L476 discoveryプロジェクト
- STマイクロ H/W仕様書(当然)
ポイントを絞り、かつIDEデバッグをしながら進めれば、時間は掛かったとしても、間違いなく動くモノはできます!
おわりに
雑な紹介ではありますが、目的の通り、勘どころが伝われば幸いに思います!