「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで
●スタートアップ・ルーチンの内容
スタートアップ・ルーチンでは,Cプログラムを実行する前に必要な初期化を行います.WindowsやLinux/UNIXでアプリケーション・プログラムを開発するときは,スタートアップ・ルーチンを意識しません.それは,プログラムの実行環境がいつも同じなので(毎回変更する必要がないので),Cコンパイラが自動的にスタートアップ・ルーチンをリンクしているからです(UNIX系で言うと,スタートアップ・ルーチンは標準ライブラリといっしょにcrt0.oという名まえで存在する).ところが組み込み機器の場合,どのようなデバイスがつながっているか,どれだけのメモリが搭載されているかは機器に依存します.そのため,デバイスの初期化といっても機器によってそれぞれ処理が異なります.加えて,デバイスを初期化する際のやりかたも使用するマイコンによって異なってきます.したがって,スタートアップ・ルーチンが重要になってくるわけです.スタートアップ・ルーチンを理解できないと,組み込みソフトウェアを作れないと言っても過言ではありません.
スタートアップ・ルーチンでは,一般には次のような処理を行います(図2-1の(3)).
●スタックの設定
●プログラムの実行に必要なデータの設定
○ROM領域からRAM領域への初期値データの転送
○初期値を持たないメモリ領域の0クリア
●マイコンの動作モードの設定
○マイコン内蔵の周辺機能を使用するための各種レジスタの初期化
○割り込み許可設定
●ハードウェアの初期化
●ハードウェアの自己診断
スタックは前項の「1.プログラムはどのように動くのか」にも出てきましたが,プログラムを実行する際に必要となる,変数のためのRAM領域です.スタートアップ・ルーチンによってスタック領域を定義することもよくあります.
プログラムの実行に必要なものとしては,スタック以外にも定数やグローバル変数があります.これらを初期化もしくは0クリアする必要があります.定数の一部の値はROMを参照してRAMにコピーしてやる必要があるかもしれません.それが,ROM領域からRAM領域への初期値データの転送です.
また,図2-1の(4)ではスタートアップ・ルーチンからCプログラムのmain関数を直接呼び出すように書いていますが,C言語の標準ライブラリを使用する場合は,main関数を呼び出す前に標準ライブラリの初期化を実行する必要があります.そして,ソフトウェア自身の実行だけでなくマイコンやそのほかのハードウェアを使用するための初期化も必要になります.これらの初期化は,マイコンやハードウェアのマニュアルを参照しながらコーディングします.
これらの下準備を行ったあとで,やっとmain関数が呼び出されます(図2-1の(4)).また,プログラムの実行終了後にスタートアップ・ルーチンに戻ってくる(すなわち,プログラム実行の後処理もスタートアップ・ルーチンに記述する)ことも少なくありません(図2-1の(5)).