8 このドキュメントは,TOPPERS/ASPカーネルのコンフィギュレータが標準的に生
9 成すべきファイルの内容について解説したものである.ターゲット依存に生成
10 する内容については,このドキュメントの範囲外である.
12 ----------------------------------------------------------------------
14 Toyohashi Open Platform for Embedded Real-Time Systems/
15 Advanced Standard Profile Kernel
17 Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
18 Graduate School of Information Science, Nagoya Univ., JAPAN
20 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
26 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
30 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
33 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
37 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
44 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
45 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
46 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49 $Id: configurator.txt 1960 2010-11-20 02:20:40Z ertl-hiro $
50 ----------------------------------------------------------------------
56 ・カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
57 ・カーネル構成・初期化ファイル(kernel_cfg.c)
59 (2) インクルードディレクティブ(#include)の処理
60 (3-1) トレースログマクロのデフォルト定義
61 (3-2) オブジェクトのID番号を保持する変数の定義
65 (7) 非タスクコンテキスト用のスタック領域に関する定義
74 ASPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ
75 ルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期
76 化ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの
77 処理の途中に,必要な中間ファイルを生成する.
82 ASPカーネルのコンフィギュレータが処理する静的APIは次の通り.
85 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
86 PRI itskpri, SIZE stksz, STK_T *stk })
89 DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })
92 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
93 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
94 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
95 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
96 CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })
98 ※ dtqmb,pdqmb,mprihdがNULLでない場合はサポートしない.
101 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
102 MPF_T *mpf, void *mpfmb })
104 ※ mpfmbがNULLでない場合はサポートしない.
107 CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
108 RELTIM cyctim, RELTIM cycphs })
109 CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
112 CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
113 ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
114 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
117 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
120 DEF_ICS({ SIZE istksz, STK_T *istk })
121 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
122 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
124 これらの静的APIのパラメータの内,ID型のパラメータはオブジェクト識別名,
125 ポインタ型(void *,TASK,TEXRTN,CYCHDR,ALMHDR,ISR,INTHDR,EXCHDR,
126 INIRTN,TERRTN,STK_T *,MPF_T *)およびintptr_t型のパラメータは一般定
127 数式パラメータとする.その他のパラメータは,整数定数式パラメータとする.
130 ○カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
132 カーネル構成・初期化ヘッダファイル(kernel_cfg.h)には,次の定義を生成
137 kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.具
138 体的には,ファイルの先頭に次の行を生成する.
140 #ifndef TOPPERS_KERNEL_CFG_H
141 #define TOPPERS_KERNEL_CFG_H
145 #endif /* TOPPERS_KERNEL_CFG_H */
149 カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ
150 レクティブ(#define)を生成する.具体的には,次のような記述を生成する.
152 #define TNUM_TSKID <タスクの数>
153 #define TNUM_SEMID <セマフォの数>
154 #define TNUM_FLGID <イベントフラグの数>
155 #define TNUM_DTQID <データキューの数>
156 #define TNUM_PDQID <優先度データキューの数>
157 #define TNUM_MBXID <メールボックスの数>
158 #define TNUM_MPFID <固定長メモリプールの数>
159 #define TNUM_CYCID <周期ハンドラの数>
160 #define TNUM_ALMID <アラームハンドラの数>
164 コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた
165 ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
172 ○カーネル構成・初期化ファイル(kernel_cfg.c)
176 kernel_cfg.c用のヘッダファイルとID自動割付け結果ファイルをインクルード
177 するプリプロセッサディレクティブ(#include)を生成する.具体的には,次
180 #include "kernel/kernel_int.h"
181 #include "kernel_cfg.h"
183 (2) インクルードディレクティブ(#include)の処理
185 システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ
186 ンクルードディレクティブ(#include)と同一のディレクティブ(#include)
191 というインクルードディレクティブに対して,
195 というディレクティブを生成する.生成するディレクティブの順序は,システ
196 ムコンフィギュレーションファイル中でのインクルードディレクティブの順序
199 (3-1) トレースログマクロのデフォルト定義
201 kernel_cfg.cの中で使用するトレースログマクロのデフォルト定義を生成する.
204 #ifndef LOG_ISR_ENTER
205 #define LOG_ISR_ENTER(intno)
206 #endif /* LOG_ISR_ENTER */
208 #ifndef LOG_ISR_LEAVE
209 #define LOG_ISR_LEAVE(intno)
210 #endif /* LOG_ISR_LEAVE */
212 (3-2) オブジェクトのID番号を保持する変数の定義
214 コンフィギュレータに対するオプション指定(--external-id)により,コンフィ
215 ギュレータがID 番号を割り付けたオブジェクトの名前の末尾に"_id"を付加し
216 た名前の変数を生成する.変数は,const属性を付加したID型の変数とし,割り
217 付けたID番号を値とする.例えば,次のような記述を生成する.
219 const ID TASK1_id = 1;
220 const ID TASK2_id = 2;
221 const ID SEM1_id = 1;
223 (4) 各カーネルオブジェクトに関する定義
225 システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
226 API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
229 コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各
230 オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
231 重複がなく,ID番号が連続するように割り付ける.
233 コンフィギュレータに対するオプション指定(--id-input-file)により,コン
234 フィギュレータがオブジェクトに割り付けるID番号を指定することができる.
235 同じ種類の異なるオブジェクトに対して同じID番号を指定したり,コンフィギュ
236 レータがID番号をできる限り連続するように割り付けたとしてもID番号が連続
237 しない場合には(ASPカーネルは,オブジェクトのID番号が連続していることを
238 仮定して実装してある),コンフィギュレータはエラーを報告する.
240 また,コンフィギュレータに対するオプション指定(--id-output-file)によ
241 り,コンフィギュレータがID番号を割り付けたオブジェクトの名前と割り付け
242 たID番号の組を,オプションで指定したファイルに出力する.
244 各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
245 ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する.
247 (a) 最大のオブジェクトIDの変数の定義
249 最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク
250 トの省略記号を「XXX/xxx」とすると,次のような行を生成する.
252 const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
254 (b) オブジェクトに必要なメモリ領域の定義
256 オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
257 具体的には,オブジェクト毎の項で説明する.
259 (c) オブジェクトの初期化ブロックの定義
261 オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト
262 の省略記号を「XXX/xxx」とすると,次のような行を生成する.
264 const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
265 <オブジェクトIDが1のオブジェクトの初期化情報>,
266 <オブジェクトIDが2のオブジェクトの初期化情報>,
268 <オブジェクトIDがTNUM_XXXIDのオブジェクトの初期化情報>
271 オブジェクトの初期化情報の形式は,オブジェクト毎に異なる.具体的には,
274 (d) オブジェクトのコントロールブロックの定義
276 オブジェクトのコントロールブロックの定義を生成する.具体的には,オブジェ
277 クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
279 XXXCB _kernel_xxxcb_table[TNUM_XXXID];
283 ASPカーネルは,タスクが一つもないケースに対応していないため,タスクに関
286 タスクの省略記号は「TSK」「tsk」である.ただし,タスク初期化ブロックの
287 データ型はTINIB,その変数名は_kernel_tinib_table,タスクコントロールブ
288 ロックのデータ型はTCB,その変数名は_kernel_tcb_table である(いずれも
289 「TSK/tsk」に代えて「T/t」を用いている).
291 タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて,
292 「DEF_TEX」静的APIで指定される情報を含める.
294 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
297 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
298 DEF_TEX(tskid, { texatr, texrtn });
300 (4-1-1) タスクに必要なメモリ領域の定義
302 タスクに必要なメモリ領域として,タスクのスタック領域がある.stkがNULLの
303 場合には,生成するタスク毎に,指定されたサイズのスタック領域を確保する.
304 具体的には,上記の静的APIに対して,次の定義を生成する.
307 static STK_T _kernel_stack_<タスク名>[COUNT_STK_T(stksz)];
311 タスク初期化ブロック中に生成するタスクの初期化情報は,次の形式とする.
313 { (tskatr), (intptr_t)(exinf), (task), INT_PRIORITY(itskpri),
314 (stksz), (stk), (texatr), (texrtn) }
316 ここで,stkがNULLの場合には,(stksz)に代えてROUND_STK_T(stksz)を,
317 (stk)に代えて(_kernel_stack_<タスク名>)を生成する.CRE_TSKに対応する
318 DEF_TEXがない場合には,texatrをTA_NULL,texrtnをNULLとする.
320 (4-1-3) タスク生成順序テーブルの定義
322 タスクに対しては,生成された順序(タスクを生成する静的APIが記述された
323 順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で,
324 タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ
329 const ID _kernel_torder_table[TNUM_TSKID] = {
331 <2番目に生成されたタスクのタスクID>,
338 タスクに関するエラー条件は次の通りである.
341 ・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ)
342 ・DEF_TEXに対応するCRE_TSKがない場合(E_NOEXS)
343 ・同じtskidに対するDEF_TEXが複数ある場合(E_OBJ)
346 ・tskatrが([TA_ACT])でない場合(E_RSATR)
347 ※ ターゲット依存部でタスク属性を追加可(TARGET_TSKATR)
348 ・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
349 ・stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場
351 ・stkszがスタック領域のサイズとして正しくない場合(E_PAR)
352 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
353 ※ このエラーチェックは,stkがNULLでない場合にのみ行う
354 ・texatrが(TA_NULL)でない場合(E_RSATR)
357 ・taskとtexrtnがプログラムの開始番地として正しくない場合(E_PAR)
358 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
359 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
360 ・stkがスタック領域の先頭番地として正しくない場合(E_PAR)
361 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
362 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
366 セマフォの省略記号は「SEM/sem」である.以下では,システムコンフィギュレー
367 ションファイルに次の静的APIが含まれている時に生成すべき情報について述べ
368 る.なお,セマフォに必要なメモリ領域はない.
370 CRE_SEM(semid, { sematr, isemcnt, maxsem });
374 セマフォ初期化ブロック中に生成するセマフォの初期化情報は,次の形式とす
377 { (sematr), (isemcnt), (maxsem) }
381 セマフォに関するエラー条件は次の通りである.
384 ・同じsemidに対するCRE_SEMが複数ある場合(E_OBJ)
387 ・sematrが([TA_TPRI])でない場合(E_RSATR)
388 ・(0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
389 ・(1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
393 イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ
394 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
395 いて述べる.なお,イベントフラグに必要なメモリ領域はない.
397 CRE_FLG(flgid, { flgatr, iflgptn });
399 (4-3-1) イベントフラグの初期化情報
401 イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情報は,
404 { (flgatr), (iflgptn) }
408 イベントフラグに関するエラー条件は次の通りである.
411 ・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ)
414 ・flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
418 データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ
419 レーションファイルに次の静的APIが含まれている時に生成すべき情報について
422 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
424 (4-4-1) データキューに必要なメモリ領域の定義
426 データキューに必要なメモリ領域として,データキュー管理領域がある.生成
427 するデータキュー毎に,必要なサイズのデータキュー管理領域を定義する.具
428 体的には,上記の静的APIに対して,次の定義を生成する.
431 static DTQMB _kernel_dtqmb_<データキュー名>[dtqcnt];
435 データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の
438 { (dtqatr), (dtqcnt), (_kernel_dtqmb_<データキュー名>) }
440 ここで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
445 データキューに関するエラー条件は次の通りである.
448 ・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ)
451 ・dtqatrが([TA_TPRI])でない場合(E_RSATR)
452 ・dtqmbがNULLでない場合(E_NOSPT)
454 (4-5) 優先度データキューに関する定義
456 優先度データキューの省略記号は「PDQ/pdq」である.以下では,システムコ
457 ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
460 CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });
462 (4-5-1) 優先度データキューに必要なメモリ領域の定義
464 優先度データキューに必要なメモリ領域として,優先度データキュー管理領域
465 がある.生成する優先度データキュー毎に,必要なサイズの優先度データキュー
466 管理領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成す
470 static PDQMB _kernel_pdqmb_<優先度データキュー名>[pdqcnt];
472 (4-5-2) 優先度データキューの初期化情報
474 優先度データキュー初期化ブロック中に生成する優先度データキューの初期化
477 { (pdqatr), (pdqcnt), (maxdpri), (_kernel_pdqmb_<優先度データキュー名>) }
479 ここで,pdqcntが0の場合には,_kernel_pdqmb_<優先度データキュー名>に代え
484 優先度データキューに関するエラー条件は次の通りである.
487 ・同じpdqidに対するCRE_PDQが複数ある場合(E_OBJ)
490 ・pdqatrが([TA_TPRI])でない場合(E_RSATR)
491 ・(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
492 ・pdqmbがNULLでない場合(E_NOSPT)
496 メールボックスの省略記号は「MBX/mbx」である.以下では,システムコンフィ
497 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
498 いて述べる.なお,メールボックスに必要なメモリ領域はない.
500 CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd });
502 (4-6-1) メールボックスの初期化情報
504 メールボックス初期化ブロック中に生成するメールボックスの初期化情報は,
507 { (mbxatr), (maxmpri) }
511 メールボックスに関するエラー条件は次の通りである.
514 ・同じmbxidに対するCRE_MBXが複数ある場合(E_OBJ)
517 ・mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
518 ・(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
519 ・mprihdがNULLでない場合(E_NOSPT)
521 (4-7) 固定長メモリプールに関する定義
523 固定長メモリプールの省略記号は「MPF/mpf」である.以下では,システムコ
524 ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
527 CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf, mpfmb });
529 (4-7-1) 固定長メモリプールに必要なメモリ領域の定義
531 固定長メモリプールに必要なメモリ領域として,固定長メモリプール領域と固
532 定長メモリプール管理領域がある.生成する固定長メモリプール毎に,必要な
533 サイズの固定長メモリプール領域(mpfがNULLの場合のみ)と固定長メモリプー
534 ル管理領域を確保する.具体的には,上記の静的APIに対して,次の定義を生成
538 static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
541 static MPFMB _kernel_mpfmb_<固定長メモリプール名>[blkcnt];
543 (4-7-2) 固定長メモリプールの初期化情報
545 固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
548 { (mpfatr), (blkcnt), ROUND_MPF_T(blksz), mpf,
549 (_kernel_mpfmb_<固定長メモリプール名>) }
551 ここで,mpfがNULLの場合には,mpfに代えて,_kernel_mpf_<固定長メモリプー
556 固定長メモリプールに関するエラー条件は次の通りである.
559 ・同じmpfidに対するCRE_MPFが複数ある場合(E_OBJ)
562 ・mpfatrが([TA_TPRI])でない場合(E_RSATR)
565 ・mpfmbがNULLでない場合(E_NOSPT)
568 ・mpfが固定長メモリプール領域の先頭番地として正しくない場合(E_PAR)
569 - ターゲット依存の値(CHECK_MPF_ALIGN)の倍数でない場合
570 - NULLの場合(ターゲット依存,CHECK_MPF_NONNULL)
574 周期ハンドラの省略記号は「CYC/cyc」である.以下では,システムコンフィ
575 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
576 いて述べる.なお,周期ハンドラに必要なメモリ領域はない.
578 CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });
582 周期ハンドラ初期化ブロック中に生成する周期ハンドラの初期化情報は,次の
585 { (cycatr), (intptr_t)(exinf), (cychdr), (cyctim), (cycphs) }
589 周期ハンドラに関するエラー条件は次の通りである.
592 ・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ)
595 ・cycatrが([TA_STA])でない場合(E_RSATR)
596 ・(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
597 ・(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
598 ・警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
601 ・cychdrがプログラムの開始番地として正しくない場合(E_PAR)
602 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
603 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
607 アラームハンドラの省略記号は「ALM/alm」である.以下では,システムコン
608 フィギュレーションファイルに次の静的APIが含まれている時に生成すべき情報
609 について述べる.なお,アラームハンドラに必要なメモリ領域はない.
611 CRE_ALM(ID almid, { almatr, (intptr_t)(exinf), almhdr });
613 (4-9-1) アラームハンドラの初期化情報
615 アラームハンドラ初期化ブロック中に生成するアラームハンドラの初期化情報
618 { (almatr), (exinf), (almhdr) }
622 アラームハンドラに関するエラー条件は次の通りである.
625 ・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ)
628 ・almatrが(TA_NULL)でない場合(E_RSATR)
631 ・almhdrがプログラムの開始番地として正しくない場合(E_PAR)
632 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
633 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
637 割込みに関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
638 ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
639 を生成する.ターゲット毎に定める場合には,(5-1)と(5-3)に述べる情報は生
640 成しない((5-2)に述べる情報は生成する).
644 割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
645 ラインに関する定義を生成する.具体的には次の通り.
647 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
650 CFG_INT(INTNO intno, { intatr, intpri });
652 (5-1-1) 設定する割込み要求ラインの数
654 設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
655 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
658 #define TNUM_INTNO <設定する割込み要求ラインの数>
659 const uint_t _kernel_tnum_intno = TNUM_INTNO;
661 (5-1-2) 割込み要求ライン初期化ブロックの定義
663 割込み要求ライン初期化ブロックを生成する.具体的には,次のような行を生
666 const INTINIB _kernel_intinib_table[TNUM_INTNO] = {
670 <割込み要求ラインTNUM_INTNOの初期化情報>
673 この中の割込み要求ラインの初期化情報は,次の形式とする.
675 { (intno), (intatr), (intpri) }
679 割込み要求ラインに関するエラー条件は次の通りである.
682 ・intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
683 ・intnoがCFG_INTによって設定済みの場合(E_OBJ)
684 ・intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
685 ※ ターゲット依存部で割込み属性を追加可(TARGET_INTATR)
686 ・カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIよりも
688 ・カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRIより
689 も小さい値が指定されなかった場合(E_OBJ)
690 ・intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
692 *必要に応じてターゲット依存部で検出するもの
693 ・intatrが割込み属性として設定できない値の場合(E_RSATR)
694 ・intpriが割込み優先度として設定できない値の場合(E_PAR)
695 ・同一の割込み優先度しか設定できない割込み要求ラインに対して,異なる割
698 (5-2) 割込みサービスルーチンに関する定義
702 システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ
703 ンを追加する静的API「ATT_ISR」に対して,同一の割込み番号に対して追加さ
704 れた割込みサービスルーチンを順に呼び出す関数を生成する.
706 具体的には,同一の割込み番号に対して割込みサービスルーチンを追加する
708 ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 });
709 ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 });
711 ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n });
713 という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
714 isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
715 値が同じものの間では,システムコンフィギュレーションファイル中での静的
716 APIの順序の通りに並んでいるものとする.
719 _kernel_inthdr_<intno>(void)
724 saved_ipm = i_get_ipm();
726 LOG_ISR_ENTER(<intno>); /* ISR1の呼出し */
727 isr_1((intptr_t)(exinf_1));
728 LOG_ISR_LEAVE(intno);
730 if (i_sense_lock()) { /* ISRの呼出し前の状態に戻す */
733 i_set_ipm(saved_ipm);
735 LOG_ISR_ENTER(<intno>); /* ISR2の呼出し */
736 isr_2((intptr_t)(exinf_2));
737 LOG_ISR_LEAVE(intno);
739 if (i_sense_lock()) { /* ISRの呼出し前の状態に戻す */
742 i_set_ipm(saved_ipm);
746 LOG_ISR_ENTER(<intno>); /* ISRnの呼出し */
747 isr_n((intptr_t)(exinf_n));
748 LOG_ISR_LEAVE(intno);
753 ここで,ISRnの呼出しの後に呼出し前の状態に戻さないのは,割込みハンドラ
754 からのリターンにより,カーネルが元の状態に戻すためである.
756 同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合
760 _kernel_inthdr_<intno>(void)
763 LOG_ISR_ENTER(intno);
764 isr_1((intptr_t)(exinf_1));
765 LOG_ISR_LEAVE(intno);
769 【課題】ここで,LOG_ISR_ENTER,LOG_ISR_LEAVEの引数をどうするかが課題と
770 して残っている.ATT_ISRで登録されたISRに対してはISR IDが付与されないた
771 め,IDでISRを区別することができない.やむなく割込み番号を渡しているが,
772 拡張情報(exinf)も渡すべきかもしれない.
774 (5-2-2) 割込みハンドラの定義に相当する処理
776 上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ
777 に関する定義において,システムコンフィギュレーションファイル中に次の静
778 的APIが含まれているのと同様に処理する.
780 DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });
782 ここでinhnoは,intnoに対応する割込みハンドラ番号である.
786 割込みサービスルーチンに関するエラー条件は次の通りである.
789 ・isratrが(TA_NULL)でない場合(E_RSATR)
790 ※ ターゲット依存部で割込みサービスルーチン属性を追加可(TARGET_ISRATR)
791 ・intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
792 ※ intnoに対応するinhnoがない場合を含む
793 ・(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
794 ・intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
795 ・intnoに対するCFG_INTがない場合(E_OBJ)
796 ・intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小さい
798 ※ カーネル管理外のISRはサポートしないため
800 *必要に応じてターゲット依存部で検出するもの
801 ・isrがプログラムの開始番地として正しくない場合(E_PAR)
805 割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ(上
806 述の割込みサービスルーチンの追加によりコンフィギュレータが生成した割込
807 みハンドラを含む)に関する定義を生成する.具体的には次の通り.
809 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
812 DEF_INH(inhno, { inhatr, inthdr });
814 (5-3-1) 定義する割込みハンドラの数
816 定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
817 (#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
820 #define TNUM_INHNO <定義する割込みハンドラの数>
821 const uint_t _kernel_tnum_inhno = TNUM_INHNO;
823 (5-3-2) 割込みハンドラの出入口処理
825 定義する割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成す
828 INTHDR_ENTRY(inhno, inhno_num, inthdr)
830 ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
831 アセンブリ言語記述に使用するためのものである.
833 (5-3-3) 割込みハンドラ初期化ブロックの定義
835 割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
838 const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {
842 <割込みハンドラTNUM_INHNOの初期化情報>
845 この中の割込みハンドラの初期化情報は,次の形式とする.
847 { (inhno), (inhatr), (FP)(INT_ENTRY(inhno, inthdr)) }
851 割込みハンドラに関するエラー条件は次の通りである.
854 ・inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
855 ・inhnoがDEF_INHによって設定済みの場合(E_OBJ)
856 #・inhnoに対応するintnoに対してATT_ISRがある場合(E_OBJ)
857 # ※ inhnoに対応するintnoがない場合には,このチェックを行わない
858 # → このチェックは,割込みサービスルーチン側で行う
859 ・inhatrが(TA_NULL)でない場合(E_RSATR)
860 ※ ターゲット依存部で割込みハンドラ属性を追加可(TARGET_INHATR)
861 ※ TA_NONKERNELを使う場合には,TARGET_INHATRに設定する
862 ・カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指定
864 ・カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
866 ・inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
867 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
868 ・inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintnoに対して
869 CFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小さい場合(E_OBJ)
870 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
871 ・inhatrにTA_NONKERNELが指定されており,inhnoに対応するintnoに対して
872 CFG_INTで設定された割込み優先度がTMIN_INTPRI以上である場合(E_OBJ)
873 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
875 *必要に応じてターゲット依存部で検出するもの
876 ・inthdrがプログラムの開始番地として正しくない場合(E_PAR)
880 CPU例外に関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
881 ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
882 を生成する.ターゲット毎に定める場合には,これらの情報は生成されない.
884 システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
885 静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
888 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
891 DEF_EXC(excno, { excatr, exchdr });
893 (6-1) 定義するCPU例外ハンドラの数
895 定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
896 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
899 #define TNUM_EXCNO <定義するCPU例外ハンドラの数>
900 const uint_t _kernel_tnum_excno = TNUM_EXCNO;
902 (6-2) CPU例外ハンドラの出入口処理
904 定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成
905 する.具体的には,次のような行を生成する.
907 EXCHDR_ENTRY(excno, excno_num, exchdr)
909 ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
910 アセンブリ言語記述に使用するためのものである.
912 (6-3) CPU例外ハンドラ初期化ブロックの定義
914 CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
917 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
921 <CPU例外ハンドラTNUM_EXCNOの初期化情報>
924 この中のCPU例外ハンドラの初期化情報は,次の形式とする.
926 { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
930 CPU例外ハンドラに関するエラー条件は次の通りである.
933 ・excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
934 ・excnoがDEF_EXCによって設定済みの場合(E_OBJ)
935 ・excatrが(TA_NULL)でない場合(E_RSATR)
936 ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
938 *必要に応じてターゲット依存部で検出するもの
939 ・exchdrがプログラムの開始番地として正しくない場合(E_PAR)
941 (7) 非タスクコンテキスト用のスタック領域に関する定義
943 非タスクコンテキスト用のスタック領域に関する定義は,必ず生成しなければ
948 システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
953 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ
954 #define TOPPERS_ISTK DEFAULT_ISTK
956 #else /* DEFAULT_ISTK */
958 static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
959 #define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)
960 #define TOPPERS_ISTK _kernel_istack
962 #endif /* DEFAULT_ISTK */
966 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
969 DEF_ICS({ istksz, istk });
971 istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
972 ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情報を生成
973 する.具体的には,上記の静的APIに対して,次の行を生成する.
975 static STK_T _kernel_istack[COUNT_STK_T(istksz)];
976 #define TOPPERS_ISTKSZ ROUND_STK_T(istksz)
977 #define TOPPERS_ISTK _kernel_istack
979 istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
982 #define TOPPERS_ISTKSZ (istksz)
983 #define TOPPERS_ISTK (istk)
987 DEF_ICSの有無によらず,次の定義を生成する.
989 const SIZE _kernel_istksz = TOPPERS_ISTKSZ;
990 STK_T *const _kernel_istk = TOPPERS_ISTK;
992 #ifdef TOPPERS_ISTKPT
993 STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
994 #endif /* TOPPERS_ISTKPT */
998 非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
1001 ・静的API「DEF_ICS」が複数ある(E_OBJ)
1002 ・istkszがスタック領域のサイズとして正しくない場合(E_PAR)
1003 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
1004 ※ このエラーチェックは,istkがNULLでない場合にのみ行う
1007 ・istkがスタック領域の先頭番地として正しくない場合(E_PAR)
1008 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
1009 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
1011 *必要に応じてターゲット依存部で検出するもの
1012 ・istkszが小さすぎる場合(E_PAR)
1016 タイムイベント管理に関連して,次の定義を生成する.
1018 TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
1022 各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
1023 初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
1024 の2つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
1026 _kernel_initialize_interrupt
1027 _kernel_initialize_exception
1029 すべての機能を使った場合に生成される関数は次の通りである.
1032 _kernel_initialize_object(void)
1034 _kernel_initialize_task();
1035 _kernel_initialize_semaphore();
1036 _kernel_initialize_eventflag();
1037 _kernel_initialize_dataqueue();
1038 _kernel_initialize_pridataq();
1039 _kernel_initialize_mailbox();
1040 _kernel_initialize_mempfix();
1041 _kernel_initialize_cyclic();
1042 _kernel_initialize_alarm();
1043 _kernel_initialize_interrupt();
1044 _kernel_initialize_exception();
1048 (10) 初期化ルーチンの実行関数の定義
1050 システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
1051 する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
1054 ATT_INI({ iniatr, exinf, inirtn });
1058 (inirtn)((intptr_t)(exinf));
1060 を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
1061 ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1066 ATT_INI({ TA_NULL, 0, timer_initialize });
1067 ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
1069 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1073 _kernel_call_inirtn(void)
1075 (timer_initialize)((intptr_t)(0));
1076 (serial_initialize)((intptr_t)(CONSOLE_PORTID));
1081 初期化ルーチンに関するエラー条件は次の通りである.
1084 ・iniatrが(TA_NULL)でない場合(E_RSATR)
1086 *必要に応じてターゲット依存部で検出するもの
1087 ・inirtnがプログラムの開始番地として正しくない場合(E_PAR)
1089 (11) 終了処理ルーチンの実行関数の定義
1091 システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
1092 加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
1095 ATT_TER({ teratr, exinf, terrtn });
1099 (terrtn)((intptr_t)(exinf));
1101 を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
1102 チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1107 ATT_TER({ TA_NULL, 0, timer_terminate });
1108 ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
1110 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1114 _kernel_call_terrtn(void)
1116 (serial_terminate)((intptr_t)(CONSOLE_PORTID));
1117 (timer_terminate)((intptr_t)(0));
1122 終了処理ルーチンに関するエラー条件は次の通りである.
1125 ・teratrが(TA_NULL)でない場合(E_RSATR)
1127 *必要に応じてターゲット依存部で検出するもの
1128 ・terrtnがプログラムの開始番地として正しくない場合(E_PAR)