メインページ | モジュール | 名前空間一覧 | クラス階層 | 構成 | ファイル一覧 | 名前空間メンバ | 構成メンバ | ファイルメンバ | 関連ページ

カーネルオブジェクト管理

μITRONのカーネルオブジェクトを管理するためのテンプレートクラス群 [詳細]

構成

class  alarmhandler
 アラームハンドラ機能をカプセル化したテンプレートクラス [詳細]

class  alarmhandler_body
 アラームハンドラの本体動作を定義する基底クラス [詳細]

class  cpuexception
 CPU例外処理の機能をカプセル化したテンプレートクラス. [詳細]

class  cpuexception_body
 CPU例外処理ハンドラの本体動作を定義する基底クラス. [詳細]

class  cpulock
 CPUロック状態の制御をカプセル化したテンプレートクラス. [詳細]

class  cyclichandler
 周期ハンドラの機能をカプセル化したテンプレートクラス [詳細]

class  cyclichandler_body
 周期ハンドラの本体動作を定義する基底クラス [詳細]

class  dataqueue
 データキューの機能をカプセル化したテンプレートクラス [詳細]

class  dispatcher
 ディスパッチャの制御をカプセル化したテンプレートクラス [詳細]

struct  dispatcher::pending
 ディスパッチ保留状態参照クラス [詳細]

class  eventflag
 イベントフラグの機能をカプセル化したテンプレートクラス [詳細]

class  fmempool
 固定長メモリプールの機能をカプセル化したテンプレートクラス [詳細]

struct  has_obj
 カーネルが指定したカーネルオブジェクトをサポートしているかどうかを判別する [詳細]

struct  has_svc
 カーネルが指定したサービスコールをサポートしているかどうかを判別する [詳細]

class  interrupt
 割り込みを管理・制御するテンプレートクラス [詳細]

class  interrupthandler
 割込みハンドラを管理・制御するテンプレートクラス [詳細]

class  interrupthandler_body
 割込みハンドラの本体動作を定義する基底クラス [詳細]

class  isr
 割込みサービスルーチンの機能をカプセル化したテンプレートクラス [詳細]

class  isr_body
 割込みサービスルーチンの本体動作を定義する基底クラス [詳細]

class  kernelstatus
 カーネル状態に関する操作をカプセル化したテンプレートクラス [詳細]

struct  kernelstatus::context
 実行中コンテキスト参照クラス [詳細]

class  mailbox
 メールボックスの機能をカプセル化したテンプレートクラス [詳細]

class  messagebuffer
 メッセージバッファの機能をカプセル化したテンプレートクラス [詳細]

class  mutex
 ミューテックスの機能をカプセル化したテンプレートクラス [詳細]

class  non_task_context_body
 非タスクコンテキストのハンドラ本体定義用基底クラス [詳細]

class  object_controller
 カーネルオブジェクトの生成・削除・状態参照を制御するクラス [詳細]

class  object_id
 カーネルオブジェクトのID番号を管理するクラス [詳細]

class  overrunhandler
 オーバーランハンドラの機能をカプセル化したテンプレートクラス [詳細]

class  overrunhandler_body
 オーバーランハンドラの本体動作を定義する基底クラス [詳細]

class  readyqueue
 レディキューの操作をカプセル化したテンプレートクラス [詳細]

class  rendezvous
 ランデブ番号をカプセル化したテンプレートクラス [詳細]

class  rendezvousport
 ランデブポートの機能をカプセル化したテンプレートクラス [詳細]

class  semaphore
 セマフォの機能をカプセル化したテンプレートクラス [詳細]

class  systemtime
 システム時刻に関する操作をカプセル化したテンプレートクラス [詳細]

class  task
 タスク機能をカプセル化したテンプレートクラス [詳細]

class  task_body
 タスク本体のデータおよび動作を定義する基底クラス [詳細]

class  task_body::terminator
 自タスクを終了させる場合にスローする例外クラス [詳細]

class  task_context_body
 タスクコンテキストの本体定義用基底クラス [詳細]

class  taskexception
 タスク例外処理機能をカプセル化したテンプレートクラス [詳細]

class  taskexception_body
 タスク例外処理ルーチンの本体動作を定義する基底クラス [詳細]

class  timer
 ブロック終端までの計時クラス [詳細]

class  vmempool
 可変長メモリプールの機能をカプセル化したテンプレートクラス [詳細]

class  xsystemtime
 性能評価用システム時刻に関する操作をカプセル化したテンプレートクラス [詳細]


関数

template<class Body> void toppers::alarmhandler_entry (VP_INT)
 アラームハンドラのテンプレート

template<class Body> void toppers::cpuexception_entry (VP p_exinf)
 CPU例外ハンドラのテンプレート.

template<class Body> void toppers::cyclichandler_entry (VP_INT)
 周期ハンドラのテンプレート

template<class Body> void toppers::interrupthandler_entry ()
 割込みハンドラのテンプレート

template<class Body> void toppers::isr_entry (VP_INT)
 割込みサービスルーチンのテンプレート

