サービスプロファイル

μT-Kernel 3.0のサービスプロファイルを以下に示す。これらのサービスプロファイルを定義することは必須である。なお、このほかにOSの実装者が独自のサービスプロファイルの定義を追加することは構わない。

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

ある機能が有効か無効かを示すサービスプロファイルは、TRUEFALSE のいずれかに定義された以下のマクロによってそれぞれ規定される。(以下の定義はあくまで例であり、実際の各プロファイルの値については実装に応じて適切に定義しなければならない。)

デバイスドライバ向け機能


#define TK_SUPPORT_TASKEVENT      TRUE   /* タスクイベント関連機能のサポート */
#define TK_SUPPORT_DISWAI         TRUE   /* タスクの待ち禁止状態のサポート */
#define TK_SUPPORT_IOPORT         TRUE   /* I/Oポートアクセス機能のサポート */
#define TK_SUPPORT_MICROWAIT      TRUE   /* 微小待ち機能のサポート */

TK_SUPPORT_TASKEVENTTK_SUPPORT_DISWAIは、高機能で汎用性の高いデバイスドライバを使用するシステムではTRUEを推奨する。

TK_SUPPORT_IOPORTTK_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_USERBUFTRUEとし、TK_SUPPORT_AUTOBUFFALSEとしてもよい。

TK_SUPPORT_USERBUFTK_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_SUBSYSTEMTK_SUPPORT_SSYEVENTは、ミドルウェアを利用するような、比較的大規模なシステムではTRUEを推奨する。

システム構成情報取得機能


#define TK_SUPPORT_SYSCONF        FALSE  /* システム構成情報管理機能のサポート */

TK_SUPPORT_SYSCONFは、システム構成情報(タスクなどのオブジェクトの最大数など)の指定を静的に行うシステム、たとえばOSのビルド時にシステム構成情報をハードコーティングするようなシステムではFALSEとする。一方、システム構成情報の指定を柔軟に行うシステムではTRUEとする。

64ビット対応、16ビット対応


#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_DOUBLEWORDTK_SUPPORT_USECTK_SUPPORT_LARGEDEVは、対象となるハードウェアやシステムの用途に依存して、TRUEまたはFALSEとする。

TK_HAS_DOUBLEWORDFALSEであるとき、TK_SUPPORT_USEC および TK_SUPPORT_LARGEDEVFALSEとなる。

TK_SUPPORT_SERCDは、INTやERが32ビットのシステムではTRUEを推奨し、INTやERが16ビットのシステムではFALSEを推奨する。

CPU、ハードウェア、システム、コンパイラ依存機能

以下のプロファイルは、対象となるハードウェアや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   /* ライトスルーキャッシュのサポート */

FPU(COP)サポート


#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_UTCTK_SUPPORT_TRONTIME の少なくとも一方はTRUEでなければならない。

デバッグサポート関連機能


#define TK_SUPPORT_DSNAME         FALSE  /* DSオブジェクト名称のサポート */
#define TK_SUPPORT_DBGSPT         FALSE  /* μT-Kernel/DSのサポート */

TK_SUPPORT_DSNAMETK_SUPPORT_DBGSPTは、必要に応じてTRUEまたはFALSEとする。

なお、TK_SUPPORT_DBGSPTは、μT-Kernel/DSのAPIのうち、td_ref_dsnametd_set_dsname 以外のAPIの利用の可否を示す。TK_SUPPORT_DBGSPTFALSEであっても、TK_SUPPORT_DSNAMETRUEであれば、td_ref_dsnametd_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_RNGnTA_RNGmが同一であることを示す。すなわち、保護レベルが n のメモリを、保護レベル m を持つタスクからアクセスしてもアクセス権違反の例外が生じないことが保証される。

なお、値を持つサービスプロファイルに対しても、defined(...)等を用いてプロファイル定義が提供されないケースを考慮した上で利用することが推奨される。

サービスプロファイルの具体例

以下にサービスプロファイルの具体例を示す。

16ビットCPUでごく小規模なシステムでのプロファイル例


#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