μT-Kernel 3.0のサービスプロファイルを以下に示す。これらのサービスプロファイルを定義することは必須である。なお、このほかにOSの実装者が独自のサービスプロファイルの定義を追加することは構わない。
ある機能が有効か無効かを示すサービスプロファイルは、TRUE、FALSE のいずれかに定義された以下のマクロによってそれぞれ規定される。(以下の定義はあくまで例であり、実際の各プロファイルの値については実装に応じて適切に定義しなければならない。)
#define TK_SUPPORT_TASKEVENT TRUE /* タスクイベント関連機能のサポート */ #define TK_SUPPORT_DISWAI TRUE /* タスクの待ち禁止状態のサポート */ #define TK_SUPPORT_IOPORT TRUE /* I/Oポートアクセス機能のサポート */ #define TK_SUPPORT_MICROWAIT TRUE /* 微小待ち機能のサポート */
TK_SUPPORT_TASKEVENT、TK_SUPPORT_DISWAIは、高機能で汎用性の高いデバイスドライバを使用するシステムではTRUEを推奨する。
TK_SUPPORT_IOPORT、TK_SUPPORT_MICROWAITは、一般にはTRUEを推奨する。
#define TK_SUPPORT_LOWPOWER TRUE /* 省電力機能のサポート */
TK_SUPPORT_LOWPOWERは、TRUEを推奨する。ただし、省電力の要求の強くないシステムや、ハードウェア上の制約のあるシステムでは、FALSEでよい。
#define TK_SUPPORT_USERBUF FALSE /* ユーザバッファ指定(TA_USERBUF)のサポート */ #define TK_SUPPORT_AUTOBUF TRUE /* 自動バッファ割当て(TA_USERBUF指定なし)のサポート */ #define TK_SUPPORT_MEMLIB TRUE /* メモリ割当てライブラリのサポート */
TK_SUPPORT_USERBUFは、一般にはFALSEを推奨する。
TK_SUPPORT_AUTOBUFは、一般にはTRUEを推奨する。
ただし、メモリ管理を静的に行うシステムでは、TK_SUPPORT_USERBUFをTRUEとし、TK_SUPPORT_AUTOBUFをFALSEとしてもよい。
TK_SUPPORT_USERBUFとTK_SUPPORT_AUTOBUFの両方をFALSEとすることはできない。
TK_SUPPORT_MEMLIBは、一般にはTRUEを推奨する。
#define TK_SUPPORT_TASKEXCEPTION TRUE /* タスク例外処理機能のサポート */
TK_SUPPORT_TASKEXCEPTIONは、複数のソフトウェアモジュールで構成され、柔軟な異常系の処理を必要とするような、比較的大規模なシステムではTRUEを推奨する。
#define TK_SUPPORT_SUBSYSTEM TRUE /* サブシステム管理機能のサポート */ #define TK_SUPPORT_SSYEVENT TRUE /* サブシステムのイベント処理のサポート */
TK_SUPPORT_SUBSYSTEM、TK_SUPPORT_SSYEVENTは、ミドルウェアを利用するような、比較的大規模なシステムではTRUEを推奨する。
#define TK_SUPPORT_SYSCONF FALSE /* システム構成情報管理機能のサポート */
TK_SUPPORT_SYSCONFは、システム構成情報(タスクなどのオブジェクトの最大数など)の指定を静的に行うシステム、たとえばOSのビルド時にシステム構成情報をハードコーティングするようなシステムではFALSEとする。一方、システム構成情報の指定を柔軟に行うシステムではTRUEとする。
#define TK_HAS_DOUBLEWORD FALSE /* 64ビットデータ型(D, UD, VD)のサポート */ #define TK_SUPPORT_USEC FALSE /* マイクロ秒のサポート */ #define TK_SUPPORT_LARGEDEV FALSE /* 大容量デバイス(64ビット)のサポート */ #define TK_SUPPORT_SERCD TRUE /* サブエラーコードのサポート */
TK_HAS_DOUBLEWORD、TK_SUPPORT_USEC、TK_SUPPORT_LARGEDEVは、対象となるハードウェアやシステムの用途に依存して、TRUEまたはFALSEとする。
TK_HAS_DOUBLEWORD がFALSEであるとき、TK_SUPPORT_USEC および TK_SUPPORT_LARGEDEV もFALSEとなる。
TK_SUPPORT_SERCDは、INTやERが32ビットのシステムではTRUEを推奨し、INTやERが16ビットのシステムではFALSEを推奨する。
以下のプロファイルは、対象となるハードウェアやOSの実装に依存して、TRUEまたはFALSEとする。
#define TK_SUPPORT_INTCTRL TRUE /* 割込みコントローラ制御機能のサポート */ #define TK_HAS_ENAINTLEVEL TRUE /* 割込み優先度の指定が可能 */ #define TK_SUPPORT_CPUINTLEVEL FALSE /* CPU内割込みマスクレベルのサポート */ #define TK_SUPPORT_CTRLINTLEVEL TRUE /* 割込みコントローラ内割込みマスクレベルのサポート */ #define TK_SUPPORT_INTMODE TRUE /* 割込みモード設定機能のサポート */
#define TK_SUPPORT_CACHECTRL TRUE /* メモリキャッシュ制御機能のサポート */ #define TK_SUPPORT_SETCACHEMODE TRUE /* キャッシュモード設定機能のサポート */ #define TK_SUPPORT_WBCACHE FALSE /* ライトバックキャッシュのサポート */ #define TK_SUPPORT_WTCACHE TRUE /* ライトスルーキャッシュのサポート */
#define TK_SUPPORT_FPU TRUE /* FPU機能のサポート */ #define TK_SUPPORT_COP0 TRUE /* 番号0のコプロセッサ利用機能のサポート */ #define TK_SUPPORT_COP1 FALSE /* 番号1のコプロセッサ利用機能のサポート */ #define TK_SUPPORT_COP2 FALSE /* 番号2のコプロセッサ利用機能のサポート */ #define TK_SUPPORT_COP3 FALSE /* 番号3のコプロセッサ利用機能のサポート */
#define TK_SUPPORT_ASM FALSE /* アセンブリ言語による処理ルーチンのサポート */ #define TK_SUPPORT_REGOPS FALSE /* タスクレジスタ取得・設定機能のサポート */ #define TK_ALLOW_MISALIGN FALSE /* メモリのミスアラインアクセスが可能 */ #define TK_BIGENDIAN FALSE /* ビッグエンディアン(定義必須) */ #define TK_TRAP_SVC TRUE /* システムコールの呼び出しにCPUのトラップ命令を利用 */ #define TK_HAS_SYSSTACK TRUE /* タスクが独立したシステムスタックを持つ */ #define TK_SUPPORT_PTIMER TRUE /* 物理タイマ機能のサポート */ #define TK_SUPPORT_UTC TRUE /* UNIX表現のシステム時刻のサポート */ #define TK_SUPPORT_TRONTIME FALSE /* TRON表現のシステム時刻のサポート */
TK_SUPPORT_UTC と TK_SUPPORT_TRONTIME の少なくとも一方はTRUEでなければならない。
#define TK_SUPPORT_DSNAME FALSE /* DSオブジェクト名称のサポート */ #define TK_SUPPORT_DBGSPT FALSE /* μT-Kernel/DSのサポート */
TK_SUPPORT_DSNAME、TK_SUPPORT_DBGSPTは、必要に応じてTRUEまたはFALSEとする。
なお、TK_SUPPORT_DBGSPTは、μT-Kernel/DSのAPIのうち、td_ref_dsname と td_set_dsname 以外のAPIの利用の可否を示す。TK_SUPPORT_DBGSPTがFALSEであっても、TK_SUPPORT_DSNAMEがTRUEであれば、td_ref_dsname と td_set_dsname を利用できる。
μT-Kernel 3.0の各実装では前述のプロファイルはすべて定義されなければならないが、プロファイル定義の提供されない他のOSやプロファイルの漏れなどを想定し、未定義の場合も考慮したプロファイルの利用が推奨される。例えば、有効・無効・未定義を全て区別して扱う場合には、たとえば以下のような条件判定を行えば良い。
#if defined(TK_SUPPORT_xxx) #if TK_SUPPORT_xxx /* プロファイルが有効に定義されている場合 */ #else /* プロファイルが無効に定義されている場合 */ #endif #else /* プロファイルが未定義の場合 */ #endif
ここで、もし以下のようにプロファイル定義をそのまま "#if" の条件として使うと、このプロファイルを無効として定義していた場合と、このプロファイルが未定義だった場合との区別ができない。
#if TK_SUPPORT_xxx /* プロファイルが有効に定義されている場合 */ #else /* プロファイルが無効または未定義の場合 */ #endif
上限値やバージョン番号などを示すサービスプロファイルは、その値を示すマクロとして規定される。(以下の定義はあくまで一例であり、実際のプロファイルの値については実装依存である。)
#define TK_SPECVER_MAGIC 6 /* μT-KernelのMAGIC */ #define TK_SPECVER_MAJOR 3 /* 仕様書のメジャーバージョン番号 */ #define TK_SPECVER_MINOR 0 /* 仕様書のマイナーバージョン番号 */ #define TK_SPECVER ((TK_SPECVER_MAJOR << 8) | TK_SPECVER_MINOR) /* μT-Kernelのバージョン番号 */ #define TK_MAX_TSKPRI 32 /* 最大タスク優先度 (>= 16) */ #define TK_WAKEUP_MAXCNT 65535 /* タスクの起床要求の最大キューイング数 (>= 1) */ #define TK_SEMAPHORE_MAXCNT 65535 /* セマフォ資源数の最大値(maxsem)の上限値 (>= 32767) */ #define TK_SUSPEND_MAXCNT 65535 /* タスクの強制待ち要求の最大ネスト数 (>= 1) */ #define TK_MEM_RNG0 0 /* TA_RNG0の実際のメモリ保護レベル (0〜3) */ #define TK_MEM_RNG1 0 /* TA_RNG1の実際のメモリ保護レベル (0〜3) */ #define TK_MEM_RNG2 0 /* TA_RNG2の実際のメモリ保護レベル (0〜3) */ #define TK_MEM_RNG3 3 /* TA_RNG3の実際のメモリ保護レベル (0〜3) */ #define TK_MAX_PTIMER 2 /* 最大物理タイマ番号 (>= 0) (物理タイマ番号に1〜TK_MAX_PTIMERが指定可) */
TK_MEM_RNGn は、TA_RNGnで指定されたメモリの実際のメモリ保護レベルを指し、TK_MEM_RNGn == TK_MEM_RNGm ならば、メモリアクセスの保護レベルについてTA_RNGnとTA_RNGmが同一であることを示す。すなわち、保護レベルが n のメモリを、保護レベル m を持つタスクからアクセスしてもアクセス権違反の例外が生じないことが保証される。
なお、値を持つサービスプロファイルに対しても、defined(...)等を用いてプロファイル定義が提供されないケースを考慮した上で利用することが推奨される。
以下にサービスプロファイルの具体例を示す。
#define TK_SUPPORT_TASKEVENT FALSE #define TK_SUPPORT_DISWAI FALSE #define TK_SUPPORT_IOPORT TRUE #define TK_SUPPORT_MICROWAIT TRUE #define TK_SUPPORT_LOWPOWER TRUE #define TK_SUPPORT_USERBUF TRUE #define TK_SUPPORT_AUTOBUF FALSE #define TK_SUPPORT_MEMLIB FALSE #define TK_SUPPORT_TASKEXCEPTION FALSE #define TK_SUPPORT_SUBSYSTEM FALSE #define TK_SUPPORT_SSYEVENT FALSE #define TK_SUPPORT_SYSCONF FALSE #define TK_HAS_DOUBLEWORD FALSE #define TK_SUPPORT_USEC FALSE #define TK_SUPPORT_LARGEDEV FALSE #define TK_SUPPORT_SERCD FALSE #define TK_SUPPORT_INTCTRL FALSE #define TK_HAS_ENAINTLEVEL FALSE #define TK_SUPPORT_CPUINTLEVEL FALSE #define TK_SUPPORT_CTRLINTLEVEL FALSE #define TK_SUPPORT_INTMODE TRUE #define TK_SUPPORT_CACHECTRL FALSE #define TK_SUPPORT_SETCACHEMODE FALSE #define TK_SUPPORT_WBCACHE FALSE #define TK_SUPPORT_WTCACHE FALSE #define TK_SUPPORT_FPU FALSE #define TK_SUPPORT_COP0 FALSE #define TK_SUPPORT_COP1 FALSE #define TK_SUPPORT_COP2 FALSE #define TK_SUPPORT_COP3 FALSE #define TK_SUPPORT_ASM TRUE #define TK_SUPPORT_REGOPS FALSE #define TK_ALLOW_MISALIGN FALSE #define TK_BIGENDIAN FALSE #define TK_TRAP_SVC FALSE #define TK_HAS_SYSSTACK FALSE #define TK_SUPPORT_PTIMER FALSE #define TK_SUPPORT_UTC TRUE #define TK_SUPPORT_TRONTIME FALSE #define TK_SUPPORT_DSNAME FALSE #define TK_SUPPORT_DBGSPT FALSE #define TK_SPECVER_MAGIC 6 #define TK_SPECVER_MAJOR 3 #define TK_SPECVER_MINOR 0 #define TK_SPECVER ((TK_SPECVER_MAJOR << 8) | TK_SPECVER_MINOR) #define TK_MAX_TSKPRI 16 #define TK_WAKEUP_MAXCNT 4095 #define TK_SEMAPHORE_MAXCNT 4095 #define TK_SUSPEND_MAXCNT 4095 #define TK_MEM_RNG0 0 #define TK_MEM_RNG1 0 #define TK_MEM_RNG2 0 #define TK_MEM_RNG3 0 #define TK_MAX_PTIMER 0
#define TK_SUPPORT_TASKEVENT TRUE #define TK_SUPPORT_DISWAI TRUE #define TK_SUPPORT_IOPORT TRUE #define TK_SUPPORT_MICROWAIT TRUE #define TK_SUPPORT_LOWPOWER TRUE #define TK_SUPPORT_USERBUF FALSE #define TK_SUPPORT_AUTOBUF TRUE #define TK_SUPPORT_MEMLIB TRUE #define TK_SUPPORT_TASKEXCEPTION TRUE #define TK_SUPPORT_SUBSYSTEM TRUE #define TK_SUPPORT_SSYEVENT TRUE #define TK_SUPPORT_SYSCONF TRUE #define TK_HAS_DOUBLEWORD TRUE #define TK_SUPPORT_USEC TRUE #define TK_SUPPORT_LARGEDEV TRUE #define TK_SUPPORT_SERCD TRUE #define TK_SUPPORT_INTCTRL TRUE #define TK_HAS_ENAINTLEVEL TRUE #define TK_SUPPORT_CPUINTLEVEL FALSE #define TK_SUPPORT_CTRLINTLEVEL TRUE #define TK_SUPPORT_INTMODE TRUE #define TK_SUPPORT_CACHECTRL TRUE #define TK_SUPPORT_SETCACHEMODE TRUE #define TK_SUPPORT_WBCACHE TRUE #define TK_SUPPORT_WTCACHE TRUE #define TK_SUPPORT_FPU TRUE #define TK_SUPPORT_COP0 TRUE #define TK_SUPPORT_COP1 FALSE #define TK_SUPPORT_COP2 FALSE #define TK_SUPPORT_COP3 FALSE #define TK_SUPPORT_ASM TRUE #define TK_SUPPORT_REGOPS TRUE #define TK_ALLOW_MISALIGN FALSE #define TK_BIGENDIAN FALSE #define TK_TRAP_SVC TRUE #define TK_HAS_SYSSTACK TRUE #define TK_SUPPORT_PTIMER TRUE #define TK_SUPPORT_UTC TRUE #define TK_SUPPORT_TRONTIME FALSE #define TK_SUPPORT_DSNAME TRUE #define TK_SUPPORT_DBGSPT TRUE #define TK_SPECVER_MAGIC 6 #define TK_SPECVER_MAJOR 3 #define TK_SPECVER_MINOR 0 #define TK_SPECVER ((TK_SPECVER_MAJOR << 8) | TK_SPECVER_MINOR) #define TK_MAX_TSKPRI 140 #define TK_WAKEUP_MAXCNT 65535 #define TK_SEMAPHORE_MAXCNT 65535 #define TK_SUSPEND_MAXCNT 65535 #define TK_MEM_RNG0 0 #define TK_MEM_RNG1 0 #define TK_MEM_RNG2 0 #define TK_MEM_RNG3 3 #define TK_MAX_PTIMER 10