2.Cコンパイラと組み込み向けC言語の特徴

ネイティブコンパイラ/クロスコンパイラ...

● ネイティブコンパイラ/クロスコンパイラ

 WindowsやUNIX,Linuxなどのプラットホームで動作するアプリケーションプログラムを開発するためのコンパイラを,ここではPC用コンパイラと呼びましょう.

 PC用コンパイラは,そのOS上で動作するプログラムをコンパイルします.これをネイティブコンパイラまたはセルフコンパイラなどと呼びます.この場合,開発環境と実行環境が同じになります〔図3(a)〕.

 これに対して,WindowsやLinux上で動作するが,生成するコードはそのOS用のものではなく,他のCPU用のコードを生成するコンパイラをクロスコンパイラと呼びます.クロスと呼ばれる理由は,プログラムを開発する環境(コンパイラが実際に動作する環境)と,コンパイラにより生成されたオブジェクトファイルが動作する環境(実行環境)が違うためです〔図3(b)〕.

〔図3〕ネイティブコンパイラと
クロスコンパイラ

● PC用コンパイラの場合

 PC用コンパイラから出力されたバイナリコードは,たとえばWindowsの場合,PC内のCPU(x86系)で実行されます.ここでPC用コンパイラを使って,コンソールに文字を出力したり,ハードディスクやCD-ROMなどの外部記憶へアクセスする場合を考えてみます.おそらくプログラマは,コンパイラに付属した入出力用ライブラリ関数に適当な引き数を与え,コンパイルするだけだと思います.PC用コンパイラは自動的に必要なファイルをリンクして最終的な実行形式ファイルを出力します.プログラムの実行は,その実行形式ファイルをコマンドとして指定するだけです.また,プログラムは実行を終了するとOSに戻ってきます.

 プログラマは,バグのないプログラムを書くことだけに専念すれば,後はコンパイラまかせです.プログラマは,コンソールに文字が出力される仕組みや,ディスクアクセスのシーケンス,ましてや自分が作成したプログラムがメモリ内のどの物理アドレスに配置されるかなどといったことを意識しなくても問題ありません.

● 組み込み用コンパイラの場合

 しかし,組み込み用コンパイラではそうはいきません.図4に示すように,Cプログラムの最初の関数を実行する前にやるべきことがあります.また,プログラムの実行を終了した場合,戻るOSが存在しないので,何らかの処理が必要でしょう.図4ではprintf関数が使われていますが,この文字列はどこへ出力すべきなのでしょうか.そして,このプログラムは,メモリ上のどのアドレスに配置すべきかも検討する必要があります.

〔図4〕
Cプログラムの前/後/ライブラリ
関数の実装/メモリ配置

● スタートアップルーチン

 スタートアップルーチンは,C言語で記述したアプリケーションプログラムを実行する前に実行されるプログラムです.詳細は第3章で説明しますが,スタートアップルーチンでは,スタックの初期設定やメモリの初期化,その他の環境設定を行った後,Cプログラムの最初の関数を呼び出します.

 PC用のアプリケーションプログラムでは,スタートアップルーチンを意識することはほとんどありません.Cプログラムを書いてコンパイルさえすれば,そのプログラムは動作します.理由は,コンパイラが自動的にスタートアップルーチンをリンクするためです.

 しかし,組み込みシステムの場合,システムはPCのように画一的ではありません.同じCPUを使う場合でも,あるシステムにはSDRAMが実装されていたり,また別のシステムでは液晶パネルが搭載されていたりと,用途により多種多様です.

 つまり,Cプログラム実行の前に,初期化しておかなければならないデバイスがあるのです.そのため,コンパイラからは基本となるスタートアップルーチンのサンプルのみ提供され,システム固有の初期設定は,プログラマ自身が責任をもって記述する必要があります.

 また,PC用コンパイラの場合,Cプログラムで最初に実行される関数はmainに固定されています.これはPC用コンパイラに付属しているスタートアップルーチンから最初に呼ばれるCプログラムの関数がmain関数になっているからです.そのため,PC用コンパイラの場合,main関数を書かずにプログラムをコンパイルすると,リンク時にmain関数が未定義である旨のワーニングまたはエラーが発生します.

 これに対して組み込みシステムの場合,スタートアップルーチンはプログラマが記述するため,Cプログラムの最初の関数は自由に定義できます.

 Cプログラムから戻ってきた場合はどう処理すればよいのでしょうか.通常は,無限ループやCPUを停止する命令を埋め込んでおきます.

以降の内容は本誌を参照ください

1.組み込み機器とさまざまなプログラミング言語
 機械語/アセンブリ言語/高級言語
 C言語のメリット/デメリット

2.Cコンパイラと組み込み向けC言語の特徴
 開発の流れ
 ネイティブコンパイラ/クロスコンパイラ...


3月号特集トップページへ戻る


Copyright 2002 山本繁寿/有末一寿