μT-Kernelではサブシステムおよびデバイスドライバの起動について特に定めないが、移植性の観点から、可能ならばT-Kernelと同じ形式のエントリルーチンを用意することが望ましい。
![]() | 補足事項 |
---|---|
μT-Kernel 2.0の仕様ではないが、ここでは参考までにT-Kernel形式のエントリルーチンの説明を行う。 |
T-Kernelではサブシステムおよびデバイスドライバは次のようなエントリーを持つ。
ER main( INT ac, UB *av[] ) { if ( ac >= 0 ) { /* サブシステム/デバイスドライバ起動処理 */ } else { /* サブシステム/デバイスドライバ終了処理 */ } return ercd; }
このエントリールーチンは、サブシステムおよびデバイスドライバの起動処理または終了処理を行うだけで、実際のサービスの提供は行わない。起動処理または終了処理が済んだら直ちに呼出元に戻らなければならない。エントリールーチンは、できるだけ速やかに実行し、呼出元に戻らなければならない。
エントリールーチンは、通常はシステムの起動時および終了時にシステムリソースグループに属するタスクから呼び出され、システム全体の起動処理タスクまたは終了処理タスクのコンテキスト(保護レベル0)で実行される。なお、実装によっては、準タスク部として実行される場合がある。また、サブシステムやデバイスドライバの動的なロードをサポートしているシステムにおいては、システムの起動時および終了時以外に呼び出される場合もある。
複数のサブシステムおよびデバイスドライバがあるとき、システムの起動時および終了時のエントリールーチンの呼出は、一つずつ順番に行われる。複数のエントリールーチンが異なるタスクから同時に呼び出されることはない。したがって、サブシステムまたはデバイスドライバ間で初期化順序に依存関係があるような場合、エントリールーチンから戻る前に必要な処理をすべて終わらせておくことで、初期化の順序関係を維持することができる。
エントリールーチンの関数名は通常は main
であるが、OSとリンクする場合など main
が使用できない場合は任意の名称としてよい。
ac
≧0の場合、起動処理となる。サブシステムおよびデバイスドライバの初期化処理を行った後、サブシステムおよびデバイスドライバを登録する。
戻値として負の値(エラー)を返した場合は起動処理の失敗とみなされる。μT-Kernelの実装によっては、このサブシステムまたはデバイスドライバをメモリから削除してしまう場合があるので、サブシステムおよびデバイスドライバの登録を行った状態でエラーを戻してはいけない。エラーを戻すときは、必ず登録を抹消しておかなければならない。また、獲得したリソースも解放しておく必要がある。自動的には解放されない。
ac
, av
は C言語の標準的な main()
の引数と同じである。ac
にパラメータ数、av
は ac
+1個分のポインタの配列で、文字列のパラメータを指している。配列の終端(av
[ac
])は NULL である。
av[0]
は、サブシステムまたはデバイスドライバの名称である。一般的には、サブシステムまたはデバイスドライバが格納されたファイル名などになるが、どのような名称が格納されるかは実装定義である。名称なし(空文字列 "")であってもよい。
av[1]
以降のパラメータは、各サブシステムおよびデバイスドライバごとに定義される。
av
の指す文字列の領域は、エントリールーチンから抜けると消滅するため、必要に応じてパラメータは別の場所に保存しなければならない。
ac
<0の場合、終了処理となる。サブシステムおよびデバイスドライバの登録を抹消した後、獲得したリソースなどを解放する。終了処理中にエラーが発生した場合も、終了処理を中止してはいけない。可能な限り処理する。一部が正常に終了処理できなかった場合は、戻値にエラーを返す。
サブシステムおよびデバイスドライバに対する要求を処理中の状態で、終了処理が呼び出された場合の動作は、サブシステムおよびデバイスドライバの実装に依存する。一般的には、終了処理はシステム終了時に呼び出されることを前提とするため、処理中の要求がないのが普通である。そのため、処理中の要求があった場合の動作は保証されないのが普通である。