OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / doc / configurator.txt
1
2                 TOPPERS/ASPカーネル
3                 コンフィギュレータ仕様
4
5                 対応バージョン: Release 1.6.0
6                 最終更新: 2010年6月27日
7
8 このドキュメントは,TOPPERS/ASPカーネルのコンフィギュレータが標準的に生
9 成すべきファイルの内容について解説したものである.ターゲット依存に生成
10 する内容については,このドキュメントの範囲外である.
11
12 ----------------------------------------------------------------------
13  TOPPERS/ASP Kernel
14      Toyohashi Open Platform for Embedded Real-Time Systems/
15      Advanced Standard Profile Kernel
16
17  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
18              Graduate School of Information Science, Nagoya Univ., JAPAN
19  
20  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25      スコード中に含まれていること.
26  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29      の無保証規定を掲載すること.
30  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32      と.
33    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34        作権表示,この利用条件および下記の無保証規定を掲載すること.
35    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36        報告すること.
37  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41      免責すること.
42  
43  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
44  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
45  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
46  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
47  の責任を負わない.
48  
49  $Id: configurator.txt 1862 2010-07-25 11:49:51Z ertl-hiro $
50 ----------------------------------------------------------------------
51
52 ○目次
53
54 ・生成するファイルの種類
55 ・静的API一覧
56 ・カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
57 ・カーネル構成・初期化ファイル(kernel_cfg.c)
58         (1) 固定生成部分
59         (2) インクルードディレクティブ(#include)の処理
60         (3-1) トレースログマクロのデフォルト定義
61         (3-2) オブジェクトのID番号を保持する変数の定義
62         (4) 各カーネルオブジェクトに関する定義
63         (5) 割込みに関する定義
64         (6) CPU例外に関する定義
65         (7) 非タスクコンテキスト用のスタック領域に関する定義
66         (8) タイムイベント管理に関する定義
67         (9) 各モジュールの初期化関数の定義
68         (10) 初期化ルーチンの実行関数の定義
69         (11) 終了処理ルーチンの実行関数の定義
70
71
72 ○生成するファイルの種類
73
74 ASPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ
75 ルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期
76 化ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの
77 処理の途中に,必要な中間ファイルを生成する.
78
79
80 ○静的API一覧
81
82 ASPカーネルのコンフィギュレータが処理する静的APIは次の通り.
83
84 (1) タスク管理機能
85         CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
86                                                                 PRI itskpri, SIZE stksz, STK_T *stk })
87
88 (2) タスク例外処理機能
89         DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })
90
91 (3) 同期・通信機能
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 })
97
98 ※ dtqmb,pdqmb,mprihdがNULLでない場合はサポートしない.
99
100 (4) メモリプール管理機能
101         CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
102                                                                                 MPF_T *mpf, void *mpfmb })
103
104 ※ mpfmbがNULLでない場合はサポートしない.
105
106 (5) 時間管理機能
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 })
110
111 (6) 割込み管理機能
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 })
115
116 (7) CPU例外管理機能
117         DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
118
119 (8) システム構成管理機能
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 })
123
124 これらの静的APIのパラメータの内,ID型のパラメータはオブジェクト識別名,
125 ポインタ型(void *,TASK,TEXRTN,CYCHDR,ALMHDR,ISR,INTHDR,EXCHDR,
126 INIRTN,TERRTN,STK_T *,MPF_T *)およびintptr_t型のパラメータは一般定
127 数式パラメータとする.その他のパラメータは,整数定数式パラメータとする.
128
129
130 ○カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
131
132 カーネル構成・初期化ヘッダファイル(kernel_cfg.h)には,次の定義を生成
133 する.
134
135 (1) 固定生成部分
136
137 kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.具
138 体的には,ファイルの先頭に次の行を生成する.
139
140 #ifndef TOPPERS_KERNEL_CFG_H
141 #define TOPPERS_KERNEL_CFG_H
142
143 また,ファイルの末尾に次の行を生成する.
144
145 #endif  /* TOPPERS_KERNEL_CFG_H */
146
147 (2) オブジェクト数の定義
148
149 カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ
150 レクティブ(#define)を生成する.具体的には,次のような記述を生成する.
151
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      <アラームハンドラの数>
161
162 (3) オブジェクトのID番号の定義
163
164 コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた
165 ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
166 例えば,次のような記述を生成する.
167
168 #define TASK1   1
169 #define TASK2   2
170 #define SEM1    1
171
172 ○カーネル構成・初期化ファイル(kernel_cfg.c)
173
174 (1) 固定生成部分
175
176 kernel_cfg.c用のヘッダファイルとID自動割付け結果ファイルをインクルード
177 するプリプロセッサディレクティブ(#include)を生成する.具体的には,次
178 の行を生成する.
179
180 #include "kernel/kernel_int.h"
181 #include "kernel_cfg.h"
182
183 (2) インクルードディレクティブ(#include)の処理
184
185 システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ
186 ンクルードディレクティブ(#include)と同一のディレクティブ(#include)
187 を生成する.例えば,
188
189 #include "sample1.h"
190
191 というインクルードディレクティブに対して,
192
193 #include "sample1.h"
194
195 というディレクティブを生成する.生成するディレクティブの順序は,システ
196 ムコンフィギュレーションファイル中でのインクルードディレクティブの順序
197 に一致させる.
198
199 (3-1) トレースログマクロのデフォルト定義
200
201 kernel_cfg.cの中で使用するトレースログマクロのデフォルト定義を生成する.
202 具体的には,次の行を生成する.
203
204 #ifndef LOG_ISR_ENTER
205 #define LOG_ISR_ENTER(intno)
206 #endif /* LOG_ISR_ENTER */
207
208 #ifndef LOG_ISR_LEAVE
209 #define LOG_ISR_LEAVE(intno)
210 #endif /* LOG_ISR_LEAVE */
211
212 (3-2) オブジェクトのID番号を保持する変数の定義
213
214 コンフィギュレータに対するオプション指定(--external-id)により,コンフィ
215 ギュレータがID 番号を割り付けたオブジェクトの名前の末尾に"_id"を付加し
216 た名前の変数を生成する.変数は,const属性を付加したID型の変数とし,割り
217 付けたID番号を値とする.例えば,次のような記述を生成する.
218
219 const ID TASK1_id = 1;
220 const ID TASK2_id = 2;
221 const ID SEM1_id = 1;
222
223 (4) 各カーネルオブジェクトに関する定義
224
225 システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
226 API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
227 成のための定義を生成する.
228
229 コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各
230 オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
231 重複がなく,ID番号が連続するように割り付ける.
232
233 コンフィギュレータに対するオプション指定(--id-input-file)により,コン
234 フィギュレータがオブジェクトに割り付けるID番号を指定することができる.
235 同じ種類の異なるオブジェクトに対して同じID番号を指定したり,コンフィギュ
236 レータがID番号をできる限り連続するように割り付けたとしてもID番号が連続
237 しない場合には(ASPカーネルは,オブジェクトのID番号が連続していることを
238 仮定して実装してある),コンフィギュレータはエラーを報告する.
239
240 また,コンフィギュレータに対するオプション指定(--id-output-file)によ
241 り,コンフィギュレータがID番号を割り付けたオブジェクトの名前と割り付け
242 たID番号の組を,オプションで指定したファイルに出力する.
243
244 各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
245 ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する.
246
247 (a) 最大のオブジェクトIDの変数の定義
248
249 最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク
250 トの省略記号を「XXX/xxx」とすると,次のような行を生成する.
251
252 const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
253
254 (b) オブジェクトに必要なメモリ領域の定義
255
256 オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
257 具体的には,オブジェクト毎の項で説明する.
258
259 (c) オブジェクトの初期化ブロックの定義
260
261 オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト
262 の省略記号を「XXX/xxx」とすると,次のような行を生成する.
263
264 const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
265         <オブジェクトIDが1のオブジェクトの初期化情報>,
266         <オブジェクトIDが2のオブジェクトの初期化情報>,
267                                 ……
268         <オブジェクトIDがTNUM_XXXIDのオブジェクトの初期化情報>
269 };
270
271 オブジェクトの初期化情報の形式は,オブジェクト毎に異なる.具体的には,
272 オブジェクト毎の項で説明する.
273
274 (d) オブジェクトのコントロールブロックの定義
275
276 オブジェクトのコントロールブロックの定義を生成する.具体的には,オブジェ
277 クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
278
279 XXXCB _kernel_xxxcb_table[TNUM_XXXID];
280
281 (4-1) タスクに関する定義
282
283 ASPカーネルは,タスクが一つもないケースに対応していないため,タスクに関
284 する定義は必ず生成しなければならない.
285
286 タスクの省略記号は「TSK」「tsk」である.ただし,タスク初期化ブロックの
287 データ型はTINIB,その変数名は_kernel_tinib_table,タスクコントロールブ
288 ロックのデータ型はTCB,その変数名は_kernel_tcb_table である(いずれも
289 「TSK/tsk」に代えて「T/t」を用いている).
290
291 タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて,
292 「DEF_TEX」静的APIで指定される情報を含める.
293
294 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
295 ている時に生成すべき情報について述べる.
296
297 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
298 DEF_TEX(tskid, { texatr, texrtn });
299
300 (4-1-1) タスクに必要なメモリ領域の定義
301
302 タスクに必要なメモリ領域として,タスクのスタック領域がある.stkがNULLの
303 場合には,生成するタスク毎に,指定されたサイズのスタック領域を確保する.
304 具体的には,上記の静的APIに対して,次の定義を生成する.
305
306 *stkがNULLの場合のみ生成
307 static STK_T _kernel_stack_<タスク名>[COUNT_STK_T(stksz)];
308
309 (4-1-2) タスクの初期化情報
310
311 タスク初期化ブロック中に生成するタスクの初期化情報は,次の形式とする.
312
313         { (tskatr), (intptr_t)(exinf), (task), INT_PRIORITY(itskpri),
314                                                                 (stksz), (stk), (texatr), (texrtn) }
315
316 ここで,stkがNULLの場合には,(stksz)に代えてROUND_STK_T(stksz)を,
317 (stk)に代えて(_kernel_stack_<タスク名>)を生成する.CRE_TSKに対応する
318 DEF_TEXがない場合には,texatrをTA_NULL,texrtnをNULLとする.
319
320 (4-1-3) タスク生成順序テーブルの定義
321
322 タスクに対しては,生成された順序(タスクを生成する静的APIが記述された
323 順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で,
324 タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ
325 る.
326
327 具体的には,次のような行を生成する.
328
329 const ID _kernel_torder_table[TNUM_TSKID] = {
330         <最初に生成されたタスクのタスクID>,
331         <2番目に生成されたタスクのタスクID>,
332                                 ……
333         <最後に生成されたタスクのタスクID>
334 };
335
336 (4-1-4) エラー条件
337
338 タスクに関するエラー条件は次の通りである.
339
340 *コンフィギュレータ本体が検出するもの
341 ・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ)
342 ・DEF_TEXに対応するCRE_TSKがない場合(E_NOEXS)
343 ・同じtskidに対するDEF_TEXが複数ある場合(E_OBJ)
344
345 *パス2で検出するもの
346 ・tskatrが([TA_ACT])でない場合(E_RSATR)
347         ※ ターゲット依存部でタスク属性を追加可(TARGET_TSKATR)
348 ・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
349 ・stkszが0か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さい場
350  合(E_PAR)
351 ・stkszがスタック領域のサイズとして正しくない場合(E_PAR)
352         - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
353         ※ このエラーチェックは,stkがNULLでない場合にのみ行う
354 ・texatrが(TA_NULL)でない場合(E_RSATR)
355
356 *パス3で検出するもの
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)
363
364 (4-2) セマフォに関する定義
365
366 セマフォの省略記号は「SEM/sem」である.以下では,システムコンフィギュレー
367 ションファイルに次の静的APIが含まれている時に生成すべき情報について述べ
368 る.なお,セマフォに必要なメモリ領域はない.
369
370 CRE_SEM(semid, { sematr, isemcnt, maxsem });
371
372 (4-2-1) セマフォの初期化情報
373
374 セマフォ初期化ブロック中に生成するセマフォの初期化情報は,次の形式とす
375 る.
376
377         { (sematr), (isemcnt), (maxsem) }
378
379 (4-2-2) エラー条件
380
381 セマフォに関するエラー条件は次の通りである.
382
383 *コンフィギュレータ本体が検出するもの
384 ・同じsemidに対するCRE_SEMが複数ある場合(E_OBJ)
385
386 *パス2で検出するもの
387 ・sematrが([TA_TPRI])でない場合(E_RSATR)
388 ・(0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
389 ・(1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
390
391 (4-3) イベントフラグに関する定義
392
393 イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ
394 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
395 いて述べる.なお,イベントフラグに必要なメモリ領域はない.
396
397 CRE_FLG(flgid, { flgatr, iflgptn });
398
399 (4-3-1) イベントフラグの初期化情報
400
401 イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情報は,
402 次の形式とする.
403
404         { (flgatr), (iflgptn) }
405
406 (4-3-2) エラー条件
407
408 イベントフラグに関するエラー条件は次の通りである.
409
410 *コンフィギュレータ本体が検出するもの
411 ・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ)
412
413 *パス2で検出するもの
414 ・flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
415
416 (4-4) データキューに関する定義
417
418 データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ
419 レーションファイルに次の静的APIが含まれている時に生成すべき情報について
420 述べる.
421
422 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
423
424 (4-4-1) データキューに必要なメモリ領域の定義
425
426 データキューに必要なメモリ領域として,データキュー管理領域がある.生成
427 するデータキュー毎に,必要なサイズのデータキュー管理領域を定義する.具
428 体的には,上記の静的APIに対して,次の定義を生成する.
429
430 *dtqcntが0でない場合のみ生成
431 static intptr_t _kernel_dtqmb_<データキュー名>[dtqcnt];
432
433 (4-4-2) データキューの初期化情報
434
435 データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の
436 形式とする.
437
438         { (dtqatr), (dtqcnt), (_kernel_dtqmb_<データキュー名>) }
439
440 ここで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
441 NULLを用いる.
442
443 (4-4-3) エラー条件
444
445 データキューに関するエラー条件は次の通りである.
446
447 *コンフィギュレータ本体が検出するもの
448 ・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ)
449
450 *パス2で検出するもの
451 ・dtqatrが([TA_TPRI])でない場合(E_RSATR)
452 ・dtqmbがNULLでない場合(E_NOSPT)
453
454 (4-5) 優先度データキューに関する定義
455
456 優先度データキューの省略記号は「PDQ/pdq」である.以下では,システムコ
457 ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
458 報について述べる.
459
460 CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });
461
462 (4-5-1) 優先度データキューに必要なメモリ領域の定義
463
464 優先度データキューに必要なメモリ領域として,優先度データキュー管理領域
465 がある.生成する優先度データキュー毎に,必要なサイズの優先度データキュー
466 管理領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成す
467 る.
468
469 *pdqcntが0でない場合のみ生成
470 static PDQMB _kernel_pdqmb_<優先度データキュー名>[pdqcnt];
471
472 (4-5-2) 優先度データキューの初期化情報
473
474 優先度データキュー初期化ブロック中に生成する優先度データキューの初期化
475 情報は,次の形式とする.
476
477         { (pdqatr), (pdqcnt), (maxdpri), (_kernel_pdqmb_<優先度データキュー名>) }
478
479 ここで,pdqcntが0の場合には,_kernel_pdqmb_<優先度データキュー名>に代え
480 て,NULLを用いる.
481
482 (4-5-3) エラー条件
483
484 優先度データキューに関するエラー条件は次の通りである.
485
486 *コンフィギュレータ本体が検出するもの
487 ・同じpdqidに対するCRE_PDQが複数ある場合(E_OBJ)
488
489 *パス2で検出するもの
490 ・pdqatrが([TA_TPRI])でない場合(E_RSATR)
491 ・(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
492 ・pdqmbがNULLでない場合(E_NOSPT)
493
494 (4-6) メールボックスに関する定義
495
496 メールボックスの省略記号は「MBX/mbx」である.以下では,システムコンフィ
497 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
498 いて述べる.なお,メールボックスに必要なメモリ領域はない.
499
500 CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd });
501
502 (4-6-1) メールボックスの初期化情報
503
504 メールボックス初期化ブロック中に生成するメールボックスの初期化情報は,
505 次の形式とする.
506
507         { (mbxatr), (maxmpri) }
508
509 (4-6-2) エラー条件
510
511 メールボックスに関するエラー条件は次の通りである.
512
513 *コンフィギュレータ本体が検出するもの
514 ・同じmbxidに対するCRE_MBXが複数ある場合(E_OBJ)
515
516 *パス2で検出するもの
517 ・mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
518 ・(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
519 ・mprihdがNULLでない場合(E_NOSPT)
520
521 (4-7) 固定長メモリプールに関する定義
522
523 固定長メモリプールの省略記号は「MPF/mpf」である.以下では,システムコ
524 ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
525 報について述べる.
526
527 CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf, mpfmb });
528
529 (4-7-1) 固定長メモリプールに必要なメモリ領域の定義
530
531 固定長メモリプールに必要なメモリ領域として,固定長メモリプール領域と固
532 定長メモリプール管理領域がある.生成する固定長メモリプール毎に,必要な
533 サイズの固定長メモリプール領域(mpfがNULLの場合のみ)と固定長メモリプー
534 ル管理領域を確保する.具体的には,上記の静的APIに対して,次の定義を生成
535 する.
536
537 *mpfがNULLの場合のみ生成
538 static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
539                                                                 
540 *必ず生成
541 static MPFMB _kernel_mpfmb_<固定長メモリプール名>[blkcnt];
542
543 (4-7-2) 固定長メモリプールの初期化情報
544
545 固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
546 情報は,次の形式とする.
547
548         { (mpfatr), (blkcnt), ROUND_MPF_T(blksz), mpf,
549                                                 (_kernel_mpfmb_<固定長メモリプール名>) }
550
551 ここで,mpfがNULLの場合には,mpfに代えて,_kernel_mpf_<固定長メモリプー
552 ル名>を用いる.
553
554 (4-7-3) エラー条件
555
556 固定長メモリプールに関するエラー条件は次の通りである.
557
558 *コンフィギュレータ本体が検出するもの
559 ・同じmpfidに対するCRE_MPFが複数ある場合(E_OBJ)
560
561 *パス2で検出するもの
562 ・mpfatrが([TA_TPRI])でない場合(E_RSATR)
563 ・blkcntが0の場合(E_PAR)
564 ・blkszが0の場合(E_PAR)
565 ・mpfmbがNULLでない場合(E_NOSPT)
566
567 *パス3で検出するもの
568 ・mpfが固定長メモリプール領域の先頭番地として正しくない場合(E_PAR)
569         - ターゲット依存の値(CHECK_MPF_ALIGN)の倍数でない場合
570         - NULLの場合(ターゲット依存,CHECK_MPF_NONNULL)
571
572 (4-8) 周期ハンドラに関する定義
573
574 周期ハンドラの省略記号は「CYC/cyc」である.以下では,システムコンフィ
575 ギュレーションファイルに次の静的APIが含まれている時に生成すべき情報につ
576 いて述べる.なお,周期ハンドラに必要なメモリ領域はない.
577
578 CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });
579
580 (4-8-1) 周期ハンドラの初期化情報
581
582 周期ハンドラ初期化ブロック中に生成する周期ハンドラの初期化情報は,次の
583 形式とする.
584
585         { (cycatr), (intptr_t)(exinf), (cychdr), (cyctim), (cycphs) }
586
587 (4-8-2) エラー条件
588
589 周期ハンドラに関するエラー条件は次の通りである.
590
591 *コンフィギュレータ本体が検出するもの
592 ・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ)
593
594 *パス2で検出するもの
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)の場合
599
600 *パス3で検出するもの
601 ・cychdrがプログラムの開始番地として正しくない場合(E_PAR)
602         - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
603         - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
604
605 (4-9) アラームハンドラに関する定義
606
607 アラームハンドラの省略記号は「ALM/alm」である.以下では,システムコン
608 フィギュレーションファイルに次の静的APIが含まれている時に生成すべき情報
609 について述べる.なお,アラームハンドラに必要なメモリ領域はない.
610
611 CRE_ALM(ID almid, { almatr, (intptr_t)(exinf), almhdr });
612
613 (4-9-1) アラームハンドラの初期化情報
614
615 アラームハンドラ初期化ブロック中に生成するアラームハンドラの初期化情報
616 は,次の形式とする.
617
618         { (almatr), (exinf), (almhdr) }
619
620 (4-9-2) エラー条件
621
622 アラームハンドラに関するエラー条件は次の通りである.
623
624 *コンフィギュレータ本体が検出するもの
625 ・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ)
626
627 *パス2で検出するもの
628 ・almatrが(TA_NULL)でない場合(E_RSATR)
629
630 *パス3で検出するもの
631 ・almhdrがプログラムの開始番地として正しくない場合(E_PAR)
632         - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
633         - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
634
635 (5) 割込みに関する定義
636
637 割込みに関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
638 ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
639 を生成する.ターゲット毎に定める場合には,(5-1)と(5-3)に述べる情報は生
640 成しない((5-2)に述べる情報は生成する).
641
642 (5-1) 割込み要求ラインに関する定義
643
644 割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
645 ラインに関する定義を生成する.具体的には次の通り.
646
647 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
648 ている時に生成すべき情報について述べる.
649
650 CFG_INT(INTNO intno, { intatr, intpri });
651
652 (5-1-1) 設定する割込み要求ラインの数
653
654 設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
655 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
656 には,次のような行を生成する.
657
658 #define TNUM_INTNO <設定する割込み要求ラインの数>
659 const uint_t    _kernel_tnum_intno = TNUM_INTNO;
660
661 (5-1-2) 割込み要求ライン初期化ブロックの定義
662
663 割込み要求ライン初期化ブロックを生成する.具体的には,次のような行を生
664 成する.
665
666 const INTINIB _kernel_intinib_table[TNUM_INTNO] = {
667         <割込み要求ライン1の初期化情報>,
668         <割込み要求ライン2の初期化情報>,
669                                 ……
670         <割込み要求ラインTNUM_INTNOの初期化情報>
671 };
672
673 この中の割込み要求ラインの初期化情報は,次の形式とする.
674
675         { (intno), (intatr), (intpri) }
676
677 (5-1-3) エラー条件
678
679 割込み要求ラインに関するエラー条件は次の通りである.
680
681 *パス2で検出するもの
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よりも
687  小さい値が指定された場合(E_OBJ)
688 ・カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRIより
689  も小さい値が指定されなかった場合(E_OBJ)
690 ・intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
691
692 *必要に応じてターゲット依存部で検出するもの
693 ・intatrが割込み属性として設定できない値の場合(E_RSATR)
694 ・intpriが割込み優先度として設定できない値の場合(E_PAR)
695 ・同一の割込み優先度しか設定できない割込み要求ラインに対して,異なる割
696  込み優先度を設定した場合(E_PAR)
697
698 (5-2) 割込みサービスルーチンに関する定義
699
700 (5-2-1) 割込みハンドラの生成
701
702 システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ
703 ンを追加する静的API「ATT_ISR」に対して,同一の割込み番号に対して追加さ
704 れた割込みサービスルーチンを順に呼び出す関数を生成する.
705
706 具体的には,同一の割込み番号に対して割込みサービスルーチンを追加する
707
708 ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 });
709 ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 });
710         ……
711 ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n });
712
713 という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
714 isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
715 値が同じものの間では,システムコンフィギュレーションファイル中での静的
716 APIの順序の通りに並んでいるものとする.
717
718 static void
719 _kernel_inthdr_<intno>(void)
720 {
721         PRI             saved_ipm;
722
723         i_begin_int(intno);
724         saved_ipm = i_get_ipm();
725
726         LOG_ISR_ENTER(<intno>);         /* ISR1の呼出し */
727         isr_1((intptr_t)(exinf_1));
728         LOG_ISR_LEAVE(intno);
729
730         if (i_sense_loc()) {            /* ISRの呼出し前の状態に戻す */
731                 i_unlock_cpu();
732         }
733         i_set_ipm(saved_ipm);
734
735         LOG_ISR_ENTER(<intno>);         /* ISR2の呼出し */
736         isr_2((intptr_t)(exinf_2));
737         LOG_ISR_LEAVE(intno);
738
739         if (i_sense_loc()) {            /* ISRの呼出し前の状態に戻す */
740                 i_unlock_cpu();
741         }
742         i_set_ipm(saved_ipm);
743
744         ……
745
746         LOG_ISR_ENTER(<intno>);         /* ISRnの呼出し */
747         isr_n((intptr_t)(exinf_n));
748         LOG_ISR_LEAVE(intno);
749
750         i_end_int(intno);
751 }
752
753 ここで,ISRnの呼出しの後に呼出し前の状態に戻さないのは,割込みハンドラ
754 からのリターンにより,カーネルが元の状態に戻すためである.
755
756 同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合
757 には,次のような関数を生成する.
758
759 static void
760 _kernel_inthdr_<intno>(void)
761 {
762         i_begin_int(intno);
763         LOG_ISR_ENTER(intno);
764         isr_1((intptr_t)(exinf_1));
765         LOG_ISR_LEAVE(intno);
766         i_end_int(intno);
767 }
768
769 【課題】ここで,LOG_ISR_ENTER,LOG_ISR_LEAVEの引数をどうするかが課題と
770 して残っている.ATT_ISRで登録されたISRに対してはISR IDが付与されないた
771 め,IDでISRを区別することができない.やむなく割込み番号を渡しているが,
772 拡張情報(exinf)も渡すべきかもしれない.
773
774 (5-2-2) 割込みハンドラの定義に相当する処理
775
776 上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ
777 に関する定義において,システムコンフィギュレーションファイル中に次の静
778 的APIが含まれているのと同様に処理する.
779
780 DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });
781
782 ここでinhnoは,intnoに対応する割込みハンドラ番号である.
783
784 (5-2-3) エラー条件
785
786 割込みサービスルーチンに関するエラー条件は次の通りである.
787
788 *パス2で検出するもの
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よりも小さい
797  場合(E_OBJ)
798         ※ カーネル管理外のISRはサポートしないため
799
800 *必要に応じてターゲット依存部で検出するもの
801 ・isrがプログラムの開始番地として正しくない場合(E_PAR)
802
803 (5-3) 割込みハンドラに関する定義
804
805 割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ(上
806 述の割込みサービスルーチンの追加によりコンフィギュレータが生成した割込
807 みハンドラを含む)に関する定義を生成する.具体的には次の通り.
808
809 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
810 ている時に生成すべき情報について述べる.
811
812 DEF_INH(inhno, { inhatr, inthdr });
813
814 (5-3-1) 定義する割込みハンドラの数
815
816 定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
817 (#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
818 には,次のような行を生成する.
819
820 #define TNUM_INHNO <定義する割込みハンドラの数>
821 const uint_t    _kernel_tnum_inhno = TNUM_INHNO;
822
823 (5-3-2) 割込みハンドラの出入口処理
824
825 定義する割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成す
826 る.具体的には,次のような行を生成する.
827
828 INTHDR_ENTRY(inhno, inhno_num, inthdr)
829
830 ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
831 アセンブリ言語記述に使用するためのものである.
832
833 (5-3-3) 割込みハンドラ初期化ブロックの定義
834
835 割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
836 する.
837
838 const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {
839         <割込みハンドラ1の初期化情報>,
840         <割込みハンドラ2の初期化情報>,
841                                 ……
842         <割込みハンドラTNUM_INHNOの初期化情報>
843 };
844
845 この中の割込みハンドラの初期化情報は,次の形式とする.
846
847         { (inhno), (inhatr), (FP)(INT_ENTRY(inhno, inthdr)) }
848
849 (5-3-4) エラー条件
850
851 割込みハンドラに関するエラー条件は次の通りである.
852
853 *パス2で検出するもの
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が指定
863  されている場合(E_RSATR)
864 ・カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
865  定されていない場合(E_RSATR)
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           する割込み番号として正しくない場合には,このチェックを行わない
877
878 *必要に応じてターゲット依存部で検出するもの
879 ・inthdrがプログラムの開始番地として正しくない場合(E_PAR)
880
881 (6) CPU例外に関する定義
882
883 CPU例外に関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
884 ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
885 を生成する.ターゲット毎に定める場合には,これらの情報は生成されない.
886
887 システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
888 静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
889 生成する.
890
891 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
892 ている時に生成すべき情報について述べる.
893
894 DEF_EXC(excno, { excatr, exchdr });
895
896 (6-1) 定義するCPU例外ハンドラの数
897
898 定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
899 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
900 的には,次のような行を生成する.
901
902 #define TNUM_EXCNO <定義するCPU例外ハンドラの数>
903 const uint_t    _kernel_tnum_excno = TNUM_EXCNO;
904
905 (6-2) CPU例外ハンドラの出入口処理
906
907 定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成
908 する.具体的には,次のような行を生成する.
909
910 EXCHDR_ENTRY(excno, excno_num, exchdr)
911
912 ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
913 アセンブリ言語記述に使用するためのものである.
914
915 (6-3) CPU例外ハンドラ初期化ブロックの定義
916
917 CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
918 する.
919
920 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
921         <CPU例外ハンドラ1の初期化情報>,
922         <CPU例外ハンドラ2の初期化情報>,
923                                 ……
924         <CPU例外ハンドラTNUM_EXCNOの初期化情報>
925 };
926
927 この中のCPU例外ハンドラの初期化情報は,次の形式とする.
928
929         { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
930
931 (6-4) エラー条件
932
933 CPU例外ハンドラに関するエラー条件は次の通りである.
934
935 *パス2で検出するもの
936 ・excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
937 ・excnoがDEF_EXCによって設定済みの場合(E_OBJ)
938 ・excatrが(TA_NULL)でない場合(E_RSATR)
939         ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
940
941 *必要に応じてターゲット依存部で検出するもの
942 ・exchdrがプログラムの開始番地として正しくない場合(E_PAR)
943
944 (7) 非タスクコンテキスト用のスタック領域に関する定義
945
946 非タスクコンテキスト用のスタック領域に関する定義は,必ず生成しなければ
947 ならない.
948
949 (7-1) DEF_ICSがない場合
950
951 システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
952 いない場合には,次の行を生成する.
953
954 #ifdef DEFAULT_ISTK
955
956 #define TOPPERS_ISTKSZ          DEFAULT_ISTKSZ
957 #define TOPPERS_ISTK            DEFAULT_ISTK
958
959 #else /* DEFAULT_ISTK */
960
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
964
965 #endif /* DEFAULT_ISTK */
966
967 (7-2) DEF_ICSがある場合
968
969 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
970 いる時に生成すべき情報について述べる.
971
972 DEF_ICS({ istksz, istk });
973
974 istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
975 ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情報を生成
976 する.具体的には,上記の静的APIに対して,次の行を生成する.
977
978 static STK_T                            _kernel_istack[COUNT_STK_T(istksz)];
979 #define TOPPERS_ISTKSZ          ROUND_STK_T(istksz)
980 #define TOPPERS_ISTK            _kernel_istack
981
982 istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
983 情報を,次の形式で生成する.
984
985 #define TOPPERS_ISTKSZ          (istksz)
986 #define TOPPERS_ISTK            (istk)
987
988 (7-3) 変数の生成
989
990 DEF_ICSの有無によらず,次の定義を生成する.
991
992 const SIZE              _kernel_istksz = TOPPERS_ISTKSZ;
993 STK_T *const    _kernel_istk = TOPPERS_ISTK;
994
995 #ifdef TOPPERS_ISTKPT
996 STK_T *const    _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
997 #endif /* TOPPERS_ISTKPT */
998
999 (7-4) エラー条件
1000
1001 非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
1002
1003 *パス2で検出するもの
1004 ・静的API「DEF_ICS」が複数ある(E_OBJ)
1005 ・istkszがスタック領域のサイズとして正しくない場合(E_PAR)
1006         - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
1007         ※ このエラーチェックは,istkがNULLでない場合にのみ行う
1008
1009 *パス3で検出するもの
1010 ・istkがスタック領域の先頭番地として正しくない場合(E_PAR)
1011         - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
1012         - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
1013
1014 *必要に応じてターゲット依存部で検出するもの
1015 ・istkszが小さすぎる場合(E_PAR)
1016
1017 (8) タイムイベント管理に関する定義
1018
1019 タイムイベント管理に関連して,次の定義を生成する.
1020
1021 TMEVTN  _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
1022
1023 (9) 各モジュールの初期化関数の定義
1024
1025 各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
1026 初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
1027 の2つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
1028
1029         _kernel_initialize_interrupt
1030         _kernel_initialize_exception
1031
1032 すべての機能を使った場合に生成される関数は次の通りである.
1033
1034 void
1035 _kernel_initialize_object(void)
1036 {
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();
1048 }
1049
1050
1051 (10) 初期化ルーチンの実行関数の定義
1052
1053 システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
1054 する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
1055 数を生成する.具体的には,
1056
1057 ATT_INI({ iniatr, exinf, inirtn });
1058
1059 という静的APIに対して,
1060
1061         (inirtn)((intptr_t)(exinf));
1062
1063 を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
1064 ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1065 APIの順序に一致させる.
1066
1067 例えば,
1068
1069 ATT_INI({ TA_NULL, 0, timer_initialize });
1070 ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
1071
1072 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1073 る.
1074
1075 void
1076 _kernel_call_inirtn(void)
1077 {
1078         (timer_initialize)((intptr_t)(0));
1079         (serial_initialize)((intptr_t)(CONSOLE_PORTID));
1080 }
1081
1082 (10-1) エラー条件
1083
1084 初期化ルーチンに関するエラー条件は次の通りである.
1085
1086 *パス2で検出するもの
1087 ・iniatrが(TA_NULL)でない場合(E_RSATR)
1088
1089 *必要に応じてターゲット依存部で検出するもの
1090 ・inirtnがプログラムの開始番地として正しくない場合(E_PAR)
1091
1092 (11) 終了処理ルーチンの実行関数の定義
1093
1094 システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
1095 加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
1096 す関数を生成する.具体的には,
1097
1098 ATT_TER({ teratr, exinf, terrtn });
1099
1100 という静的APIに対して,
1101
1102         (terrtn)((intptr_t)(exinf));
1103
1104 を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
1105 チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1106 APIの逆順に一致させる.
1107
1108 例えば,
1109
1110 ATT_TER({ TA_NULL, 0, timer_terminate });
1111 ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
1112
1113 という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1114 る.
1115
1116 void
1117 _kernel_call_terrtn(void)
1118 {
1119         (serial_terminate)((intptr_t)(CONSOLE_PORTID));
1120         (timer_terminate)((intptr_t)(0));
1121 }
1122
1123 (11-1) エラー条件
1124
1125 終了処理ルーチンに関するエラー条件は次の通りである.
1126
1127 *パス2で検出するもの
1128 ・teratrが(TA_NULL)でない場合(E_RSATR)
1129
1130 *必要に応じてターゲット依存部で検出するもの
1131 ・terrtnがプログラムの開始番地として正しくない場合(E_PAR)
1132
1133 以上