【問題3】プログラムのROM化とブート“組み込み力”向上! ETEC対策ドリル Step2(3)

今回は、組み込みシステムのプログラムの構成と、どのようにプログラムが実行されるのかについて解説する

» 2010年10月18日 00時00分 公開
[近森満(株式会社サートプロ 代表取締役社長/JASA ETEC運営事務局),@IT MONOist]

 前回の課題演習―【問題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がこのような状態のレジスタを参照すると、暴走してしまうかもしれません。また、リセットにより、電圧が安定してクロックを供給できるようになるタイミングを計ることができます。

電源オンによるハードウェアリセット 図1 電源オンによるハードウェアリセット

 数十〜数百ミリ秒後、リセット信号はH状態からL状態になります。これでハードウェアリセットが完了です。MPUはこれを「リセット割り込み」として受け取り、ROM上の「リセットベクタ」の内容、すなわちスタートアップルーチンのアドレスを「プログラムカウンタ」に書き込みます。これにより、スタートアップルーチンが呼び出されます。

MPUの処理の開始 図2 MPUの処理の開始

 スタートアップルーチンは、MPUのレジスタの設定、ハードウェアの設定、割り込みベクタテーブルの設定などを行ってから、プログラムを実行可能な環境を作成します。

 まず、データセクションをRAMにコピーします。続いて、BSSセクションの情報を基にRAM上に変数を展開します。スタックセクションの情報からスタック領域を確保し、スタックの先頭アドレスをMPUのスタックポインタに設定します。最後に、プログラムのmain関数を呼び出すと、プログラムの処理が開始します。

スタートアップルーチンからプログラムの実行 図3 スタートアップルーチンからプログラムの実行

課題演習―【問題4】

 いかがでしたでしょうか? プログラムのROM化とブートについて理解できましたか。次回からはいよいよ組み込みシステムの開発について解説していきます。連載第4回では「組み込みソフトウェアの開発支援機器」に関する話題をお届けします。お楽しみに! (次回に続く)


【 筆者紹介 】
近森 満(ちかもり みつる)
株式会社サートプロ 代表取締役社長

大手電気メーカー、外資系IT教育ベンダ、オープンソース系技術者資格認定団体などを経て、2006年より組み込みシステム分野の人材育成・教育支援を行う株式会社サートプロを設立する。現在は、ETEC運営事務局としてJASAの組込みソフトウェア技術者試験の普及・啓蒙(けいもう)活動のほか、組み込み人材育成と教育支援事業を行う。


Copyright © ITmedia, Inc. All Rights Reserved.