OSDN Git Service

df5b4c1352c7fff4ac43e55b0b746b84ffa33825
[trx-305dsp/dsp.git] / hirado / kernel / doc / configurator.txt
1
2               = JSPカーネル コンフィギュレータ仕様 =
3
4              (Release 1.4対応,最終更新: 20-Dec-2003)
5
6 ------------------------------------------------------------------------ 
7  TOPPERS/JSP Kernel
8      Toyohashi Open Platform for Embedded Real-Time Systems/
9      Just Standard Profile Kernel
10
11  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
12                              Toyohashi Univ. of Technology, JAPAN
13
14  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
15  によって公表されている GNU General Public License の Version 2 に記
16  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
18  利用と呼ぶ)することを無償で許諾する.
19  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21      スコード中に含まれていること.
22  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
25      の無保証規定を掲載すること.
26  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
28      と.
29    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30        作権表示,この利用条件および下記の無保証規定を掲載すること.
31    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
32        報告すること.
33  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
35
36  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
40
41  @(#) $Id: configurator.txt,v 1.1 2009/01/31 05:27:37 suikan Exp $
42 ------------------------------------------------------------------------
43
44
45 このドキュメントでは,JSPカーネルのコンフィギュレータが生成すべきファ
46 イルの内容について解説する.
47
48 JSPカーネルのコンフィギュレータは,システムコンフィギュレーションファ
49 イルを処理して,カーネル構成ファイル(kernel_cfg.c)とID自動割付け結果
50 ファイル(kernel_id.h)を生成する.また,静的APIのパラメータチェックに
51 用いるファイル(kernel_chk.c)を生成する.
52
53 ID自動割付け結果ファイルは,コンフィギュレータがID番号を割り付けたオブ
54 ジェクトの名前を,割り付けたID番号に定義するファイルである.
55
56 以下では,カーネル構成ファイルの内容について解説する.
57
58 (1) 固定生成部分
59
60 (1-1) 標準インクルードファイル
61
62 kernel_cfg.c 用のインクルードファイルをインクルードするプリプロセッサ
63 ディレクティブ(#include)を生成する.具体的には,次の行を生成する.
64
65 #include "kernel_cfg.h"
66
67 また,必要であれば,ID自動割付け結果ファイルをインクルードするプリプロ
68 セッサディレクティブ(#include)を生成する.具体的には,次の行を生成す
69 る.
70
71 #include "kernel_id.h"
72
73 (1-2) マクロの置換順序の制御
74
75 マクロの置換順序を変えるために,以下のマクロ定義行を生成する.
76
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)
81
82 なお,これらのマクロは,元々は過去のバージョンとの互換性を保つために入
83 れたものである.ただし,過去のバージョンとの互換性が必要なくても,マク
84 ロの置換順序を変えるために必要である.
85
86 (2)「INCLUDE」静的APIの処理
87
88 システムコンフィギュレーションファイルに含まれる「INCLUDE」静的APIに対
89 応するプリプロセッサディレクティブ(#include)を生成する.例えば,
90
91 INCLUDE("\"sample1.h\"");
92
93 という静的APIに対して,
94
95 #include "sample1.h"
96
97 というディレクティブを生成する.生成するディレクティブの順序は,システ
98 ムコンフィギュレーションファイル中での静的APIの順序に一致させる.
99
100 (3) 各カーネルオブジェクトに関する定義
101
102 システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
103 API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
104 成のための定義を生成する.
105
106 コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,
107 それらをID番号の順に並べ替える.同じID番号のオブジェクトを生成する静的
108 APIが複数含まれている場合には,コンフィギュレータがエラーを報告する. 
109 JSPカーネルは,オブジェクトのID番号が連続していることを仮定して実装し
110 てある.ID番号が連続していない場合には,コンフィギュレータがエラーを報
111 告する.
112
113 また,コンフィギュレータは,オブジェクトのID番号の代わりに識別子が記述
114 されている場合に,そのオブジェクトにID番号を割り付ける.ID番号は,他の
115 オブジェクトのID番号と重複がなく,ID番号ができる限り連続するように割り
116 付ける.それでもID番号が連続にならない場合には,コンフィギュレータがエ
117 ラーを報告する.
118
119 各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
120 ブジェクトによって例外がある場合には,オブジェクト毎の項で説明する.
121
122 (a) オブジェクトの数
123
124 オブジェクトの数をマクロ定義するプリプロセッサディレクティブ(#define)
125 を生成する.具体的には,オブジェクトの省略記号を「XXX」とすると,次の
126 ような行を生成する.
127
128 #define TNUM_XXXID <オブジェクトの数>
129
130 (b) 最大のオブジェクトIDの変数の定義
131
132 最大のオブジェクトIDを持つ変数の定義を生成する.具体的には,オブジェク
133 トの省略記号を「XXX/xxx」とすると,次のような行を生成する.
134
135 const ID tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
136
137 (c) オブジェクトに必要なメモリ領域の定義
138
139 オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
140 具体的には,オブジェクト毎の項で説明する.
141
142 (d) オブジェクトの初期化ブロックの定義
143
144 オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト
145 の省略記号を「XXX/xxx」とすると,次のような行を生成する.
146
147 const XXXINIB xxxinib_table[TNUM_XXXID] = {
148         <オブジェクトIDが 1 のオブジェクトの初期化情報>,
149         <オブジェクトIDが 2 のオブジェクトの初期化情報>,
150                 ……
151         <オブジェクトIDが tmax_xxxid のオブジェクトの初期化情報>
152 };
153
154 オブジェクトの初期化情報の形式は,オブジェクト毎に異なる.具体的には,
155 オブジェクト毎の項で説明する.
156
157 (e) オブジェクトのコントロールブロックの定義
158
159 オブジェクトのコントロールブロックの定義を生成する.具体的には,オブジェ
160 クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
161
162 XXXCB xxxcb_table[TNUM_XXXID];
163
164 (3-1) タスクに関する定義
165
166 JSPカーネルは,タスクが一つもないケースに対応していないため,タスクに
167 関する定義は必ず生成しなければならない.
168
169 タスクに関する定義のインクルードファイル名とオブジェクトの省略記号は次
170 の通りである.ただし,タスク初期化ブロックのデータ型は TINIB,変数名は 
171 tinib_table,タスクコントロールブロックのデータ型は TCB,変数名は 
172 tcb_table である(いずれも「TSK/tsk」に代えて「T/t」を用いている).
173
174         インクルードファイル名: task.h
175         オブジェクトの省略記号: TSK
176
177 タスク初期化ブロックには,「CRE_TSK」静的APIで指定される情報に加えて,
178 「DEF_TEX」静的APIで指定される情報を含める.
179
180 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
181 ている時に生成すべき情報について述べる.
182
183 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stack });
184 DEF_TEX(tskid, { texatr, texrtn });
185
186 (3-1-1) タスクに必要なメモリ領域の定義
187
188 タスクに必要なメモリ領域として,タスクのスタック領域がある.生成する各
189 タスク毎に,指定されたサイズのスタック領域を定義する.具体的には,上記
190 の静的APIに対して,次の定義を生成する.
191
192 static __STK_UNIT <スタック領域の変数名>[__TCOUNT_STK_UNIT(stksz)];
193
194 ここで,<スタック領域の変数名> は,タスク毎に異なる識別子を生成して用
195 いる.
196
197 (3-1-2) タスクの初期化情報
198
199 タスク初期化ブロック中に生成するタスクの初期化情報は,次の形式とする.
200
201         { tskatr, (VP_INT)(exinf), (FP)(task), INT_PRIORITY(itskpri),
202             __TROUND_UNIT_STK(stksz), <スタック領域の変数名>,
203             texatr, (FP)(texrtn) }
204
205 ここで,CRE_TSK に対応する DEF_TEX がない場合には,texatr を TA_NULL,
206 texrtn を NULL とする.
207
208 (3-1-3) タスク生成順序テーブルの定義
209
210 タスクに対しては,生成された順序(タスクを生成する静的APIが記述された
211 順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で,
212 タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ
213 る.
214
215 具体的には,次のような行を生成する.
216
217 const ID torder_table[TNUM_TSKID] = {
218         <最初に生成されたタスクのタスクID>,
219         <2番目に生成されたタスクのタスクID>,
220                 ……
221         <最後に生成されたタスクのタスクID>
222 };
223
224 (3-1-4) エラー条件
225
226 タスクの初期化に関するエラー条件は次の通りである.
227
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)
233
234 ※ この他に,task や texrtn がプログラムの開始番地として正しいない場合
235 や,stksz が小さすぎる場合にもエラーとすべきだが,エラー条件がターゲッ
236 トに依存してしまうため,今後の課題とする.
237
238 (3-2) セマフォに関する定義
239
240 セマフォに関する定義のインクルードファイル名とオブジェクトの省略記号は
241 次の通りである.
242
243         インクルードファイル名: semaphore.h
244         オブジェクトの省略記号: SEM
245
246 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
247 ている時に生成すべき情報について述べる.なお,セマフォに必要なメモリ領
248 域はない.
249
250 CRE_SEM(semid, { sematr, isemcnt, maxsem });
251
252 (3-2-1) セマフォの初期化情報
253
254 セマフォ初期化ブロック中に生成するセマフォの初期化情報は,次の形式とす
255 る.
256
257         { sematr, isemcnt, maxsem }
258
259 (3-2-2) エラー条件
260
261 セマフォの初期化に関するエラー条件は次の通りである.
262
263 ・(sematr & ~(TA_TPRI)) が 0 でない場合(E_RSATR)
264 ・(isemcnt > maxsem) の場合(E_PAR)
265 ・(1 <= maxsem && maxsem <= TMAX_MAXSEM) でない場合(E_PAR)
266
267 (3-3) イベントフラグに関する定義
268
269 イベントフラグに関する定義のインクルードファイル名とオブジェクトの省略
270 記号は次の通りである.
271
272         インクルードファイル名: eventflag.h
273         オブジェクトの省略記号: FLG
274
275 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
276 ている時に生成すべき情報について述べる.なお,イベントフラグに必要なメ
277 モリ領域はない.
278
279 CRE_FLG(flgid, { flgatr, iflgptn });
280
281 (3-3-1) イベントフラグの初期化情報
282
283 イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情報は,
284 次の形式とする.
285
286         { flgatr, iflgptn }
287
288 (3-3-2) エラー条件
289
290 イベントフラグの初期化に関するエラー条件は次の通りである.
291
292 ・(flgatr & ~(TA_TPRI|TA_CLR)) が 0 でない場合(E_RSATR)
293
294 (3-4) データキューに関する定義
295
296 データキューに関する定義のインクルードファイル名とオブジェクトの省略記
297 号は次の通りである.
298
299         インクルードファイル名: dataqueue.h
300         オブジェクトの省略記号: DTQ
301
302 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
303 ている時に生成すべき情報について述べる.
304
305 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtq });
306
307 (3-4-1) データキューに必要なメモリ領域の定義
308
309 データキューに必要なメモリ領域として,データキュー領域がある.生成する
310 各データキュー毎に,必要なサイズのデータキュー領域を定義する.具体的に
311 は,上記の静的APIに対して,次の定義を生成する.
312
313 #if (dtqcnt) > 0
314 static VP_INT <データキュー領域の変数名>[dtqcnt];
315 #else
316 #define <データキュー領域の変数名> NULL
317 #endif
318
319 ここで,<データキュー領域の変数名> は,データキュー毎に異なる識別子を
320 生成して用いる.
321
322 (3-4-2) データキューの初期化情報
323
324 データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の
325 形式とする.
326
327         { dtqatr, dtqcnt, <データキュー領域の変数名> }
328
329 (3-4-3) エラー条件
330
331 データキューの初期化に関するエラー条件は次の通りである.
332
333 ・(dtqatr & ~(TA_TPRI)) が 0 でない場合(E_RSATR)
334 ・dtq が NULL でない場合(E_NOSPT)
335
336 (3-5) メールボックスに関する定義
337
338 メールボックスに関する定義のインクルードファイル名とオブジェクトの省略
339 記号は次の通りである.
340
341         インクルードファイル名: mailbox.h
342         オブジェクトの省略記号: MBX
343
344 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
345 ている時に生成すべき情報について述べる.なお,メールボックスに必要なメ
346 モリ領域はない.
347
348 CRE_MBX(mbxid, { mbxatr, maxmpri, mprihd });
349
350 (3-5-1) メールボックスの初期化情報
351
352 メールボックス初期化ブロック中に生成するメールボックスの初期化情報は,
353 次の形式とする.
354
355         { mbxatr, maxmpri }
356
357 (3-5-2) エラー条件
358
359 メールボックスの初期化に関するエラー条件は次の通りである.
360
361 ・(mbxatr & ~(TA_TPRI|TA_MPRI)) が 0 でない場合(E_RSATR)
362 ・(TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI) でない場合(E_PAR)
363 ・mprihd が NULL でない場合(E_NOSPT)
364
365 (3-6) 固定長メモリプールに関する定義
366
367 固定長メモリプールに関する定義のインクルードファイル名とオブジェクトの
368 省略記号は次の通りである.
369
370         インクルードファイル名: mempfix.h
371         オブジェクトの省略記号: MPF
372
373 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
374 ている時に生成すべき情報について述べる.
375
376 CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf });
377
378 (3-6-1) 固定長メモリプールに必要なメモリ領域の定義
379
380 固定長メモリプールに必要なメモリ領域として,固定長メモリプール領域があ
381 る.生成する各固定長メモリプール毎に,必要なサイズの固定長メモリプール
382 領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成する.
383
384 static __MPF_UNIT <固定長メモリプール領域の変数名>
385                                 [__TCOUNT_MPF_UNIT(blksz) * (blkcnt)];
386
387 ここで,<固定長メモリプール領域の変数名> は,固定長メモリプール毎に異
388 なる識別子を生成して用いる.
389
390 (3-6-2) 固定長メモリプールの初期化情報
391
392 固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
393 情報は,次の形式とする.
394
395         { mpfatr, __TROUND_MPF_UNIT(blksz), <固定長メモリプール領域の変数名>,
396                 (VP)(((VB *) <固定長メモリプール領域の変数名>)
397                         + sizeof(<固定長メモリプール領域の変数名>)) }
398
399 (3-6-3) エラー条件
400
401 固定長メモリプールの初期化に関するエラー条件は次の通りである.
402
403 ・(mpfatr & ~(TA_TPRI)) が 0 でない場合(E_RSATR)
404 ・blkcnt が 0 の場合(E_PAR)
405 ・blksz が 0 の場合(E_PAR)
406 ・mpf が NULL でない場合(E_NOSPT)
407
408 (3-7) 周期ハンドラに関する定義
409
410 周期ハンドラに関する定義のインクルードファイル名とオブジェクトの省略記
411 号は次の通りである.
412
413         インクルードファイル名: cyclic.h
414         オブジェクトの省略記号: CYC
415
416 以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
417 ている時に生成すべき情報について述べる.なお,周期ハンドラに必要なメモ
418 リ領域はない.
419
420 CRE_CYC(cycid, { cycatr, exinf, cychdr, cyctim, cycphs });
421
422 (3-7-1) 周期ハンドラの初期化情報
423
424 周期ハンドラ初期化ブロック中に生成する周期ハンドラの初期化情報は,次の
425 形式とする.
426
427         { cycatr, exinf, (FP)(cychdr), cyctim, cycphs }
428
429 (3-7-2) エラー条件
430
431 周期ハンドラの初期化に関するエラー条件は次の通りである.
432
433 ・(cycatr & ~(TA_STA)) が 0 でない場合(E_RSATR)
434 ・(cyctim > TMAX_RELTIM) の場合(E_PAR)
435 ・(cycphs > TMAX_RELTIM) の場合(E_PAR)
436
437 ※ この他に,cychdr がプログラムの開始番地として正しいない場合にもエラー
438 とすべきだが,エラー条件がターゲットに依存してしまうため,今後の課題と
439 する.
440
441 (4) 割込みハンドラに関する定義
442
443 システムコンフィギュレーションファイル中に,割込みハンドラを定義する静
444 的API「DEF_INH」が含まれている場合に,割込みハンドラに関する定義を生成
445 する.具体的には次の通り.
446
447 (4-1) 定義する割込みハンドラの数
448
449 定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
450 (#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
451 には,次のような行を生成する.
452
453 #define TNUM_INHNO <定義する割込みハンドラの数>
454 const UINT      tnum_inhno = TNUM_INHNO;
455
456 (4-2) 割込みハンドラの出入口処理
457
458 定義する各割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成
459 する.具体的には,
460
461 DEF_INH(inhno, { inhatr, inthdr });
462
463 という静的APIに対して,
464
465 CFG_INTHDR_ENTRY(inthdr);
466
467 という行を生成する.
468
469 (4-3) 割込みハンドラ初期化ブロックの定義
470
471 割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
472 する.
473
474 const INHINIB inhinib_table[TNUM_INHNO] = {
475         <割込みハンドラ 1 の初期化情報>,
476         <割込みハンドラ 2 の初期化情報>,
477                 ……
478         <割込みハンドラ TNUM_INHNO の初期化情報>
479 };
480
481 この中の割込みハンドラの初期化情報は,次の形式とする.
482
483         { inhno, inhatr, (FP)CFG_INT_ENTRY(inthdr) }
484
485 (4-4) エラー条件
486
487 割込みハンドラに関するエラー条件は次の通りである.
488
489 ・inhatr が 0 でない場合(E_RSATR)
490
491 ※ この他に,inthdr がプログラムの開始番地として正しいない場合や,
492 inhno が割込みハンドラ番号として正しくない場合にもエラーとすべきだが,
493 エラー条件がターゲットに依存してしまうため,今後の課題とする.
494
495 (5) CPU例外ハンドラに関する定義
496
497 システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
498 静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
499 生成する.具体的には次の通り.
500
501 (5-1) 定義するCPU例外ハンドラの数
502
503 定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
504 ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
505 的には,次のような行を生成する.
506
507 #define TNUM_EXCNO <定義するCPU例外ハンドラの数>
508 const UINT      tnum_excno = TNUM_EXCNO;
509
510 (5-2) CPU例外ハンドラの出入口処理
511
512 定義する各CPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生
513 成する.具体的には,
514
515 DEF_EXC(excno, { excatr, exchdr });
516
517 という静的APIに対して,
518
519 CFG_EXCHDR_ENTRY(exchdr);
520
521 という行を生成する.
522
523 (5-3) CPU例外ハンドラ初期化ブロックの定義
524
525 CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生
526 成する.
527
528 const EXCINIB excinib_table[TNUM_EXCNO] = {
529         <CPU例外ハンドラ 1 の初期化情報>,
530         <CPU例外ハンドラ 2 の初期化情報>,
531                 ……
532         <CPU例外ハンドラ TNUM_EXCNO の初期化情報>
533 };
534
535 この中のCPU例外ハンドラの初期化情報は,次の形式とする.
536
537         { excno, excatr, (FP)CFG_EXC_ENTRY(exchdr) }
538
539 (5-4) エラー条件
540
541 CPU例外ハンドラに関するエラー条件は次の通りである.
542
543 ・excatr が 0 でない場合(E_RSATR)
544
545 ※ この他に,excthdr がプログラムの開始番地として正しいない場合や,
546 excno がCPU例外ハンドラ番号として正しくない場合にもエラーとすべきだが,
547 エラー条件がターゲットに依存してしまうため,今後の課題とする.
548
549 (6) タイムイベント管理に関する定義
550
551 タイムイベント管理に関連して,次の定義を生成する.
552
553 TMEVTN  tmevt_heap[TNUM_TSKID + TNUM_CYCID];
554
555 (7) 各モジュールの初期化関数の定義
556
557 各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能
558 を初期化関数を順に呼び出す関数(object_initialize)を生成する.使用し
559 ない機能の初期化関数は,呼び出さない.
560
561 すべての機能を使った場合に生成される関数は次の通りである.
562
563 void
564 object_initialize()
565 {
566         task_initialize();
567         semaphore_initialize();
568         eventflag_initialize();
569         dataqueue_initialize();
570         mailbox_initialize();
571         mempfix_initialize();
572         cyclic_initialize();
573         interrupt_initialize();
574         exception_initialize();
575 }
576
577 (8) 初期化ルーチンの実行関数の定義
578
579 「ATT_INI」静的APIで追加した初期化ルーチンを順に呼び出す関数を生成する.
580 具体的には,
581
582 ATT_INI({ iniatr, exinf, inirtn });
583
584 という静的APIに対して,
585
586 inirtn((VP_INT)(exinf));
587
588 を呼び出す関数を,call_inirtn という名前で生成する.初期化ルーチンを呼
589 び出す順序は,システムコンフィギュレーションファイル中での静的APIの順
590 序に一致させる.
591
592 例えば,
593
594 ATT_INI({ TA_HLNG, 0, timer_initialize });
595 ATT_INI({ TA_HLNG, (INT) CONSOLE_PORTID, serial_initialize });
596
597 という二つの静的APIがこの順序で記述された時に生成する関数は次の通りで
598 ある.
599
600 void
601 call_inirtn()
602 {
603         timer_initialize((VP_INT)(0));
604         serial_initialize((VP_INT)((INT) CONSOLE_PORTID));
605 }
606
607 (8-1) エラー条件
608
609 初期化ルーチンに関するエラー条件は次の通りである.
610
611 ・iniatr が 0 でない場合(E_RSATR)
612
613 ※ この他に,inirtn がプログラムの開始番地として正しいない場合にもエラー
614 とすべきだが,エラー条件がターゲットに依存してしまうため,今後の課題と
615 する.
616
617 以上
618
619