Blackfin向けのGCCやuClinuxポートを公開しているBlackfin Koopでは、RTOSやuClinuxを使わないアプリケーションを、ベアメタル・アプリケーションと呼んでいます。
ベアメタル・アプリケーションはバイナリがコンパクトになる上に割り込み応答時間も短いといった特徴があり、DSPではよく使われます。ただ、私に限っていえばBlackfin上でITRONを使うようになってから、ベアメタル・アプリケーションへの興味はすっかり落ちてしまいました。
RTOSに比べて色々かゆいところに手が届かない欠点があるとは言え、ちょっとしたテストに使う時にはベアメタル・アプリケーションの作り方を知っておいた方がいいことがあります。Blackfinでも簡単に作れますので、以下に作り方を書いておきましょう。
プログラム
ベアメタル・アプリケーションはC言語のプログラムであり、伝統に従って本体はmain()関数です。従って、単純な動作試験程度なら、以下のような短いソースで動かすことができます。
volatile int a, b, c;
int main(void)
{
a = b + c;
return 0;
}
ビルド
こうして作ったプログラムがファイル main.c に入っているとします。これをコンパイルおよびリンクするには次のコマンドラインを実行します。
> bfin-elf-gcc main.c –mcpu=bf592 –g
-g オプションはgccのデバッグ・オプションです。Blackfin用GCCツールチェーンに特徴的なのは-mcpuオプションで、ここには、”bf”で始まるプロセッサ名を指定します。これによって、プロセッサ毎に適切なスタートアップ・コードとメモリ配置が適用されます。
ターゲットへのロードと実行
プログラムに間違いがなければ、こうして作ったプログラムは gdb / gdvserver 経由でターゲットへロードできます。
gdbserverは既に説明したとおり、以下のコマンドで起動することができます。
$ sudo /opt/uClinux/bfin-elf/bin/bfin-gdbproxy -q bfin –connect=”cable probe”
エラーが発生するときにはリンク先を参照してみてください。gdbserverが立ち上がったら、以下のコマンドを投入して実行することができます。
$ bfin-elf-gdb a.out -q
> target remote localhost:2000
> load
> b main
> c
正しくロードされていれば、main()関数の先頭でブレークします。
試験環境と参考文献
以上の一連の作業が正常に動作することは、以下の環境で確認済みです。
- Ubuntu 10.04 LTS
- Blackfin GCC Toolchain 2011R4
- JTAG ICE 「刺身包丁」
- ACB-BF592
ツールチェーンのインストールに関しては、TOPPERS/JSP for Blackfin プロジェクトのダウンロード・セクションにあるユーザーズ・ガイドを 参照してください。