カーネル起動パラメータの設定
アプリケーションが使用するタスクやセマフォなどのカーネル資源の数や属性などを 設定ファイル(kernel_cfg.c及びkernel_cfgh)に記述します。
資源を静的に生成する場合だけでなく、動的生成拡張カーネルを利用して動的生成 APIを利用する場合でも各資源について利用できる資源の最大数を記述する必要があります。
設定ファイルの編集
SOLID-IDEを使用してアプリケーションの新規作成を行うとアプリケーションのスケルトンコードの他に以下の二つのファイルがアプリケーションと同じフォルダに生成されます。以下のファイルを編集し、ビルドすることでカーネル資源の設定を行います。
- kernel_cfg.c
カーネルが起動時に生成する各資源の数や属性等のパラメータを記述したテーブルが定義され、ビルド時にアプリケーションと 同時にびるどされ、カーネルとリンクされます。
- kernel_cfg.h
各資源のID(数値)をC言語の定数(define)として定義します。kernel_cfg.cからincludeされるのでIDの他にアプリケーションと
- kernel_cfg.cとの間で共有する定義を記述する目的にも使えます。
(カーネルでは各資源のIDは整数でしか扱われないので個々のIDを表す定数の定義は必須ではありません)
注釈
タスクやセマフォなどのIDで管理される資源静的に生成されるものについてはここに記述されている初期化ブロックの配列内の順序でIDが決定します。(最初の要素がID=1となり, 並びの順にIDが割り振られます)
警告
ネットワーク機能を利用する場合、kernel_cfg.の中にある下記の定義を削除しないでください。
__SOLID_RESERVED_TASKS__
__SOLID_RESERVED_TASK_ORDER__
__SOLID_RESERVED_SEMS__
__SOLID_RESERVED_DTQS__
__SOLID_SYS_INTRTN()
__SOLID_SYS_TERRTN()
ネットワークを利用する場合の設定にてついてはネットワークの項の カーネル資源設定について も参照してください。
タスク初期化ブロック
-
typedef struct task_initialization_block TINIB
説明
タスク生成時の初期化情報を設定します。
定義
typedef struct task_initialization_block { ATR tskatr; intptr_t exinf; TASK task; uint_t ipriority; size_t stksz; void *stk; } TINIB; const TINIB _kernel_tinib_table[];
メンバー
- tskatr
タスク属性
以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_ACT
タスクの生成時にタスクを起動する
TA_NOACTQUE
タスクに対する起動要求をキューイングしない
TA_RSTR
生成するタスクを制約タスクとする
- exinf
タスクの拡張情報
タスクが起動されるときの引数を指定します。(任意)
- task
タスクの起動番地
タスクの起動番地をC言語の関数アドレスで指定します。 関数型は以下の通りです。
typedef void (*TASK)(intptr_t exinf);
タスクが起動するタイミングでexinfを引数にtaskで指定された関数が呼び出されます。
- ipriority
- タスクの起動時優先度(内部表現)
カーネル内部表現で指定する必要があるため、マクロ INT_PRIORITYを使用してください。INT_PRIORITY(1)が最高優先度でINT_PRIORITY(16)が最低優先度です。
- stksz
スタック領域のサイズ(丸めた値)
- stk
スタック領域の先頭番地
note
このテーブル内に記述された順序に沿ってタスクIDが1(TMIN_TSKID)から割り振られます。
stkがNULLの場合、カーネルは自動的にstkszで指定された領域を確保してタスクに割り当てます。ユーザが確保した領域(変数)をスタックとして使用したい場合にはその領域のアドレスをstkに指定しますがその場合は以下の点に注意してください
SOLID-OSの機能であるスタックフェンス機能はスタックが自動割り当ての場合(stk==NULL)のみ動作します。ユーザが任意のスタック領域を割り当てている場合にはそのタスクにはスタックフェンス機能が働きません。
スタック領域と使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制限があるためstkに指定する領域(変数)については以下のマクロを使用して宣言してください。
- SKT_T
スタック用のデータ型
- COUNT_STK_T(sz)
サイズszのスタック領域を確保するために必要なSTK_T型の配列の要素数
- ROUND_STK_T(sz)
サイズszに必要なSTK_T型の数(配列の要素数)
example
#define STACK_SIZE 2048 extern void task1(void *); extern void task2(void *); static STK_T _stack_TASK1[COUNT_STK_T(STACK_SIZE)]; const TINIB _kernel_tinib_table[] = { // 生成時に起動(TA_ACT), スタック領域のアドレスを指定 (スタックフェンス機能 無効) { TA_ACT, 0, task1, INT_PRIORITY(MID_PRIORITY), ROUND_STK_T(STACK_SIZE), _stack_TASK1 }, // 生成時には起動しない, スタックをカーネル内で確保(スタックフェンス機能 有効) { TA_NULL, 0, task2, INT_PRIORITY(HIGH_PRIORITY), ROUND_STK_T(STACK_SIZE), NULL}, }; };
タスク生成順序テーブル
-
type ID
説明
タスク生成の順序を設定します。
定義
const ID _kernel_torder_table[];
メンバー
note
タスクを生成する順序をIDで指定します。指定する数はタスク初期化ブロックに記述された数と必ず一致する必要があります。 一致しない場合のカーネルの動作は保証されません。 -このテーブルでの指定の順序に関わらず各タスクのIDはタスク初期化テーブルでの並びで決まります。
example
/* * タスクIDの定数定義 */ #define TASK1 1 #define TASK2 2 #define TASK3 3 const ID _kernel_torder_table[] = { TASK3, TASK1, TASK2 };
この例の場合、TASK3→TASK1→TASK2の順序でタスク生成処理が行われます。
セマフォ初期化ブロック
-
typedef struct semaphore_initialization_block SEMINIB
説明
使用するセマフォの属性を定義します。
定義
typedef struct semaphore_initialization_block { ATR sematr; // セマフォ属性 uint_t isemcnt; // セマフォの資源数の初期値 uint_t maxsem; // セマフォの最大資源数 } SEMINIB; const SEMINIB _kernel_seminib_table[];
メンバー
- sematr
セマフォ属性
以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_TPRI
待ち行列をタスクの優先度順にする
- isemcnt
セマフォの資源数の初期値
- maxsem
セマフォの最大資源数
note
example
const SEMINIB _kernel_seminib_table[] = { { TA_NULL, 1, 1 }, // 待ち行列=FIFO順, 最大数=1,初期値=1でセマフォを生成 { TA_TPRI, 0, 1 }, // 待ち行列=タスク優先度順, 最大数=1,初期値=0でセマフォを生成 };
イベントフラグ初期化ブロック
-
typedef struct eventflag_initialization_block FLGINIB
説明
使用するイベントフラグの属性を定義します。
定義
typedef struct eventflag_initialization_block { ATR flgatr; // イベントフラグ属性 FLGPTN iflgptn; // イベントフラグのビットパターンの初期値 } FLGINIB; const FLGINIB _kernel_flginib_table[];
- メンバー
- flgatr
- イベントフラグ属性
以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_TPRI
待ち行列をタスクの優先度順にする
TA_WMUL
複数のタスクが待つのを許す
TA_CLR
タスクの待ち解除時にイベントフラグをクリアする
- iflgptn
イベントフラグのビットパターンの初期値
note
example
const FLGINIB _kernel_flginib_table[] = { { TA_NULL, 0x00 }, // 複数タスク待ち不可, 待ち行列=FIFO順, フラグ初期値=0 { TA_CLR, 0x01 }, // 複数タスク待ち不可, 待ち行列=FIFO順, 待ち解除時にフラグクリア,フラグ初期値=1 { TA_WMUL|TA_CLR, 0x00 }, // 複数タスク待ち許可, 待ち行列=FIFO順, 待ち解除時にフラグクリア,フラグ初期値=0 { TA_WMUL|TA_TPRI, 0x00 }, // 複数タスク待ち許可, 待ち行列=タスク優先度順, フラグ初期値=0 };
データキュー初期化ブロック
-
typedef struct dataqueue_initialization_block DTQINIB
説明
使用するデータキューの属性を定義します。
定義
typedef struct dataqueue_initialization_block { ATR dtqatr; // データキュー属性 uint_t dtqcnt; // データキューの容量 DTQMB *p_dtqmb; // データキュー管理領域の先頭番地 } DTQINIB; const DTQINIB _kernel_dtqinib_table[];
メンバー
- dtqatr
データキュー属性
以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_TPRI
送信 待ち行列をタスクの優先度順にする (受信待ち行列は常にFIFO順)
- dtqcnt
データキューの容量
- p_dtqmb
データキュー管理領域の先頭番地
note
p_dtqmbがNULLの場合、カーネルは自動的にdtqcntで指定された容量に対して必要な管理領域を確保してデータキューに割り当てます。 ユーザが確保した領域をデータキュー管理領域として使用する場合、管理領域して使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制約があるため、p_dtqmbが指す領域(変数)については以下のデータ型とマクロを使用して宣言してください。
- MB_T
管理領域のデータ型
- TSZ_DTQMB(dtqcnt)
dtqcntで指定した数のデータを格納できるデータキュー管理領域のサイズ(バイト数)
- TCNT_DTQMB(dtqcnt)
dtqcntで指定した数のデータを格納できるデータキュー管理領域を確保するために必要なMB_T型の配列の要素数
example
static MB_T _kernel_dtqmb_DTQ3[TCNT_DTQMB(2)]; const DTQINIB _kernel_dtqinib_table[] = { { TA_NULL, 2, NULL }, // 送信待ち行列=FIFO順, 容量=2 { TA_NULL, 0, NULL }, // 送信待ち行列=FIFO順, 容量=0 { TA_TPRI, 2, _kernel_dtqmb_DTQ3 },// 送信待ち行列=タスク優先度順, 容量=2, 管理領域を指定 };
優先度データキュー初期化ブロック
-
typedef struct pridataq_initialization_block PDQINIB
説明
使用する優先度データキューの属性を定義します。
定義
typedef struct pridataq_initialization_block { ATR pdqatr; // 優先度データキュー属性 uint_t pdqcnt; // 優先度データキューの容量 PRI maxdpri; // データ優先度の最大値 PDQMB *p_pdqmb; // 優先度データキュー管理領域の先頭番地 } PDQINIB; const PDQINIB _kernel_pdqinib_table[];
メンバー
- pdqatr
優先度データキュー属性
以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_TPRI
送信 待ち行列をタスクの優先度順にする (受信待ち行列は常にFIFO順)
- pdqcnt
優先度データキューの容量
- maxdpri
- データ優先度の最大値
TMIN_DPRI(1,最高優先度)からTMAX_DPRI(16)の範囲で指定可能です
- p_pdqmb
優先度データキュー管理領域の先頭番地
note
TA_TPRIを指定した場合のデータ優先度とタスク優先度の関係、動作については TOPPERS第3世代カーネル(ITRON系)統合仕様書 の4.4.4 優先度データキューの「仕様上の注意」を参照してください。
p_pdqmbがNULLの場合、カーネルは自動的にpdqcntで指定された容量に対して必要な管理領域を確保して優先度データキューに割り当てます。 ユーザが確保した領域を優先度データキュー管理領域として使用する場合、管理領域して使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制約があるため、p_pdqmbが指す領域(変数)については以下のデータ型とマクロを使用して宣言してください。
- MB_T
管理領域のデータ型
- TSZ_PDQMB(pdqcnt)
pdqcntで指定した数のデータを格納できる優先度データキュー管理領域のサイズ(バイト数)
- TCNT_PDQMB(pdqcnt)
pdqcntで指定した数のデータを格納できる優先度データキュー管理領域を確保するために必要なMB_T型の配列の要素数
example
static MB_T _kernel_pdqmb_PDQ3[TCNT_PDQMB(2)]; const PDQINIB _kernel_pdqinib_table[] = { { TA_NULL, 2, TMAX_DPRI, NULL }, // 送信待ち行列=FIFO順, データ優先度=最大(最低) { TA_NULL, 0, 8, NULL }, // 送信待ち行列=FIFO順、容量=0 { TA_TPRI, 2, TMAX_DPRI, _kernel_pdqmb_PDQ3 }, // 送信待ち行列=タスク優先度順, 管理領域を指定 };
ミューテックス初期化ブロック
-
typedef struct mutex_initialization_block MTXINIB
説明
使用するミューテックスの属性を定義します。
定義
typedef struct mutex_initialization_block { ATR mtxatr; // ミューテックス属性 uint_t ceilpri; // ミューテックスの上限優先度(内部表現) } MTXINIB; const MTXINIB _kernel_mtxinib_table[];
メンバー
- mtxatr
ミューテックス属性
以下の属性を指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_TPRI
待ち行列をタスクの優先度順にする
TA_CEILING
優先度上限ミューテックスとする.待ち行列をタスクの優先度順にする
- ceilpri
- ミューテックスの上限優先度(内部表現)
カーネル内部表現で指定する必要があるため、マクロ INT_PRIORITYを使用してください。INT_PRIORITY(1)が最高優先度でINT_PRIORITY(16)が最低優先度です。 TA_CEILINGが指定された場合のみ有効です。
- note
優先度上限ミューテックスの動作については TOPPERS第3世代カーネル(ITRON系)統合仕様書 の4.4.5 ミューテックスの「使用上の注意」を参照してください。
example
const MTXINIB _kernel_mtxinib_table[] = { { TA_NULL, INT_PRIORITY(1) }, //待ち行列=FIFO順 (優先度は無効) { TA_CEILING, INT_PRIORITY(9) }, //優先度上限ミューテックス, 上限優先度有効 { TA_TPRI, INT_PRIORITY(1) }, //待ち行列=タスク優先度順、優先度上限なし };
固定長メモリプール初期化ブロック
-
typedef struct fixed_memorypool_initialization_block MPFINIB
説明
使用する固定長メモリプール初期化ブロックの属性を定義します。
定義
typedef struct fixed_memorypool_initialization_block { ATR mpfatr; // 固定長メモリプール属性 uint_t blkcnt; // メモリブロック数 uint_t blksz; // メモリブロックのサイズ(丸めた値) void *mpf; // 固定長メモリプール領域の先頭番地 MPFMB *p_mpfmb; // 固定長メモリプール管理領域の先頭番地 } MPFINIB; const MPFINIB _kernel_mpfinib_table[] = {
メンバー
- mpfatr
- 固定長メモリプール属性
TA_TPRI
待ち行列をタスクの優先度順にする
- blkcnt
メモリブロック数
- blksz
メモリブロックのサイズ(丸めた値)
- mpf
固定長メモリプール領域の先頭番地
- p_mpfmb
固定長メモリプール管理領域の先頭番地
note
mpf及びp_mpfmbにNULLを指定した場合はカーネル内部で必要なメモリ領域の確保が行われます。
固定長メモリプール領域、固定長メモリプール管理領域として使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制限があるためそれぞれ以下のマクロを使用して宣言してください。
固定長メモリプール領域を確保するためのマクロとデータ型
- MPF_T
固定長メモリプール領域用のデータ型
- COUNT_MPF_T(blksz)
固定長メモリブロックのサイズがblkszの固定長メモリプール領域を確保するために,固定長メモリブロック1つあたりに必要なMPF_T型の配列の要素数
- ROUND_MPF_T(blksz)
要素数COUNT_MPF_T(blksz)のMPF_T型の配列のサイズ(blkszを,MPF_T型のサイズの倍数になるように大きい方に丸めた値)
固定長メモリプール管理領域を確保するためのマクロ
- TSZ_MPFMB(blkcnt)
blkcntで指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域のサイズ(バイト数)
- TCNT_MPFMB(blkcnt)
blkcntで指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域を確保するために必要なMB_T型の配列の要素数
example
#define MPF_BLOCK_SIZE 64 #define NUM_BLOCKS_MPF1 1 #define NUM_BLOCKS_MPF2 2 #define NUM_BLOCKS_MPF3 1 #define NUM_BLOCKS_MPF4 1 static MPF_T _pool1[ NUM_BLOCKS_MPF1 * COUNT_MPF_T(MPF_BLOCK_SIZE) ]; static MPF_T _pool4[ NUM_BLOCKS_MPF2 * COUNT_MPF_T(MPF_BLOCK_SIZE) ]; static MB_T _mpfmb2[TCNT_MPFMB(NUM_BLOCKS_MPF2)]; static MB_T _mpfmb4[TCNT_MPFMB(NUM_BLOCKS_MPF4)]; const MPFINIB _kernel_mpfinib_table[] = { { TA_NULL, NUM_BLOCKS_MPF1, ROUND_MPF_T(MPF_BLOCK_SIZE),_pool1, NULL }, // データ領域を静的変数で確保 { TA_NULL, NUM_BLOCKS_MPF2, ROUND_MPF_T(MPF_BLOCK_SIZE),NULL, (MPFMB*)_mpfmb2}, // 管理領域を静的変数で確保 { TA_TPRI, NUM_BLOCKS_MPF3, ROUND_MPF_T(1),NULL,NULL }, // 待ち行列=タスク優先度順 { TA_NULL, NUM_BLOCKS_MPF4, ROUND_MPF_T(MPF_BLOCK_SIZE),_pool4, (MPFMB*)_mpfmb4 },// すべての領域を静的変数で確保 };
周期通知初期化ブロック
-
typedef struct cyclic_handler_initialization_block CYCINIB
説明
使用する周期通知の属性と処理を定義します。
定義
typedef struct cyclic_handler_initialization_block { ATR cycatr; // 周期通知属性 intptr_t exinf; // 通知ハンドラの拡張情報 NFYHDR nfyhdr; // 通知ハンドラの起動番地 RELTIM cyctim; // 周期通知の起動周期 RELTIM cycphs; // 周期通知の起動位相 } CYCINIB; const CYCINIB _kernel_cycinib_table[] = {
メンバー
- cycatr
周期通知属性
以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_STA
周期通知の生成時に周期通知を動作開始する
- exinf
通知ハンドラの拡張情報
通知ハンドラが起動されるときの引数を指定します。(任意)
- nfyhdr
通知ハンドラの起動番地
通知ハンドラの起動番地をC言語の関数アドレスで指定します。 関数型は以下の通りです。
typedef void (*NFYHDR)(intptr_t exinf);
通知ハンドラが起動するタイミングでexinfを引数にnfyhdrで指定された関数が呼び出されます。
- cyctim
周期通知の起動周期(単位:usec)
- cycphs
周期通知の起動位相(単位:usec)
note
example
#define CYC1_CYCLE 100U // 100usec extern void cyc_func(intptr_t exinf); const CYCINIB _kernel_cycinib_table[] = { { TA_STA, 0, cyc_func, CYC1_CYCLE, CYC1_CYCLE }, // 生成と同時に100usec間隔でcyc_funcを呼び出す };
アラーム通知初期化ブロック
-
typedef struct alarm_handler_initialization_block ALMINIB
説明
使用するアラーム通知の属性と処理を定義します。
定義
typedef struct alarm_handler_initialization_block { ATR almatr; // アラーム通知属性 T_NFYINFO nfyinfo; //通知パラメータ構造体 } ALMINIB; const ALMINIB _kernel_alminib_table[];
メンバー
- almatr
- アラーム通知属性
指定可能な属性をありません。常にTA_NULLをセットしてください。
- nfyinfo
- 通知パラメータ構造体
アラーム通知が発生した場合の通知方法やエラーが起きた場合の処理方法を構造体に設定します。 詳細については 通知パラメータ構造体の設定方法 を参照してください。
note
example
(通知パラメータ構造体の設定方法 を参照してください。)
通知パラメータ構造体の設定方法
-
typedef struct T_NFYINFO T_NFYINFO
説明
アラーム通知などにおいてカーネルからの通知方法を定義・指定します。
定義
typedef struct { MODE nfymode; // 通知処理モード union { // タイムイベントの通知に関する付随情報 T_NFY_COMMON initializer; T_NFY_HDR handler; T_NFY_VAR setvar; T_NFY_IVAR incvar; T_NFY_TSK acttsk; T_NFY_TSK wuptsk; T_NFY_SEM sigsem; T_NFY_FLG setflg; T_NFY_DTQ snddtq; } nfy; union { // エラーの通知に関する付随情報 T_NFY_COMMON initializer; T_ENFY_VAR setvar; T_NFY_IVAR incvar; T_NFY_TSK acttsk; T_NFY_TSK wuptsk; T_NFY_SEM sigsem; T_NFY_FLG setflg; T_ENFY_DTQ snddtq; } enfy; } T_NFYINFO;
メンバー
- nfymode
通知処理モード
以下の通知種類をエラー通知方法を論理和(or)で指定します。
通知の種類
TNFY_HANDLER
タイムイベントハンドラの呼出しによる通知
TNFY_SETVAR
変数の設定による通知
TNFY_INCVAR
変数のインクリメントによる通知
TNFY_ACTTSK
タスクの起動による通知
TNFY_WUPTSK
タスクの起床による通知
TNFY_SIGSEM
セマフォの返却による通知
TNFY_SETFLG
イベントフラグのセットによる通知
TNFY_SNDDTQ
データキューへの送信による通知
エラー通知の種類
TENFY_SETVAR
変数の設定による通知
TENFY_INCVAR
変数のインクリメントによる通知
TENFY_ACTTSK
タスクの起動による通知
TENFY_WUPTSK
タスクの起床による通知
TENFY_SIGSEM
セマフォの返却による通知
TENFY_SETFLG
イベントフラグのセットによる通知
TENFY_SNDDTQ
データキューへの送信による通知
エラー通知が必要無い場合には上記定数を指定する必要はありません。
- nfy
タイムイベントの通知に関する付随情報
nfymodeに指定した通知の種類に応じて通知に付随するパラメータを指定します。 本メンバーの設定には以下のマクロを使用してください。
nfymode
マクロ名
TNFY_HANDLER
NFY_PARAM_HANDLER
TNFY_SETVAR
NFY_PARAM_SETVAR
TNFY_INCVAR
NFY_PARAM_INCVAR
TNFY_ACTTSK
NFY_PARAM_ACT_TSK
TNFY_WUPTSK
NFY_PARAM_WUP_TSK
TNFY_SIGSEM
NFY_PARAM_SIG_SEM
TNFY_SETFLG
NFY_PARAM_SET_FLG
TNFY_SNDDTQ
NFY_PARAM_SND_DTQ
各マクロのパラメータは以下の通りです。
- NFY_PARAM_HANDLER(exinf, handler)
- intprt_t exinf
ハンドラ関数に渡されるパラメータ
- TMEHDR handler
ハンドラ関数アドレス (void (*)(intptr_t))
- NFY_PARAM_SETVAR(p_var, value)
- intptr_t p_var
変数アドレス
- intptr_t value
変数に設定するアドレス
- NFY_PARAM_INCVAR(p_var)
- intptr_t p_var
変数アドレス
- NFY_PARAM_ACT_TSK(tskid)
- ID tskid
起動するタスクID
- NFY_PARAM_WUP_TSK(tskid)
- ID tskid
起床させるタスクID
- NFY_PARAM_SIG_SEM(semid)
- ID semid
セマフォID
- NFY_PARAM_SET_FLG(flgid, flgptn)
- ID flgid
イベントフラグID
- FLGPTN flgptn
セットするビットパターン
- NFY_PARAM_SND_DTQ(dtqid, data)
- ID dtqid
データキューID
- enfy
エラーの通知に関する付随情報
nfymodeに指定した通知の種類に応じて通知に付随するパラメータを指定します。 本メンバーの設定には以下のマクロを使用してください。
nfymode
マクロ名
TENFY_SETVAR
ERRNFY_PARAM_SETVAR
TENFY_INCVAR
ERRNFY_PARAM_INCVAR
TENFY_ACTTSK
ERRNFY_PARAM_ACT_TSK
TENFY_WUPTSK
ERRNFY_PARAM_WUP_TSK
TENFY_SIGSEM
ERRNFY_PARAM_SIG_SEM
TENFY_SETFLG
ERRNFY_PARAM_SET_FLG
TENFY_SNDDTQ
ERRNFY_PARAM_SND_DTQ
各マクロのパラメータは以下の通りです。
- ERRNFY_PARAM_SETVAR(p_var)
- intptr_t p_var
変数アドレス
- intptr_t value
変数に設定するアドレス
- ERRNFY_PARAM_INCVAR(p_var)
- intptr_t p_var
変数アドレス
- ERRNFY_PARAM_ACT_TSK(tskid)
- ID tskid
起動するタスクID
- ERRNFY_PARAM_WUP_TSK(tskid)
- ID tskid
起床させるタスクID
- ERRNFY_PARAM_SIG_SEM(semid)
- ID semid
セマフォID
- ERRNFY_PARAM_SET_FLG(flgid, flgptn)
- ID flgid
イベントフラグID
- FLGPTN flgptn
セットするビットパターン
- ERRNFY_PARAM_SND_DTQ(dtqid)
- ID dtqid
データキューID
note
example
#define TASK1 1 #define TASK2 2 #define SEM1 1 #define FLG1 1 #define DTQ1 1 extern bool_t event_variable; extern int_t count_variable; extern ER error_variable; const ALMINIB _kernel_alminib_table[] = { // 通知時に変数 event_variableにtrueを設定、エラー通知なし { TA_NULL, { TNFY_SETVAR, {NFY_PARAM_SETVAR(&event_variable, true)} }}, // 通知時にタスク(ID=TASK2)を起動、エラー通知なし { TA_NULL, { TNFY_ACTTSK, {NFY_PARAM_ACT_TSK(TASK2)} }}, // 通知時にタスク(ID=TASK2)を起床、エラー通知発生時には変数error_varibaleにエラーを格納する { TA_NULL, { TNFY_WUPTSK|TENFY_SETVAR, {NFY_PARAM_WUP_TSK(TASK2)}, {ERRNFY_PARAM_SETVAR(&error_variable)} }}, // 通知時にセマフォに返却(sig_sem)、エラー通知発生時にはタスク(ID=TASK2)を起床 { TA_NULL, { TNFY_SIGSEM|TENFY_ACTTSK, {NFY_PARAM_SIG_SEM(SEM1)}, {ERRNFY_PARAM_ACT_TSK(TASK2)} }}, // 通知時にイベントフラグをセット(ID FLG1に対し 0x01) { TA_NULL, { TNFY_SETFLG, {NFY_PARAM_SET_FLG(FLG1, 0x01)} }}, // 通知時にデータキューに対しデータ(0x01)を送信、エラーが発生した場合はTASK2を起床させる { TA_NULL, { TNFY_SNDDTQ|TENFY_WUPTSK, {NFY_PARAM_SND_DTQ(DTQ1, 0x01)}, {ERRNFY_PARAM_WUP_TSK(TASK2)} }}, // 通知時にタスク(ID=TASK2)を起動、 エラー発生時にはSEM1に対しsig_semを実行する { TA_NULL, { TNFY_ACTTSK|TENFY_SIGSEM, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_SIG_SEM(SEM1)} }}, // 通知時にタスク(ID=TASK2)を起動、 エラー発生時にはイベントフラグ FLG1に対し0x02をセット { TA_NULL, { TNFY_ACTTSK|TENFY_SETFLG, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_SET_FLG(FLG1, 0x02)} }}, // 通知時にタスク(ID=TASK2)を起動、 エラー発生時にはデータキューに対しエラーコードを送信 { TA_NULL, { TNFY_ACTTSK|TENFY_SNDDTQ, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_SND_DTQ(DTQ1)} }}, // 通知時に変数 count_varibaleをインクリメント、エラー通知なし { TA_NULL, { TNFY_INCVAR, {NFY_PARAM_INCVAR(&count_variable)} }}, // 通知時にタスク(ID=TASK2)を起動、 エラー発生時には通知時に変数 count_varibaleをインクリメント { TA_NULL, { TNFY_ACTTSK|TENFY_INCVAR, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_INCVAR(&count_variable)} }}, };
割込み初期化設定ブロック
-
typedef struct interrupt_handler_initialization_block INTINIB
説明
カーネルで扱う割込みについて定義します。 カーネルは起動時にこのテーブルに記述された内容を読込み、Core Serviceに対して必要な設定を行います。 このテーブルに定義されていない割込みはカーネル管理外となり、アプリケーションから扱う事はできなくなります。
- 割込みの処理を行う関数を登録する方法には以下の二種類があります。
割込みサービスルーチン(ISR)
カーネル内部のハンドラを経由します。同一の割込みに対して複数のISRを登録することができ、割込み発生時には設定されて優先度に従ってすべてのISRが呼び出されます。
動的生成機能拡張カーネルの場合はacre_isrの呼び出しによりISRを登録することもできます。 (その場合でも割込み初期化設定ブロックであらかじめ使用する割込みについて定義しておく必要はあります)
割込みハンドラ
割込み初期化設定ブロックに登録された関数のみが呼び出されます。 カーネルの動的生成機能拡張対応の有無に関わらず動的に登録することはできません。
同一の割込みに対して割込みサービスルーチンと割込みハンドラの両方を同時に使用することはできません。
定義
typedef struct interrupt_handler_initialization_block { INTNO intno; // 割込み番号 ATR inhatr; // 割込みハンドラ属性 FP inthdr; // 割込みハンドラの出入口処理の番地 (ISR使用時はINTINI_USE_ISRを指定)->関数型:void (foo)(void); ATR intatr; // 割込み属性 (TA_ENAINTのみサポート) PRI intpri; // 割込み優先度 [-1:最低優先度 ... -32:最高優先度] } INTINIB; const INTINIB _kernel_intinib_table[];
メンバー
- intno
- 割込み番号
SOLID-OSにおいては割込み番号はBSPにおけるIRQ番号に一致します。
- inhatr
- 割込みハンドラ属性
指定可能な属性をありません。常にTA_NULLをセットしてください。
- inthdr
- 割込みハンドラの出入口処理の番地
- 割込みサービスルーチン(ISR)を使用する場合
マクロ INTINI_USE_ISRを指定します。
- 割込みハンドラを使用する場合
ハンドラ関数のアドレスを指定します。関数型は以下の通りです。
void interrupt_handler(void);
割込みハンドラと割込みサービスルーチンでは関数型が異なるので注意してください
- intatr
- 割込み属性 (TA_ENAINTのみサポート)
以下の属性を指定できます。何も指定がない場合にはTA_NULLをセットします。
TA_ENAINT
割込み要求禁止フラグをクリア
- intpri
- 割込み優先度
-1(最低優先度)から-32(最高優先度)の範囲で優先度を指定します。 ここで指定された値はCore Serviceを介して割込みコントローラの優先度に反映されます。 (実際にコントローラに設定される値はコントローラの仕様に合わせて変換されます)
note
使用する割込み番号が重複した場合は先着優先(先に記述された定義が優先)となり無視されます。また、タイマ割込みなどカーネルやCore Serviceで使用する割込みを指定した場合も同様です。予約されている割込みはボード毎に異なりますので 予約されている割込み で確認してください。
動的生成機能拡張カーネルを使用してacre_isrを利用する場合でも割込み初期化設定ブロックにおいて対象となる割込み番号が割込みサービスルーチンを使用するための設定で登録されている必要があります。
example
(割込みサービスルーチン(ISR)初期化ブロック を参照してください。)
割込みサービスルーチン(ISR)初期化ブロック
-
typedef struct t_cisr T_CISR
説明
割込みサービスルーチンの登録を行います。 使用する割込みについては割込み初期化設定ブロックにおいて割込みサービスルーチンを使用するための設定で登録されている必要があります。
定義
typedef struct t_cisr { ATR isratr; // 割込みサービスルーチン属性 intptr_t exinf; // 割込みサービスルーチンの拡張情報 INTNO intno; // 割込みサービスルーチンを登録する割込み番号 ISR isr; // 割込みサービスルーチンの先頭番地->関数型:void (foo)(intptr_t); PRI isrpri; // 割込みサービスルーチン優先度 [1:最高優先度 ... 16:最低優先度] } T_CISR; const T_CISR _kernel_isrini_cfg_table[] = {
メンバー
- isratr
- 割込みサービスルーチン属性
指定可能な属性をありません。常にTA_NULLをセットしてください。
- exinf
- 割込みサービスルーチンの拡張情報
割込み発生時にisrで指定された関数に引数として渡される値を指定します。
- intno
- 割込みサービスルーチンを登録する割込み番号
割込み初期化設定ブロックで登録した割込み番号を設定します。該当する割込みについて割込み初期化設定ブロックのメンバinthdrにINTINI_USE_ISRが指定されている必要があります。
- isr
割込みサービスルーチンの先頭番地
typedef void (*ISR)(intptr_t exinf);
割込みサービスルーチンと割込みハンドラでは関数型が異なるので注意してください*
- isrpri
- 割込みサービスルーチン優先度
1(最高優先度)から16(最低優先度)の範囲で優先度を指定します。 ここで指定された値はカーネル内で割込みサービスルーチン間の優先順位を判定するためにのみ使用されます。 (割込みコントローラの設定には反映されません)
note
example
#define INTNO_SGI1 1 // 割込み番号1 #define INTNO_SGI2 2 // 割込み番号2 extern void int_handler_sgi2(void); // // 割込み初期化ブロック // const INTINIB _kernel_intinib_table[] = { {INTNO_SGI1,TA_NULL, INTINI_USE_ISR, TA_NULL,(-1)}, // IRQ1 <- 最低優先度、ISRを使用 {INTNO_SGI2,TA_NULL, int_handler_sgi2, TA_NULL,(-32)}, // IRQ2 <- 最高優先度、直接割込みハンドラ関数を登録 }; #define ISRPRI_HIGH_PRIORITY 1 // 高優先度 #define ISRPRI_MID_PRIORITY 10 // 中優先度 #define ISRPRI_LOW_PRIORITY 16 // 低優先度 extern void isr_high_handler(intptr_t exinf); extern void isr_mid_handler(intptr_t exinf); extern void isr_low_handler(intptr_t exinf); // // 割込みサービルルーチン初期化ブロック // const T_CISR _kernel_isrini_cfg_table[] = { {TA_NULL, (intptr_t)1, INTNO_SGI1, isr_mid_handler, ISRPRI_MID_PRIORITY}, // 中優先度のISRを登録 {TA_NULL, (intptr_t)2, INTNO_SGI1, isr_low_handler, ISRPRI_LOW_PRIORITY}, // 低優先度のISRを登録 {TA_NULL, (intptr_t)3, INTNO_SGI1, isr_high_handler, ISRPRI_TOP_PRIORITY}, // 高優先度のISRを登録 };
ISR生成順序テーブル
-
type ID
説明
割込みサービスルーチン生成の順序を設定します。 割込みサービスルーチン(ISR)初期化ブロックに登録したISRに対応するIDを指定してください。
定義
const ID _kernel_isrorder_table[];
メンバー
note
割込みサービスルーチンを生成する順序をIDで指定します。指定する数は割込みサービスルーチン初期化ブロックに記述された数と必ず一致する必要があります。 一致しない場合のカーネルの動作は保証されません。 -このテーブルでの指定の順序に関わらず各割込みサービスルーチンのIDは割込みサービスルーチン初期化テーブルでの並びで決まります。
example
/* * 割込みサービスルーチンIDの定数定義 */ #define ISR1 1 #define ISR2 2 #define ISR3 3 const ID _kernel_isrorder_table[] = { ISR3, ISR1, ISR2 };
この例の場合、ISR3→ISR1→ISR2の順序で割込みサービスルーチン生成処理が行われます。
動的生成される資源の上限数設定(動的資源生成カーネルのみ)
/*
* 動的に生成するカーネル資源の数を定義
* (静的なテーブルで定義される資源に追加して動的に
* 生成できる資源数を定義
*/
#define TNUM_AID_TSK 0
#define TNUM_AID_SEM 0
#define TNUM_AID_FLG 0
#define TNUM_AID_DTQ 0
#define TNUM_AID_PDQ 0
#define TNUM_AID_MTX 0
#define TNUM_AID_MPF 0
#define TNUM_AID_CYC 0
#define TNUM_AID_ALM 0
#define TNUM_AID_ISR 0
各資源ごとに動的生成可能な上限数を定義します。 ここで定義した数を超えて資源を生成するAPI(acre_*)を呼び出した場合、E_NOID(ID番号不足)が返されます。 定義を省略した場合の値は0となります。
ここで定義される資源数には静的に生成される資源は含まれません。 例えば、テーブル定義で3つのタスクを定義し、さらにTNUM_AID(3)を定義した場合には合計で最大6つのタスクが生成できることになります。
各定数と資源の対応は以下の通りです。
定数名 |
資源名称 |
---|---|
TNUM_AID_TSK |
タスク |
TNUM_AID_SEM |
セマフォ |
TNUM_AID_FLG |
イベントフラグ |
TNUM_AID_DTQ |
データキュー |
TNUM_AID_PDQ |
優先度データキュー |
TNUM_AID_MTX |
ミューテックス |
TNUM_AID_MPF |
固定長メモリプール |
TNUM_AID_CYC |
周期通知 |
TNUM_AID_ALM |
アラーム通知 |
TNUM_AID_ISR |
ISR(割込みサービスルーチン) |
注釈
動的生成カーネルでない場合にはこれらの定義は無視されます。