OSが搭載されていない組み込みシステムの場合、プログラマはOSが実行してくれる処理のすべてを自分で実装する必要がある。
今回は、スタートアップルーチンについて解説します。WindowsやLinuxといったネイティブ環境のプログラマにとって、スタートアップルーチンは初めて聞く言葉だと思います。また最近は、組み込みシステムの大部分にOSが搭載(2006年版組込みソフトウェア産業実態調査報告書によると、約90%のシステムに何らかの組み込みOSが搭載)されていますので、組み込みシステムのプログラマ、特にアプリケーションプログラマがスタートアップルーチンを意識する場面は減ってきています。
しかし、OSを使わないシステムや組み込みOS自体を移植する場合は、スタートアップルーチンなしではシステムは動作しません。このため、依然としてスタートアップルーチンは、組み込みシステムにとって重要なキーワードの1つです。
WindowsやLinuxなどのOSが搭載されているコンピュータでは、モニタ画面に文字列を出力したり、ファイルを保存したりすることが当たり前のようにできます。リスト1のプログラムを見てください。
// LCDに文字列を出力 #include <fcntl.h> #include "../drivers/lcd.h" #define WRITEDATA "Hello" // 出力文字列データ #define WAIT 1 // 挿入ウェイト int lcdFd; // ファイルディスクリプタ /* LCDデバイスをリードライトでオープン */ int openLCD() { lcdFd=open("/dev/lcd", O_RDWR); //≪(2)ファイルディスクリプタ取得≫ return lcdFd; } /* LCDデバイスのチェック */ int checkLCD() { int lcd; lcd=ioctl(lcdFd, LCDCTL_CLEAR_DISPLAY, 0); // 全表示をクリアする // ことでLCDチェックを代用 return lcd; } /* LCDに文字列を表示 */ void writeLCD() { ioctl(lcdFd, LCDCTL_CURSOR_ATHOME, 0); // カーソルをホーム位置に移動 write(lcdFd, WRITEDATA, strlen(WRITEDATA)); //≪(3)データをライト≫ printf("%s\n", WRITEDATA); // ターミナルに出力文字列 sleep(WAIT); // 適当なウェイト挿入 } int main() //≪(1)プログラムの始まり≫ { int lcdStat; lcdStat=openLCD(); // LCDデバイスオープン if(lcdStat<0){ printf("open lcd failed\n"); // LCDデバイスのオープンに失敗したら return -1; // OS(Linux)に処理を戻す } lcdStat=checkLCD(); // LCDデバイスチェック if(lcdStat<0){ printf("lcd damaged\n"); // LCDの状態が不安定な場合は return -1; // OS(Linux)に処理を戻す } writeLCD(); // LCDに文字列表示 return 0; //≪(4)OS(Linux)に処理を戻す:正常終了≫ }
このプログラムは、組み込みLinuxを搭載したターゲットに接続されているLCDへ文字列を出力するプログラムです。プログラムの詳細については割愛しますが、(2)と(3)の部分に注目してください。(2)では、LCDデバイスをリードライトでオープンしています。(2)でオープンしたLCDへ(3)で「Hello」の文字列を出力することで、LCDに文字列が表示されます。
このように、Linux OSが搭載されたシステムのアプリケーションプログラムを開発するプログラマは、openやwriteなど、C言語の関数を使いこなせれば、簡単にターゲットを制御できます。しかし、ここで次の疑問が生じます。
そこで登場するのが、スタートアップルーチンとデバイスドライバです。スタートアップルーチンは、最初のアプリケーションプログラムが動作するまでの前準備と、アプリケーションプログラムが終了した後の処理などを行っています。またデバイスドライバは、ターゲットに接続されたデバイスを駆動(ドライブ)するためのプログラムです。以下では、スタートアップルーチンに焦点を絞り、解説していきます。
Copyright © ITmedia, Inc. All Rights Reserved.