ある機能が有効か無効かを示すサービスプロファイルは、TRUE, FALSE のいずれかに定義された以下のマクロによってそれぞれ規定される。(以下の定義はあくまで例であり、実際の各プロファイルの値については実装に応じて適切に定義しなければならない。)
#define TK_STDTK FALSE /* 標準T-Kernel (必ずFALSE) */ #define TK_MICROTK TRUE /* μT-Kernel (必ずTRUE) */ #define TK_ALLOW_MISALIGN FALSE /* メモリのミスアラインアクセスが可能 */ #define TK_BIGENDIAN FALSE /* ビッグエンディアン(定義必須) */ #define TK_VIRTUAL_ADDRESS TRUE /* 仮想アドレスを利用(物理メモリ != 論理メモリ) */ #define TK_VIRTUAL_MEMORY FALSE /* 仮想記憶が存在する(非常駐メモリが存在) */ #define TK_TRAP_SVC FALSE /* システムコールエントリにCPUのトラップ命令を利用 */ #define TK_HAS_DOUBLEWORD FALSE /* 64ビットデータ型(D, UD, VD)のサポート */ #define TK_SUPPORT_SERCD FALSE /* サブエラーコードのサポート */ #define TK_HAS_SYSSTACK FALSE /* タスクが独立したシステムスタックを持つ */ #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_RESOURCE FALSE /* リソースグループのサポート */ #define TK_SUPPORT_USERBUF TRUE /* ユーザバッファ指定(TA_USERBUF)のサポート */ #define TK_SUPPORT_AUTOBUF FALSE /* 自動バッファ割当て(TA_USERBUF指定なし)のサポート */ #define TK_SUPPORT_SLICETIME TRUE /* タスクスライスタイム設定(tk_chg_slt)のサポート */ #define TK_SUPPORT_TASKINF TRUE /* タスク統計情報取得機能(tk_inf_tsk)のサポート */ #define TK_SUPPORT_USEC FALSE /* マイクロ秒のサポート */ #define TK_SUPPORT_TASKSPACE FALSE /* タスク固有空間のサポート */ #define TK_SUPPORT_TASKEVENT FALSE /* タスクイベント機能のサポート */ #define TK_SUPPORT_DISWAI FALSE /* 待ち禁止のサポート */ #define TK_SUPPORT_REGOPS FALSE /* レジスタの取得・設定機能のサポート */ #define TK_SUPPORT_ASM TRUE /* アセンブリによる処理ルーチンのサポート */ #define TK_SUPPORT_DSNAME FALSE /* DSオブジェクト名称のサポート */ #define TK_SUPPORT_TASKEXCEPTION FALSE /* タスク例外処理機能のサポート */ #define TK_SUPPORT_LOWPOWER TRUE /* 省電力管理機能のサポート */ #define TK_SUPPORT_SSYEVENT FALSE /* サブシステムのイベント処理のサポート */ #define TK_SUPPORT_LARGEDEV FALSE /* 大容量デバイス(64ビット)のサポート */ #define TK_SUPPORT_INTCTRL TRUE /* 割込みコントローラ制御関連機能のサポート */ #define TK_HAS_ENAINTLEVEL TRUE /* 割込みの優先度指定あり */ #define TK_SUPPORT_CPUINTLEVEL TRUE /* CPU内割込みマスクレベル取得・設定機能のサポート */ #define TK_SUPPORT_CTRLINTLEVEL TRUE /* 割込みコントローラ内割込みマスクレベル 設定・取得機能のサポート */ #define TK_SUPPORT_INTMODE TRUE /* 割込みモード設定機能のサポート */ #define TK_SUPPORT_SYSCONF FALSE /* システム構成情報取得機能のサポート */ #define TK_SUPPORT_IOPORT TRUE /* I/Oポートアクセス機能のサポート */ #define TK_SUPPORT_MICROWAIT TRUE /* 微小待ち機能のサポート */ #define TK_SUPPORT_CACHECTRL TRUE /* キャッシュ制御機能のサポート */ #define TK_SUPPORT_WBCACHE TRUE /* ライトバックキャッシュのサポート */ #define TK_SUPPORT_WTCACHE TRUE /* ライトスルーキャッシュのサポート */ #define TK_SUPPORT_SYSMEMBLK FALSE /* システムメモリ割当て機能のサポート */ #define TK_SUPPORT_MEMLIB FALSE /* メモリ割当てライブラリのサポート */ #define TK_SUPPORT_ADDRSPACE FALSE /* アドレス空間管理機能のサポート */ #define TK_SUPPORT_PTIMER TRUE /* 物理タイマ機能のサポート */ #define TK_SUPPORT_DBGSPT FALSE /* T-Kernel/DSのサポート */
μT-Kernel 2.0の各実装では前述のプロファイルはすべて定義されなければならないが、プロファイル定義の提供されないT-KernelシリーズのOSやプロファイルの漏れなどを想定し、未定義の場合も考慮したプロファイルの利用が推奨される。例えば、有効・無効・未定義を全て区別して扱う場合には、たとえば以下のような条件判定を行えば良い。
#if defined(TK_SUPPORT_xxx) #if TK_SUPPORT_xxx /* プロファイルが有効に定義されている場合 */ #else /* プロファイルが無効に定義されている場合 */ #endif #else /* プロファイルが未定義の場合 */ #endif
なお、以下のようにプロファイル定義をそのまま条件とした場合、有効の場合と無効または未定義の場合を分けた条件判定となる。
#if TK_SUPPORT_xxx /* プロファイルが有効に定義されている場合 */ #else /* プロファイルが無効または未定義の場合 */ #endif
![]() | 補足事項 |
---|---|
TK_SUPPORT_USERBUF と TK_SUPPORT_AUTOBUF の両方をFALSEに設定することはできない。 TK_SUPPORT_USEC および TK_SUPPORT_LARGEDEV は、TK_HAS_DOUBLEWORD に依存する。すなわち、TK_HAS_DOUBLEWORD が無効であるとき、これら二つのプロファイルはいずれも無効となる。 |
上限値やバージョン番号などを示すサービスプロファイルは、その値を示すマクロとして規定される。(以下の定義はあくまで一例であり、実際のプロファイルの値については実装依存である。)
#define TK_SPECVER_MAJOR 2 /* μT-Kernelのメジャーバージョン番号 */ #define TK_SPECVER_MINOR 0 /* μT-Kernelのマイナーバージョン番号 */ #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 /* セマフォカウントの最大値 (>= 32767) */ #define TK_SUSPEND_MAXCNT 65535 /* タスクの強制待ち要求の最大キューイング数 */ #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(...)等を用いてプロファイル定義が提供されないケースを考慮した上で利用することが推奨される。