組み込みシステムで多用されるリアルタイムOSでは,デスクトップ系OSでは意識しなかった概念が必要とされることがある.また,そこで使われる用語も,各OSごとに微妙に異なり,混乱の元となることがある.そこで本章では,リアルタイムOSを扱う上で必要となる概念とキーワードを解説することにより,その理解を深めることにする. (編集部)

-1-
main()の前,printfの向こう側

 プログラミングは“hello, world”から始めるのが,なんとなく一般化している.新しい言語や新しい開発環境に取り組むときにとりあえず“hello, world”をやってみる.カーニハン&リッチーの『プログラミング言語C』の第一章「やさしい入門,1.1 手始めに」がオリジナルだが,いろいろな本でサンプルプログラムとして登場している.PCやデスクトップ上でアプリケーション開発を始めるのであれば,“hello, world”は手始めにふさわしい.その『プログラミング言語C』でmain()について,

  プログラムの実行はmainの先頭から始まる

と説明してあるとおり,実際のプログラムでは目的とする処理をmainの後に書いていくことになる.

 ところが,組み込み系の場合では事情が多少異なる.組み込みの場合は,電源を入れたときから実行が始まるので,じつはmainの先頭にたどり着く前にいろいろなことをやらなくてはならない.すでにデスクトップで開発経験があり,これから組み込みでの開発を始めようとする人の場合,図1に示すようにまず方向を変えてmainの前に注目するのが良いかもしれない.

〔図1〕やさしい入門/手始めに

 mainの前にあるのがOSとコンパイラの世界である.そこでは,レジスタの設定,バスコントローラの初期化,初期化変数への初期値の設定や,C++であればグローバルオブジェクトの生成などの仕事をする.そして,main関数の先頭にコントロールが移る.

 mainの前にある世界は意外と奥が深いので,いきなり突入しないでVxWorks,OS-9,QNXなどのリアルタイムOS(以下,RTOS)と,それをポーティングした評価ボードを買ってきてソフトランディングすることも可能である.

 これらのような統合開発環境をもっているRTOSであれば,mainの前を気にしないでアプリケーションを作り始めることができる.この場合,評価ボードにブートROMを差して,イーサネットでホストと繋ぎ,いわゆるRTOSメーカーが提供する開発環境からメニューのRUNを選ぶとログウィンドウに“hello, world”と表示される.

 あるいは,telnetなどのDOSプロンプトライクな環境からspawnコマンドなどで実行させることができる場合は,デスクトップとたいして変わらない.たとえば,QNXではセルフ開発もできるので,まったく変わらないといってよいかもしれない.

 しかし,評価ボードから独自のボードに開発が移る際(この作業をポーティングと呼ぶことが多い)に,やはりmainの前の世界,つまりOSの世界に踏み込まなければならない.アプリケーション担当者とポーティング担当者を分けてしまうのも一つの選択である.そうすれば,全員でOSの世界に首を突っ込まなくても良い.ソフトランディングできるか否か,役割分担できるか否かはRTOSを選ぶ際の選択基準になる.

 もう一つ,printfの先にもOSの世界がある.デスクトップの場合,標準関数でI/O処理が可能だが,組み込み制御ソフトウェアの場合,printfを呼び出すと最終的に低レベルI/O関数が呼び出される(図2).組み込み制御ソフトウェアでうっかりprintfと書いたりすると“write関数がありません”というエラーメッセージが表示される.このwriteのようなハードウェア環境に依存する低レベルI/O関数は,組み込み制御ソフトウェアでは自分で作らなければならない.この場合も,上記の市販RTOSでは対応済みになっている場合が多い

〔図2〕三つの世界がある

 図3がRTOSの一般的な構造だ.一般に,プロセス型RTOSは,I/Oも抽象化した形でもっている.UNIXあるいはそれ以上に拡張性のあるI/O構造をもっているものもある.抽象化したI/O構造をもっているかいないかは,ドライバの構造でわかる.単純な入出力関数とパラメータテーブルだけでドライバができてしまうRTOSは抽象化したI/O構造をもっているといえる.

〔図3〕RTOSの一般的な構造

 しかし,中にはドライバの概念自身をもっていないRTOSもある.OSなしの場合やITRONのようなカーネルだけのRTOSを使う場合でも,作ったプログラムをMultiなどのシミュレータ上で動かす場合には,低レベルI/O関数を自分で作らなくとも,“hello, world”程度ならウィンドウ上に出力できるので手始めになりうる.

 組み込みシステムのソフトウェア開発の大きな特徴は,mainの前やmainからリターンした後,あるいは標準関数の奥のほうも開発対象となることである.そして,この部分の開発負荷は,選択するRTOSや,サポートしている開発環境に依存する.

 RTOSを使う目的が開発期間を短縮したいためという場合には,開発負荷の軽減が重要になる.また,組み込み開発の経験が少ない場合は,ソフトランディングできることも期間短縮に貢献する.

1 main()の前,printfの向こう側

2 OSは何をするか
 2-1 タスク
 2-2 タスクコントロールブロック(TCB)
 2-3 可変長メモリプール


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


Copyright 2001 藤倉俊幸