template<bool Sense> bool toppers::sense_kernel ()
 カーネルが動作中かどうかを判別する。

template<class Body> void toppers::overrunhandler_entry (ID, VP_INT)
 オーバーランハンドラのテンプレート

template<class Body> void toppers::task_entry (VP_INT)
 タスクの起動番地として指定するためのテンプレート関数

template<class Body> void toppers::taskexception_entry (TEXPTN texptn, VP_INT exinf)
 タスク例外処理ルーチンのテンプレート


解説

  カーネルオブジェクト管理モジュールは、TOPPERS カーネルの機能の大部分をラッピングするための クラス群であり、本ライブラリの中核となるモジュールにあたる。
  本モジュールでは、カーネルを管理・制御するための要素の多くをパラメータ化している。以下に、 それらのパラメータを記載する。


共通のテンプレート引数
  本モジュールに属している主要なテンプレートクラスは、そのテンプレート引数として、以下に挙げる ものの一部または全部を有している。

カーネルオブジェクトID番号(ID Id ):
  本ライブラリでは、ID番号は各クラスのテンプレート引数として指定することで、型の一部に 埋め込まれる。これにより、型を指定することでカーネルオブジェクトを特定することが可能に なり、カーネルオブジェクト自体を静的なパラメータとすることを可能にする。
  テンプレート引数Id に0を指定(デフォルトは0)した場合、インスタンス内部にID番号を保持 することができる。これにより、実行時にインスタンスとID番号を関連付けることができる。
  負のID番号には対応していない。ただし、テンプレート引数Id を0にし、動的に負のID番号に 関連付けることはできる。
  多くの場合、Id のデフォルト値は0である。
プログラム診断ポリシー(class Diagnostics ):
  サービスコールの呼出しに失敗した場合等の動作を規定する。
  テンプレート引数にDiagnostics を持つクラスは、Diagnostics から private 継承している。 そのため、Diagnostics は、プログラム診断という本来の用途を超えて、各クラスの動作を細かく カスタマイズすることができる。例えば、Diagnostics に仮想デストラクタやその他の仮想関数を 定義することで、動的多態性を持たせることも可能である。
  多くの場合、Diagnostics のデフォルト値にはTOPPERS_DEFAULT_DIAGNOSIS が指定されている。 TOPPERS_DEFAULT_DIAGNOSIS は、ユーザが独自に定義しない限り、ignorant_diagnosis である。
サービスコールスタブポリシー(class Stub ):
  クラスのメンバ関数がカーネルにアクセスする際にしようするスタブを指定する。
  多くの場合、Stub のデフォルト値にはTOPPERS_DEFAULT_STUB が指定されている。 TOPPERS_DEFAULT_STUB は、ユーザが独自に定義しない限り、raw_stub<> である。
ボディ(Body ):
  タスク、およびハンドラや処理ルーチンが必要となるカーネルオブジェクトでは、ボディと呼ばれる クラスを定義することで、個別のデータや動作を定義する。
  ボディクラスはハンドラ等に用いる関数のテンプレート引数として指定する他、カーネルオブジェクトの 生成時にcreate メンバ関数のテンプレート引数として指定することもできる。

共通のメソッド
  本モジュールに属しているクラスの多くは、以下に挙げる共通のメソッドを有している。 こうした共通のメソッドを提供することにより、ライブラリの習得を容易にし、かつ上位のライブラリの ジェネリックな設計を支援する。

カーネルオブジェクトの生成(create ):
  カーネルオブジェクトの生成にはcreate という名称のメンバ関数を使用する。
  create メンバ関数はcreation 型へのポインタを引数として受け取るが、これは μITRON 4.0仕様のT_CYYY 構造体に相当する。
  create メンバ関数は、それが属しているクラスのテンプレート引数Id が0以外の 場合には、対応するcre_yyy サービスコールを呼出す。Id が0の場合には、対応する acre_yyy サービスコールを呼出し、自動的に割付けられたID番号をインスタンスに格納 する。

  create メンバ関数は、creation 型へのポインタを受け取る以外に、creation 型に含まれる各フィールドを個別に渡すこともできる。
  また、タスクの他、ハンドラや処理ルーチンを必要とするカーネルオブジェクトでは、 Body をテンプレート引数で指定する方法もある。
カーネルオブジェクトの削除(destroy ):
  カーネルオブジェクトの削除には@ destroy という名称のメンバ関数を使用する。 これは内部的にdel_yyy サービスコールを呼出すが、名称がdelete ではないのは、 C++の予約語と衝突するためである。
  クラスのテンプレート引数Id が0の場合、destroy メンバ関数によってカーネル オブジェクトが削除されると、それまで保持していたID番号がリセットされる。
カーネルオブジェクトの状態参照(refer ):
  カーネルオブジェクトの状態参照にはrefer という名称のメンバ関数を使用する。
  refer メンバ関数はreference 型へのポインタを引数として受け取るが、これは μITRON 4.0仕様のT_RYYY 構造体に相当する。
