オリジナルOS「MicrOS」の設計と実装(3) ―― MicrOSのシステム・コール
2.アプリケーションで作成する関数
以下ではアプリケーションで作成するaplMain関数について説明します.
void aplMain(void)
CA850はリセット起動でスタートアップ・ルーチンを呼び出すようなプログラムを生成します.スタートアップ・ルーチンは開発システムが値を決めるtp,gp,epとctbpというようなすべての関数で共通に使用するレジスタの設定とRAM領域の初期化を行った後,_main関数をコールします._main関数はアプリケーション・システムのスタートのための関数ですが,ここにはMicrOSの初期設定処理が記述されています.
MicrOSの初期設定処理には次の処理が含まれています.
- ハードウェア初期設定
- 動作クロックの設定
- メモリ・ウェイト数の設定
- システム・コントロール・ブロックの初期設定
- アプリケーション・システムの初期設定 (aplMain関数のコール)
- メモリ・アロケーション領域の初期設定
- マルチプログラミング制御のためのディスパッチャへのジャンプ
最初の3項目については,V850ハードウェア説明書の3.4.8項を参照してください.
システム・コントロール・ブロックの初期設定は領域のクリアとaplMainをコールするための準備処理です.aplMainの処理が終了するとシステム・コントロール・ブロックの中のTCB領域が確定するので残りの領域をメモリ・アロケーション領域に割り当てます.
aplMain関数はアプリケーション・システムの初期設定を行う関数で,主な処理はタスク登録です.アプリケーション・システムを構成するタスクはすべてaplMainの中で登録しなければなりません.
aplMainには次の処理を組み込みます.
- ハードウェアの初期状態
- UARTの初期設定
- デバッグ関数の初期設定
- タスクの登録
- システム共通変数の初期設定
アプリケーションによって初期状態が確定されなければならないハードウェアは,ここで初期設定します.
UARTの初期設定をタスク登録の前に行うのはコマンド・タスクやコマンド・コールバック関数を登録する可能性があるからです.これらの機能を使わなければ,取り外すこともできます.デバッグ関数の初期設定をここで行うのは特に意味がありません.デバッグ関数を使う前であればどこでも行えます.
MicrOSに登録するタスクの数は,システム・コントロール・ブロックのサイズによります.これ以外の制限は特にありませんが,aplMainはデフォルトで__aplTCBListに登録したIDを保存するようにコーディングされています.従って,__aplTCBListの容量で制限されることになります.
MicrOSには,インターバル・タイマの割り込み処理を割り込みの中で処理する方法と,タスクを起動して処理する方法が実装されています.タイマ・コールバック関数の処理をタスクで行うようになっているとき,MicrOSはタイマ・タスクをアクティブにしなければなりません.このときにタイマ・タスクのIDを知っていなければなりません.MicrOSはこれをtmrTCBの名称で参照します.この値は,MicrOS.cの先頭でタイマ・タスクのIDを示すようにしておかなければなりません(デフォルトは__aplTCBList[0]).MicrOSのコマンド処理については,UARTの割り込み処理の中で処理するか,タスクの中で処理するかを選択できるようになっています.MicrOScmdがタスクで使われたときにタスクのIDを必要としますが,こちらは_uartsetcb関数でUARTドライバに登録することになるので,タイマ・タスクのような考慮は不要です.
最後にアプリケーション・システムの共通変数の初期設定を行います.このときにメモリ・アロケーションのシステム・コールは発行できないことに注意してください.メモリ・アロケーションのシステム・コールは,aplMainが処理を終えない限り使うことができません.
tag: OS