連載
» 2006年12月19日 00時00分 UPDATE

H8で学ぶマイコン開発入門(4):OSが起動する以前のスタートアップルーチン (1/4)

OSが搭載されていない組み込みシステムの場合、プログラマはOSが実行してくれる処理のすべてを自分で実装する必要がある

[山本 繁寿 ソフィアシステムズ,@IT MONOist]

 今回は、スタートアップルーチンについて解説します。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)に処理を戻す:正常終了≫
}
リスト1 モニタ画面に文字を表示させるプログラム

 このプログラムは、組み込みLinuxを搭載したターゲットに接続されているLCDへ文字列を出力するプログラムです。プログラムの詳細については割愛しますが、(2)(3)の部分に注目してください。(2)では、LCDデバイスをリードライトでオープンしています。(2)でオープンしたLCDへ(3)で「Hello」の文字列を出力することで、LCDに文字列が表示されます。

 このように、Linux OSが搭載されたシステムのアプリケーションプログラムを開発するプログラマは、openやwriteなど、C言語の関数を使いこなせれば、簡単にターゲットを制御できます。しかし、ここで次の疑問が生じます。

  • openやwriteの実体は、どのようになっているか
  • どのような処理でLCDデバイスが使用可能となり、データが書き込まれているか
  • (1)でアプリケーションプログラムの始まりを宣言しているが、その前はどうなっているのか
  • プログラムが正常に終了したら(4)でOS(Linux)へ処理を戻しているが、returnの先はどのようになっているか

 そこで登場するのが、スタートアップルーチンとデバイスドライバです。スタートアップルーチンは、最初のアプリケーションプログラムが動作するまでの前準備と、アプリケーションプログラムが終了した後の処理などを行っています。またデバイスドライバは、ターゲットに接続されたデバイスを駆動(ドライブ)するためのプログラムです。以下では、スタートアップルーチンに焦点を絞り、解説していきます。

       1|2|3|4 次のページへ

Copyright© 2018 ITmedia, Inc. All Rights Reserved.