2 = JSPカーネル コンフィギュレータ仕様 =
4 (Release 1.4対応,最終更新: 20-Dec-2003)
6 ------------------------------------------------------------------------
8 Toyohashi Open Platform for Embedded Real-Time Systems/
9 Just Standard Profile Kernel
11 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
12 Toyohashi Univ. of Technology, JAPAN
14 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
15 によって公表されている GNU General Public License の Version 2 に記
16 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17 を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
19 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37 よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
41 @(#) $Id: configurator.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $
42 ------------------------------------------------------------------------
45 このドキュメントでは,JSPカーネルのコンフィギュレータが生成すべきファ
48 JSPカーネルのコンフィギュレータは,システムコンフィギュレーションファ
49 イルを処理して,カーネル構成ファイル(kernel_cfg.c)とID自動割付け結果
50 ファイル(kernel_id.h)を生成する.また,静的APIのパラメータチェックに
51 用いるファイル(kernel_chk.c)を生成する.
53 ID自動割付け結果ファイルは,コンフィギュレータがID番号を割り付けたオブ
54 ジェクトの名前を,割り付けたID番号に定義するファイルである.
56 以下では,カーネル構成ファイルの内容について解説する.
62 kernel_cfg.c 用のインクルードファイルをインクルードするプリプロセッサ
63 ディレクティブ(#include)を生成する.具体的には,次の行を生成する.
65 #include "kernel_cfg.h"
67 また,必要であれば,ID自動割付け結果ファイルをインクルードするプリプロ
68 セッサディレクティブ(#include)を生成する.具体的には,次の行を生成す
71 #include "kernel_id.h"
75 マクロの置換順序を変えるために,以下のマクロ定義行を生成する.
77 #define CFG_INTHDR_ENTRY(inthdr) INTHDR_ENTRY(inthdr)
78 #define CFG_EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY(exchdr)
79 #define CFG_INT_ENTRY(inthdr) INT_ENTRY(inthdr)
80 #define CFG_EXC_ENTRY(exchdr) EXC_ENTRY(exchdr)
82 なお,これらのマクロは,元々は過去のバージョンとの互換性を保つために入
83 れたものである.ただし,過去のバージョンとの互換性が必要なくても,マク
88 システムコンフィギュレーションファイルに含まれる「INCLUDE」静的APIに対
89 応するプリプロセッサディレクティブ(#include)を生成する.例えば,
91 INCLUDE("\"sample1.h\"");
97 というディレクティブを生成する.生成するディレクティブの順序は,システ
98 ムコンフィギュレーションファイル中での静的APIの順序に一致させる.
100 (3) 各カーネルオブジェクトに関する定義
102 システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
103 API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
106 コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,
107 それらをID番号の順に並べ替える.同じID番号のオブジェクトを生成する静的
108 APIが複数含まれている場合には,コンフィギュレータがエラーを報告する.
109 JSPカーネルは,オブジェクトのID番号が連続していることを仮定して実装し
110 てある.ID番号が連続していない場合には,コンフィギュレータがエラーを報
113 また,コンフィギュレータは,オブジェクトのID番号の代わりに識別子が記述
114 されている場合に,そのオブジェクトにID番号を割り付ける.ID番号は,他の
115 オブジェクトのID番号と重複がなく,ID番号ができる限り連続するように割り
116 付ける.それでもID番号が連続にならない場合には,コンフィギュレータがエ
119 各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
120 ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する.
124 オブジェクトの数をマクロ定義するプリプロセッサディレクティブ(#define)
125 を生成する.具体的には,オブジェクトの省略記号を「XXX」とすると,次の
128 #define TNUM_XXXID <オブジェクトの数>
130 (b) 最大のオブジェクトIDの変数の定義
132 最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク
133 トの省略記号を「XXX/xxx」とすると,次のような行を生成する.
135 const ID tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
137 (c) オブジェクトに必要なメモリ領域の定義
139 オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
140 具体的には,オブジェクト毎の項で説明する.
142 (d) オブジェクトの初期化ブロックの定義
144 オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト
145 の省略記号を「XXX/xxx」とすると,次のような行を生成する.
147 const XXXINIB xxxinib_table[TNUM_XXXID] = {
148 <オブジェクトIDが 1 のオブジェクトの初期化情報>,
149 <オブジェクトIDが 2 のオブジェクトの初期化情報>,
151 <オブジェクトIDが tmax_xxxid のオブジェクトの初期化情報>
154 オブジェクトの初期化情報の形式は,オブジェクト毎に異なる.具体的には,
157 (e) オブジェクトのコントロールブロックの定義
159 オブジェクトのコントロールブロックの定義を生成する.具体的には,オブジェ
160 クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
162 XXXCB xxxcb_table[TNUM_XXXID];
166 JSPカーネルは,タスクが一つもないケースに対応していないため,タスクに
169 タスクに関する定義のインクルードファイル名とオブジェクトの省略記号は次
170 の通りである.ただし,タスク初期化ブロックのデータ型は TINIB,変数名は
171 tinib_table,タスクコントロールブロックのデータ型は TCB,変数名は
172 tcb_table である(いずれも「TSK/tsk」に代えて「T/t」を用いている).
177 タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて,
178 「DEF_TEX」静的APIで指定される情報を含める.
180 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
183 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stack });
184 DEF_TEX(tskid, { texatr, texrtn });
186 (3-1-1) タスクに必要なメモリ領域の定義
188 タスクに必要なメモリ領域として,タスクのスタック領域がある.生成する各
189 タスク毎に,指定されたサイズのスタック領域を定義する.具体的には,上記
190 の静的APIに対して,次の定義を生成する.
192 static __STK_UNIT <スタック領域の変数名>[__TCOUNT_STK_UNIT(stksz)];
194 ここで,<スタック領域の変数名> は,タスク毎に異なる識別子を生成して用
199 タスク初期化ブロック中に生成するタスクの初期化情報は,次の形式とする.
201 { tskatr, (VP_INT)(exinf), (FP)(task), INT_PRIORITY(itskpri),
202 __TROUND_UNIT_STK(stksz), <スタック領域の変数名>,
203 texatr, (FP)(texrtn) }
205 ここで,CRE_TSK に対応する DEF_TEX がない場合には,texatr を TA_NULL,
208 (3-1-3) タスク生成順序テーブルの定義
210 タスクに対しては,生成された順序(タスクを生成する静的APIが記述された
211 順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で,
212 タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ
217 const ID torder_table[TNUM_TSKID] = {
219 <2番目に生成されたタスクのタスクID>,
226 タスクの初期化に関するエラー条件は次の通りである.
228 ・DEF_TEX に対応する CRE_TSK がない場合(E_NOEXS)
229 ・(tskatr & ~(TA_ACT)) が 0 でない場合(E_RSATR)
230 ・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI) でない場合(E_PAR)
231 ・stack が NULL でない場合(E_NOSPT)
232 ・texatr が 0 でない場合(E_RSATR)
234 ※ この他に,task や texrtn がプログラムの開始番地として正しいない場合
235 や,stksz が小さすぎる場合にもエラーとすべきだが,エラー条件がターゲッ
236 トに依存してしまうため,今後の課題とする.
240 セマフォに関する定義のインクルードファイル名とオブジェクトの省略記号は
243 インクルードファイル名: semaphore.h
246 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
247 ている時に生成すべき情報について述べる.なお,セマフォに必要なメモリ領
250 CRE_SEM(semid, { sematr, isemcnt, maxsem });
254 セマフォ初期化ブロック中に生成するセマフォの初期化情報は,次の形式とす
257 { sematr, isemcnt, maxsem }
261 セマフォの初期化に関するエラー条件は次の通りである.
263 ・(sematr & ~(TA_TPRI)) が 0 でない場合(E_RSATR)
264 ・(isemcnt > maxsem) の場合(E_PAR)
265 ・(1 <= maxsem && maxsem <= TMAX_MAXSEM) でない場合(E_PAR)
269 イベントフラグに関する定義のインクルードファイル名とオブジェクトの省略
272 インクルードファイル名: eventflag.h
275 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
276 ている時に生成すべき情報について述べる.なお,イベントフラグに必要なメ
279 CRE_FLG(flgid, { flgatr, iflgptn });
281 (3-3-1) イベントフラグの初期化情報
283 イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情報は,
290 イベントフラグの初期化に関するエラー条件は次の通りである.
292 ・(flgatr & ~(TA_TPRI|TA_CLR)) が 0 でない場合(E_RSATR)
296 データキューに関する定義のインクルードファイル名とオブジェクトの省略記
299 インクルードファイル名: dataqueue.h
302 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
305 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtq });
307 (3-4-1) データキューに必要なメモリ領域の定義
309 データキューに必要なメモリ領域として,データキュー領域がある.生成する
310 各データキュー毎に,必要なサイズのデータキュー領域を定義する.具体的に
311 は,上記の静的APIに対して,次の定義を生成する.
314 static VP_INT <データキュー領域の変数名>[dtqcnt];
316 #define <データキュー領域の変数名> NULL
319 ここで,<データキュー領域の変数名> は,データキュー毎に異なる識別子を
324 データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の
327 { dtqatr, dtqcnt, <データキュー領域の変数名> }
331 データキューの初期化に関するエラー条件は次の通りである.
333 ・(dtqatr & ~(TA_TPRI)) が 0 でない場合(E_RSATR)
334 ・dtq が NULL でない場合(E_NOSPT)
338 メールボックスに関する定義のインクルードファイル名とオブジェクトの省略
341 インクルードファイル名: mailbox.h
344 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
345 ている時に生成すべき情報について述べる.なお,メールボックスに必要なメ
348 CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd });
350 (3-5-1) メールボックスの初期化情報
352 メールボックス初期化ブロック中に生成するメールボックスの初期化情報は,
359 メールボックスの初期化に関するエラー条件は次の通りである.
361 ・(mbxatr & ~(TA_TPRI|TA_MPRI)) が 0 でない場合(E_RSATR)
362 ・(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI) でない場合(E_PAR)
363 ・mprihd が NULL でない場合(E_NOSPT)
365 (3-6) 固定長メモリプールに関する定義
367 固定長メモリプールに関する定義のインクルードファイル名とオブジェクトの
370 インクルードファイル名: mempfix.h
373 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
376 CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf });
378 (3-6-1) 固定長メモリプールに必要なメモリ領域の定義
380 固定長メモリプールに必要なメモリ領域として,固定長メモリプール領域があ
381 る.生成する各固定長メモリプール毎に,必要なサイズの固定長メモリプール
382 領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成する.
384 static __MPF_UNIT <固定長メモリプール領域の変数名>
385 [__TCOUNT_MPF_UNIT(blksz) * (blkcnt)];
387 ここで,<固定長メモリプール領域の変数名> は,固定長メモリプール毎に異
390 (3-6-2) 固定長メモリプールの初期化情報
392 固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
395 { mpfatr, __TROUND_MPF_UNIT(blksz), <固定長メモリプール領域の変数名>,
396 (VP)(((VB *) <固定長メモリプール領域の変数名>)
397 + sizeof(<固定長メモリプール領域の変数名>)) }
401 固定長メモリプールの初期化に関するエラー条件は次の通りである.
403 ・(mpfatr & ~(TA_TPRI)) が 0 でない場合(E_RSATR)
404 ・blkcnt が 0 の場合(E_PAR)
405 ・blksz が 0 の場合(E_PAR)
406 ・mpf が NULL でない場合(E_NOSPT)
410 周期ハンドラに関する定義のインクルードファイル名とオブジェクトの省略記
413 インクルードファイル名: cyclic.h
416 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
417 ている時に生成すべき情報について述べる.なお,周期ハンドラに必要なメモ
420 CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });
424 周期ハンドラ初期化ブロック中に生成する周期ハンドラの初期化情報は,次の
427 { cycatr, exinf, (FP)(cychdr), cyctim, cycphs }
431 周期ハンドラの初期化に関するエラー条件は次の通りである.
433 ・(cycatr & ~(TA_STA)) が 0 でない場合(E_RSATR)
434 ・(cyctim > TMAX_RELTIM) の場合(E_PAR)
435 ・(cycphs > TMAX_RELTIM) の場合(E_PAR)
437 ※ この他に,cychdr がプログラムの開始番地として正しいない場合にもエラー
438 とすべきだが,エラー条件がターゲットに依存してしまうため,今後の課題と
443 システムコンフィギュレーションファイル中に,割込みハンドラを定義する静
444 的API「DEF_INH」が含まれている場合に,割込みハンドラに関する定義を生成
449 定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
450 (#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
453 #define TNUM_INHNO <定義する割込みハンドラの数>
454 const UINT tnum_inhno = TNUM_INHNO;
458 定義する各割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成
461 DEF_INH(inhno, { inhatr, inthdr });
465 CFG_INTHDR_ENTRY(inthdr);
469 (4-3) 割込みハンドラ初期化ブロックの定義
471 割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
474 const INHINIB inhinib_table[TNUM_INHNO] = {
478 <割込みハンドラ TNUM_INHNO の初期化情報>
481 この中の割込みハンドラの初期化情報は,次の形式とする.
483 { inhno, inhatr, (FP)CFG_INT_ENTRY(inthdr) }
487 割込みハンドラに関するエラー条件は次の通りである.
489 ・inhatr が 0 でない場合(E_RSATR)
491 ※ この他に,inthdr がプログラムの開始番地として正しいない場合や,
492 inhno が割込みハンドラ番号として正しくない場合にもエラーとすべきだが,
493 エラー条件がターゲットに依存してしまうため,今後の課題とする.
497 システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
498 静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
501 (5-1) 定義するCPU例外ハンドラの数
503 定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
504 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
507 #define TNUM_EXCNO <定義するCPU例外ハンドラの数>
508 const UINT tnum_excno = TNUM_EXCNO;
510 (5-2) CPU例外ハンドラの出入口処理
512 定義する各CPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生
515 DEF_EXC(excno, { excatr, exchdr });
519 CFG_EXCHDR_ENTRY(exchdr);
523 (5-3) CPU例外ハンドラ初期化ブロックの定義
525 CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生
528 const EXCINIB excinib_table[TNUM_EXCNO] = {
529 <CPU例外ハンドラ 1 の初期化情報>,
530 <CPU例外ハンドラ 2 の初期化情報>,
532 <CPU例外ハンドラ TNUM_EXCNO の初期化情報>
535 この中のCPU例外ハンドラの初期化情報は,次の形式とする.
537 { excno, excatr, (FP)CFG_EXC_ENTRY(exchdr) }
541 CPU例外ハンドラに関するエラー条件は次の通りである.
543 ・excatr が 0 でない場合(E_RSATR)
545 ※ この他に,excthdr がプログラムの開始番地として正しいない場合や,
546 excno がCPU例外ハンドラ番号として正しくない場合にもエラーとすべきだが,
547 エラー条件がターゲットに依存してしまうため,今後の課題とする.
551 タイムイベント管理に関連して,次の定義を生成する.
553 TMEVTN tmevt_heap[TNUM_TSKID + TNUM_CYCID];
557 各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能
558 を初期化関数を順に呼び出す関数(object_initialize)を生成する.使用し
561 すべての機能を使った場合に生成される関数は次の通りである.
567 semaphore_initialize();
568 eventflag_initialize();
569 dataqueue_initialize();
570 mailbox_initialize();
571 mempfix_initialize();
573 interrupt_initialize();
574 exception_initialize();
579 「ATT_INI」静的APIで追加した初期化ルーチンを順に呼び出す関数を生成する.
582 ATT_INI({ iniatr, exinf, inirtn });
586 inirtn((VP_INT)(exinf));
588 を呼び出す関数を,call_inirtn という名前で生成する.初期化ルーチンを呼
589 び出す順序は,システムコンフィギュレーションファイル中での静的APIの順
594 ATT_INI({ TA_HLNG, 0, timer_initialize });
595 ATT_INI({ TA_HLNG, (INT) CONSOLE_PORTID, serial_initialize });
597 という二つの静的APIがこの順序で記述された時に生成する関数は次の通りで
603 timer_initialize((VP_INT)(0));
604 serial_initialize((VP_INT)((INT) CONSOLE_PORTID));
609 初期化ルーチンに関するエラー条件は次の通りである.
611 ・iniatr が 0 でない場合(E_RSATR)
613 ※ この他に,inirtn がプログラムの開始番地として正しいない場合にもエラー
614 とすべきだが,エラー条件がターゲットに依存してしまうため,今後の課題と