カーネルオブジェクトの定義(define ):
  カーネルオブジェクトの定義にはdefine という名称のメンバ関数を使用する
  define メンバ関数はdefinition 型へのポインタを引数として受け取るが、これは μITRON 4.0仕様のT_DYYY 構造体に相当し、内部的にdef_yyy サービスコールが 呼出される。

  define メンバ関数はcreate に類似するが、以下の点が異なる。
カーネルオブジェクトの定義取り消し(undefine ):
  カーネルオブジェクトの定義取り消しにはundefine という名称のメンバ関数を使用する
  このメンバ関数は、def_yyy サービスコールにNULL ポインタを渡すことで実現している。
生のID番号の取り出し(get_unsafe_id ):
  カーネルオブジェクトID番号を管理するクラスのインスタンスから、生のID番号を取り出すには get_unsafe_id という名称のフリー関数(非メンバ関数)を使用する。
  生のID番号を取得できると便利なことが多いが、反面クラスによるカプセル化を破綻させる危険性 も併せ持っている。 本ライブラリでは、ユーザにそうした危険性に対する注意を喚起する意味で、unsafe という 語を使用するとともに、メンバ関数ではなくフリー関数として提供している。

コンテキストの指定
  サービスコールによっては、タスクコンテキストと非タスクコンテキストの両方から使用できる。 どちらのコンテキスト用のサービスコールを呼出すかを指定するには、専用の列挙定数を用いる。


待機方法の指定
  μITRON では、タスクを待ち状態にする可能性のあるサービスコールでは、その待機方法として、 永久待ち、ポーリング、およびタイムアウト指定を選択することができる。
  カーネル本来の機能では、待機方法をパラメータ化するには、TMO 型の値指定によって実行時に 選択していたが、本ライブラリでは、下記の列挙定数を指定することでコンパイル時に選択することが 可能である。

関数の解説

template<class Body>
void toppers::alarmhandler_entry VP_INT  exinf  )  [inline]
 

参照:
alarmhandler_body
  テンプレート引数Body として指定したボディクラスを本体とするアラームハンドラを定義する。 この関数をT_CALM 構造体のalmhdr フィールドに設定することができる。

注意:
CRE_ALM (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。

template<class Body>
void cpuexception_entry VP  p_exinf  )  [inline]
 

参照:
cpuexception_body
  テンプレート引数Body として指定したボディクラスを本体とする CPU例外ハンドラを定義する。 この関数をT_DEXC 構造体のexchdr フィールドに設定することができる。

注意:
DEF_EXC (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。

template<class Body>
void toppers::cyclichandler_entry VP_INT  exinf  )  [inline]
 

  テンプレート引数Body として指定したボディクラスを本体とする周期ハンドラを定義する。 この関数をT_CCYC 構造体のcychdr フィールドに設定することができる。

注意:
CRE_CYC (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。
参照:
cyclichandler_body

template<class Body>
void toppers::interrupthandler_entry  )  [inline]
 

  テンプレート引数Body として指定したボディクラスを本体とする割込みハンドラを定義する。 この関数をT_DINH 構造体のinthdr フィールドに設定することができる。

注意:
DEF_INH (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。
参照:
interrupthandler_body

template<class Body>
void toppers::isr_entry VP_INT  exinf  )  [inline]
 

  テンプレート引数Body として指定したボディクラスを本体とする割込みサービスルーチンを定義する。 この関数をT_CISR 構造体のisr フィールドに設定することができる。

注意:
CRE_ISR (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。
参照:
isr_body

template<class Body>
void toppers::overrunhandler_entry ID  tskid,
VP_INT  exinf
[inline]
 

  テンプレート引数Body として指定したボディクラスを本体とするオーバーランハンドラを定義する。 この関数をT_DOVR 構造体のovrhdr フィールドに設定することができる。

注意:
DEF_OVR (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。
参照:
overrunhandler_body

template<bool Sense>
bool sense_kernel  )  [inline]
 

vsns_ini サービスコールを呼び出して、カーネルが動作中かどうかを判別する。
この関数は、テンプレート引数にfalse を指定すると常にfalse を返すため、必要に応じてカーネルの 動作状態判別を省略する場合に使用する。

template<class Body>
void toppers::task_entry VP_INT  exinf  )  [inline]
 

  テンプレート引数Body として指定したボディクラスを本体とするタスクを定義する。 この関数をT_CTSK 構造体のtask フィールドに設定することができる。

注意:
CRE_TSK (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。
参照:
task_body

template<class Body>
void toppers::taskexception_entry TEXPTN  texptn,
VP_INT  exinf
[inline]
 

  テンプレート引数Body として指定したボディクラスを本体とするタスク例外処理ルーチンを定義する。 この関数をT_DTEX 構造体のtexrtn フィールドに設定することができる。

注意:
DEF_TEX (静的 API )に対して使用する場合は、Cリンケージの関数で一旦ラッピングすること。
参照:
taskexception_body