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 1862 2010-07-25 11:49:51Z 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 intptr_t _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_loc()) { /* 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_loc()) { /* 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がないか,inhnoに対応するintnoがCFG_INTに対
868 する割込み番号として正しくない場合には,このチェックを行わない
869 ・inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintnoに対して
870 CFG_INTで設定された割込み優先度がTMIN_INTPRIよりも小さい場合(E_OBJ)
871 ※ inhnoに対応するintnoがないか,inhnoに対応するintnoがCFG_INTに対
872 する割込み番号として正しくない場合には,このチェックを行わない
873 ・inhatrにTA_NONKERNELが指定されており,inhnoに対応するintnoに対して
874 CFG_INTで設定された割込み優先度がTMIN_INTPRI以上である場合(E_OBJ)
875 ※ inhnoに対応するintnoがないか,inhnoに対応するintnoがCFG_INTに対
876 する割込み番号として正しくない場合には,このチェックを行わない
878 *必要に応じてターゲット依存部で検出するもの
879 ・inthdrがプログラムの開始番地として正しくない場合(E_PAR)
883 CPU例外に関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
884 ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
885 を生成する.ターゲット毎に定める場合には,これらの情報は生成されない.
887 システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
888 静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
891 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
894 DEF_EXC(excno, { excatr, exchdr });
896 (6-1) 定義するCPU例外ハンドラの数
898 定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
899 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
902 #define TNUM_EXCNO <定義するCPU例外ハンドラの数>
903 const uint_t _kernel_tnum_excno = TNUM_EXCNO;
905 (6-2) CPU例外ハンドラの出入口処理
907 定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成
908 する.具体的には,次のような行を生成する.
910 EXCHDR_ENTRY(excno, excno_num, exchdr)
912 ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
913 アセンブリ言語記述に使用するためのものである.
915 (6-3) CPU例外ハンドラ初期化ブロックの定義
917 CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
920 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
924 <CPU例外ハンドラTNUM_EXCNOの初期化情報>
927 この中のCPU例外ハンドラの初期化情報は,次の形式とする.
929 { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
933 CPU例外ハンドラに関するエラー条件は次の通りである.
936 ・excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
937 ・excnoがDEF_EXCによって設定済みの場合(E_OBJ)
938 ・excatrが(TA_NULL)でない場合(E_RSATR)
939 ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
941 *必要に応じてターゲット依存部で検出するもの
942 ・exchdrがプログラムの開始番地として正しくない場合(E_PAR)
944 (7) 非タスクコンテキスト用のスタック領域に関する定義
946 非タスクコンテキスト用のスタック領域に関する定義は,必ず生成しなければ
951 システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
956 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ
957 #define TOPPERS_ISTK DEFAULT_ISTK
959 #else /* DEFAULT_ISTK */
961 static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
962 #define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)
963 #define TOPPERS_ISTK _kernel_istack
965 #endif /* DEFAULT_ISTK */
969 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
972 DEF_ICS({ istksz, istk });
974 istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
975 ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情報を生成
976 する.具体的には,上記の静的APIに対して,次の行を生成する.
978 static STK_T _kernel_istack[COUNT_STK_T(istksz)];
979 #define TOPPERS_ISTKSZ ROUND_STK_T(istksz)
980 #define TOPPERS_ISTK _kernel_istack
982 istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
985 #define TOPPERS_ISTKSZ (istksz)
986 #define TOPPERS_ISTK (istk)
990 DEF_ICSの有無によらず,次の定義を生成する.
992 const SIZE _kernel_istksz = TOPPERS_ISTKSZ;
993 STK_T *const _kernel_istk = TOPPERS_ISTK;
995 #ifdef TOPPERS_ISTKPT
996 STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
997 #endif /* TOPPERS_ISTKPT */
1001 非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
1004 ・静的API「DEF_ICS」が複数ある(E_OBJ)
1005 ・istkszがスタック領域のサイズとして正しくない場合(E_PAR)
1006 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
1007 ※ このエラーチェックは,istkがNULLでない場合にのみ行う
1010 ・istkがスタック領域の先頭番地として正しくない場合(E_PAR)
1011 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
1012 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
1014 *必要に応じてターゲット依存部で検出するもの
1015 ・istkszが小さすぎる場合(E_PAR)
1019 タイムイベント管理に関連して,次の定義を生成する.
1021 TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
1025 各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
1026 初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
1027 の2つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
1029 _kernel_initialize_interrupt
1030 _kernel_initialize_exception
1032 すべての機能を使った場合に生成される関数は次の通りである.
1035 _kernel_initialize_object(void)
1037 _kernel_initialize_task();
1038 _kernel_initialize_semaphore();
1039 _kernel_initialize_eventflag();
1040 _kernel_initialize_dataqueue();
1041 _kernel_initialize_pridataq();
1042 _kernel_initialize_mailbox();
1043 _kernel_initialize_mempfix();
1044 _kernel_initialize_cyclic();
1045 _kernel_initialize_alarm();
1046 _kernel_initialize_interrupt();
1047 _kernel_initialize_exception();
1051 (10) 初期化ルーチンの実行関数の定義
1053 システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
1054 する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
1057 ATT_INI({ iniatr, exinf, inirtn });
1061 (inirtn)((intptr_t)(exinf));
1063 を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
1064 ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1069 ATT_INI({ TA_NULL, 0, timer_initialize });
1070 ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
1072 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1076 _kernel_call_inirtn(void)
1078 (timer_initialize)((intptr_t)(0));
1079 (serial_initialize)((intptr_t)(CONSOLE_PORTID));
1084 初期化ルーチンに関するエラー条件は次の通りである.
1087 ・iniatrが(TA_NULL)でない場合(E_RSATR)
1089 *必要に応じてターゲット依存部で検出するもの
1090 ・inirtnがプログラムの開始番地として正しくない場合(E_PAR)
1092 (11) 終了処理ルーチンの実行関数の定義
1094 システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
1095 加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
1098 ATT_TER({ teratr, exinf, terrtn });
1102 (terrtn)((intptr_t)(exinf));
1104 を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
1105 チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1110 ATT_TER({ TA_NULL, 0, timer_terminate });
1111 ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
1113 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1117 _kernel_call_terrtn(void)
1119 (serial_terminate)((intptr_t)(CONSOLE_PORTID));
1120 (timer_terminate)((intptr_t)(0));
1125 終了処理ルーチンに関するエラー条件は次の通りである.
1128 ・teratrが(TA_NULL)でない場合(E_RSATR)
1130 *必要に応じてターゲット依存部で検出するもの
1131 ・terrtnがプログラムの開始番地として正しくない場合(E_PAR)