【問題3】プログラムのROM化とブート:“組み込み力”向上! ETEC対策ドリル Step2(3)
今回は、組み込みシステムのプログラムの構成と、どのようにプログラムが実行されるのかについて解説する
前回の課題演習―【問題3】は、「組み込みシステム上で動作する実行可能形式プログラム」に関する問題でした。
メモリ容量などが制限されることの多い組み込みシステムでは、プログラムを「ROM(Read Only Memory)化」することで、少しでも「RAM(Random Access Memory)」を効率的に利用しようとします。
今回は、問題の解答に続いて、「組み込みシステムのプログラムの構成」と「どのようにプログラムが実行されるのか」について解説します。この機会にしっかりと理解しておきましょう。
それでは、解答を発表します!
課題演習―【問題3】の解答
解答は、「エ.BSSセクション」です。C言語で書いたプログラムをコンパイルすると、「テキストセクション」「データセクション」「BSSセクション」「スタックセクション」に分割され、「オブジェクトファイル」が生成されます。さらにリンクして実行可能形式プログラムを生成するときに、オブジェクトファイルの各セクションがまとめられます。BSSセクションは、初期値を持たない変数に関する情報を格納するセクションです。初期値を持つ変数はデータセクションに格納されます。
プログラムを構成するセクション
例えば、PC上でアプリケーションを実行すると、ハードディスクに保存されている実行可能形式プログラムがRAMにコピーされ、実行を開始します。組み込みシステムでは大抵の場合、実行するプログラムはROMに書き込まれていますが、これをすべてRAMにコピーしてしまうと都合が悪い場合があります。組み込みシステムでは、RAMの容量が制限されていることが多く、すぐにRAMがいっぱいになってしまうからです。
そこで、プログラムのうち、実行時に変更が発生しない部分は、RAMにコピーせずにROMに残すようにし、実行時に変更が発生する部分のみをRAMに転送するようにプログラムを構成する必要があります。これをROM化といいます。
C言語で書いたソースコードはコンパイラでコンパイルされ、オブジェクトファイルに変換されます。このとき、プログラムを構成する要素が、テキストセクション、データセクション、BSSセクション、スタックセクションに分割されます。複数のオブジェクトファイルをリンクして実行可能形式のプログラムを作成するときに、各オブジェクトファイルのセクションがまとめられます。
セクション名 | 説明 |
---|---|
テキストセクション | 命令、関数などの処理を記述しており、実行時に変更されない部分を格納する。RAMにコピーされずにROMに残る |
データセクション | 初期値を持つ変数などを格納する。実行時に変更されるため、RAMにコピーされる |
BSS(Block Started by Symbol)セクション | 初期値を持たない変数などに関する情報(変数のサイズとアドレスなど)を格納する。この情報を基にRAM上に変数が配置される |
スタックセクション | スタックに関してサイズなどの情報を格納する。この情報を基にRAM上にスタックが確保される |
表1 プログラムのセクション |
リンクした実行可能形式プログラムをROM化ツールによりROM化します。ROM化したプログラムをROMに書き込んで提供することで、テキストセクションがROMに残り、それ以外のセクションがRAMに展開されるようになります。
電源を入れてからプログラムが動くまで
では、ROM化されたプログラムはどのように実行されるのでしょうか。
システムに電源を入れてから何かのプログラムが呼び出されて動くまでの一連の流れを「ブート」といいます。PCでは、電源をオンにすると、「ブートストラップローダ」と呼ばれるプログラムがハードウェアの設定など、必要な初期設定を行い、OSをディスクからRAMに読み込んで起動します。
組み込みシステムも、OSを搭載していれば、プログラムの実行に必要な初期設定はOSが行うため、ブートの大筋の流れはPCとそれほど変わりません。しかし、OSを搭載していないシステムや、OSを移植したりカスタマイズしたりしているシステムでは、ブートのために「スタートアップルーチン」が必要になります。
組み込みシステムでは、電源が入ると、リセット回路によりMPUにリセット信号が送られ、「ハードウェアリセット」が開始されます。これは、各回路のレジスタを初期化する処理です。電源がオンになった直後は、レジスタがどのような状態になっているか分かりません。MPUがこのような状態のレジスタを参照すると、暴走してしまうかもしれません。また、リセットにより、電圧が安定してクロックを供給できるようになるタイミングを計ることができます。
数十〜数百ミリ秒後、リセット信号はH状態からL状態になります。これでハードウェアリセットが完了です。MPUはこれを「リセット割り込み」として受け取り、ROM上の「リセットベクタ」の内容、すなわちスタートアップルーチンのアドレスを「プログラムカウンタ」に書き込みます。これにより、スタートアップルーチンが呼び出されます。
スタートアップルーチンは、MPUのレジスタの設定、ハードウェアの設定、割り込みベクタテーブルの設定などを行ってから、プログラムを実行可能な環境を作成します。
まず、データセクションをRAMにコピーします。続いて、BSSセクションの情報を基にRAM上に変数を展開します。スタックセクションの情報からスタック領域を確保し、スタックの先頭アドレスをMPUのスタックポインタに設定します。最後に、プログラムのmain関数を呼び出すと、プログラムの処理が開始します。
課題演習―【問題4】
いかがでしたでしょうか? プログラムのROM化とブートについて理解できましたか。次回からはいよいよ組み込みシステムの開発について解説していきます。連載第4回では「組み込みソフトウェアの開発支援機器」に関する話題をお届けします。お楽しみに! (次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.