サービスプロファイル

有効・無効を示すプロファイル

ある機能が有効か無効かを示すサービスプロファイルは、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_USERBUFTK_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(...)等を用いてプロファイル定義が提供されないケースを考慮した上で利用することが推奨される。