(2023/12/25)
[連載27] ベアメタルでSOLIDを使う
いよいよ来ました最終段階。
ベアメタルでSOLIDを使ってみます。
SOLID OSもSOLIDコアサービスも取り外します。
じゃぁ一体何をもってSOLIDなのか。。。?
ラスボスがいます。
SOLID-IDEです。
今まで、イマイチ後ろに隠れがちだったSOLID-IDE。
カバレジ結果を表示しても、「コンパイラとSOLIDコアサービスのルーチンのおかげ」と言われ、アドレスサニタイザ機能により異常なアクセスを未然に検出しても「コンパイラとSOLID-OSランタイムのおかげ」と言われ。
三位一体が売りのSOLID統合環境下においては、他のアピールが強すぎて、
「一人では何にもできない奴」
という扱いをされがちになっているなぁ。。。と思うのは筆者だけでしょうか。
いやいや、忘れそうになっていますが、SOLID-IDEは、「コンパイラ&デバッガ」です。
OSもコアサービスもない荒野(※ ベアメタル環境)でも、生き残って戦える戦士!
。。。好き勝手言っていますが、要は、まぁ、原点にもどるわけです。
組み込みソフトウェアがこんなに複雑化する前から、ビルド&デバッグという役目を担ってきた「コンパイラ&デバッガ」に、今回は焦点を当ててみます。
Cortex-A9搭載ボード×PARTNER Jet2の組み合わせを使用します。
Cortex-A9搭載ボード上のu-bootが動作し、その後に自作のmain()関数に飛んでくるという流れです。
使用しているボードは、0x40000000からDDRが割りついており、u-bootによりそのDDRの初期化も終わっています。
すなわち、この時点では物理アドレス=仮想アドレスで動作しますので、ここに自作main()関数を置いてみましょう。
プロジェクトを新規作成します。
「新しいプロジェクト」ウィザードで、ベアメタルテンプレートを選択します。
CPUコアを選択します。
Cortex-A、Cortex-M、Cortex-Rが選択できます。
SOLID-OS等を含めた完全体のSOLIDはCortex-Aに対応していますが、今回はそういうものがないためCortex-MもCortex-RでもOKです。
とはいえ、使用するボードのCPUはCortex-A9なので、Cortex-Aを選択します。
Cortex-Aの種類を選択します。
プロジェクトの種類を選択します。
最小構成のプロジェクトを選択してみましょう。
文字セットの選択ですが、このままにしておきましょう。
以上でベアメタル用のプロジェクトが作成できました。
メモリの配置をメモリマップに合わせるため、ldファイルを編集します。
このldファイルは、一般的なGNUのリンカスプリクト形式なので、馴染みがありますね。
使用しているボードは、0x40000000付近にRAMがあるので、そのようにアドレスを変えておきましょう。
加えて、標準出力はないので、printf文は削除しておきましょうか。
代わりに無限ループを入れておきましょう。
これでメモリマップ、ソースコードの編集ができました。
デバッガとICEとのコミュニケーションをとるためのファイルを置く必要があります。
以前使用したサンプルのフォルダ内を見てみましょう。
どのサンプルでも構いません。
「partner」フォルダがありますね。
このフォルダ、今回新規作成したプロジェクトにも必要です。
コピー&ペーストします。
ペーストしたフォルダの中のファイルを確認しましょう。
init.mcrファイルを見てみます。
このファイルは、ICEに対し、起動時に行ってほしいことを記載しています。
今回、何も行う必要がないため、もし何か記載されていた場合は全部削除してしまいましょう。
これで事前準備は完了です。
では、ビルドして実行してみましょう。
実行する前に、自作main()関数にブレークを設定しておきます。
無事、自作main()関数に飛んできました。
main()関数にさえ飛んでくれば、あとは何とでもなりますね。
ベアメタルですから。
ただし、SOLIDのコアサービスもないので、ドライバを自作するなり移植するなり。。。
自分でいろいろと解決しないといけないです。
とはいっても、ここで、ベアメタル vs リアルタイムOS のようなバトルを展開する気は全くありません。
何が言いたいかというと、リアルタイムOSに対応していて、独自のコアサービスも搭載されているSOLID統合環境は、実はJTAG ICEと共にビルド&デバッガIDEという昔ながらの組み込み開発ツールとしても使える、という事です。
さて、長期にわたり連載してきましたが、原点に戻ってキリが良いのでここで終了します。
SOLIDはさらに進化を続けていて、先週も新バージョン3.3.0が先日リリースされました。
以下のような、ここでご紹介したくなるような新機能も含まれています。
・プロファイルに基づく最適化(PGO)をサポート
カバレッジ機能により取得したプロファイリングデータを基に、コンパイラが最適化する機能です。
・リンク時最適化(LTO)をサポート
リンク時に最適化を行います。
モジュール間をまたがった解析を基に最適化を行うことが可能になる、というものです。
ご紹介を始めてしまうと、本連載全然追われないので、、、(笑)
ご興味ある方、ぜひWEBサイトに記載されているリリース情報等ご覧ください。
SOLID 3.3.0
今まで読んでくださり、ありがとうございました!