OSが起動する以前のスタートアップルーチン:H8で学ぶマイコン開発入門(4)(1/4 ページ)
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言語の関数を使いこなせれば、簡単にターゲットを制御できます。しかし、ここで次の疑問が生じます。
- openやwriteの実体は、どのようになっているか
- どのような処理でLCDデバイスが使用可能となり、データが書き込まれているか
- (1)でアプリケーションプログラムの始まりを宣言しているが、その前はどうなっているのか
- プログラムが正常に終了したら(4)でOS(Linux)へ処理を戻しているが、returnの先はどのようになっているか
そこで登場するのが、スタートアップルーチンとデバイスドライバです。スタートアップルーチンは、最初のアプリケーションプログラムが動作するまでの前準備と、アプリケーションプログラムが終了した後の処理などを行っています。またデバイスドライバは、ターゲットに接続されたデバイスを駆動(ドライブ)するためのプログラムです。以下では、スタートアップルーチンに焦点を絞り、解説していきます。
Copyright © ITmedia, Inc. All Rights Reserved.