source: asp_ewarm/asp-1.7.0/doc/configurator.txt@ 61

Last change on this file since 61 was 61, checked in by ertl-honda, 11 years ago

ASP for EWARM のコミット.

File size: 35.5 KB
Line 
1
2 TOPPERS/ASPカーネル
3 コンフィギュレータ仕様
4
5 対応バージョン: Release 1.7.0
6 最終更新: 2010年11月20日
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 1960 2010-11-20 02:20:40Z 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
74ASPカーネルのコンフィギュレータは,システムコンフィギュレーションファイ
75ルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初期
76化ヘッダファイル(kernel_cfg.h)を生成する.また,コンフィギュレータの
77処理の途中に,必要な中間ファイルを生成する.
78
79
80○静的API一覧
81
82ASPカーネルのコンフィギュレータが処理する静的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,
126INIRTN,TERRTN,STK_T *,MPF_T *)およびintptr_t型のパラメータは一般定
127数式パラメータとする.その他のパラメータは,整数定数式パラメータとする.
128
129
130○カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
131
132カーネル構成・初期化ヘッダファイル(kernel_cfg.h)には,次の定義を生成
133する.
134
135(1) 固定生成部分
136
137kernel_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番号を割り付けたオブジェクトの名前を,割り付けた
165ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
166例えば,次のような記述を生成する.
167
168#define TASK1 1
169#define TASK2 2
170#define SEM1 1
171
172○カーネル構成・初期化ファイル(kernel_cfg.c)
173
174(1) 固定生成部分
175
176kernel_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
201kernel_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
219const ID TASK1_id = 1;
220const ID TASK2_id = 2;
221const ID SEM1_id = 1;
222
223(4) 各カーネルオブジェクトに関する定義
224
225システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
226API「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
252const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
253
254(b) オブジェクトに必要なメモリ領域の定義
255
256オブジェクトによっては,オブジェクトに必要なメモリ領域の定義を生成する.
257具体的には,オブジェクト毎の項で説明する.
258
259(c) オブジェクトの初期化ブロックの定義
260
261オブジェクトの初期化ブロックの定義を生成する.具体的には,オブジェクト
262の省略記号を「XXX/xxx」とすると,次のような行を生成する.
263
264const 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
279XXXCB _kernel_xxxcb_table[TNUM_XXXID];
280
281(4-1) タスクに関する定義
282
283ASPカーネルは,タスクが一つもないケースに対応していないため,タスクに関
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
297CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
298DEF_TEX(tskid, { texatr, texrtn });
299
300(4-1-1) タスクに必要なメモリ領域の定義
301
302タスクに必要なメモリ領域として,タスクのスタック領域がある.stkがNULLの
303場合には,生成するタスク毎に,指定されたサイズのスタック領域を確保する.
304具体的には,上記の静的APIに対して,次の定義を生成する.
305
306*stkがNULLの場合のみ生成
307static 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に対応する
318DEF_TEXがない場合には,texatrをTA_NULL,texrtnをNULLとする.
319
320(4-1-3) タスク生成順序テーブルの定義
321
322タスクに対しては,生成された順序(タスクを生成する静的APIが記述された
323順序)をテーブルに出力する必要がある.これは,タスクの生成された順序で,
324タスクの初期化(より具体的には,タスクの起動)を行う必要があるためであ
325る.
326
327具体的には,次のような行を生成する.
328
329const 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
370CRE_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
397CRE_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
422CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
423
424(4-4-1) データキューに必要なメモリ領域の定義
425
426データキューに必要なメモリ領域として,データキュー管理領域がある.生成
427するデータキュー毎に,必要なサイズのデータキュー管理領域を定義する.具
428体的には,上記の静的APIに対して,次の定義を生成する.
429
430*dtqcntが0でない場合のみ生成
431static DTQMB _kernel_dtqmb_<データキュー名>[dtqcnt];
432
433(4-4-2) データキューの初期化情報
434
435データキュー初期化ブロック中に生成するデータキューの初期化情報は,次の
436形式とする.
437
438 { (dtqatr), (dtqcnt), (_kernel_dtqmb_<データキュー名>) }
439
440ここで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
441NULLを用いる.
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
460CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });
461
462(4-5-1) 優先度データキューに必要なメモリ領域の定義
463
464優先度データキューに必要なメモリ領域として,優先度データキュー管理領域
465がある.生成する優先度データキュー毎に,必要なサイズの優先度データキュー
466管理領域を定義する.具体的には,上記の静的APIに対して,次の定義を生成す
467る.
468
469*pdqcntが0でない場合のみ生成
470static 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
500CRE_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
527CRE_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の場合のみ生成
538static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
539
540*必ず生成
541static 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
578CRE_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
611CRE_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
650CFG_INT(INTNO intno, { intatr, intpri });
651
652(5-1-1) 設定する割込み要求ラインの数
653
654設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
655ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
656には,次のような行を生成する.
657
658#define TNUM_INTNO <設定する割込み要求ラインの数>
659const uint_t _kernel_tnum_intno = TNUM_INTNO;
660
661(5-1-2) 割込み要求ライン初期化ブロックの定義
662
663割込み要求ライン初期化ブロックを生成する.具体的には,次のような行を生
664成する.
665
666const 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
708ATT_ISR({ isratr_1, exinf_1, intno, isr_1, isrpri_1 });
709ATT_ISR({ isratr_2, exinf_2, intno, isr_2, isrpri_2 });
710 ……
711ATT_ISR({ isratr_n, exinf_n, intno, isr_n, isrpri_n });
712
713という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
714isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
715値が同じものの間では,システムコンフィギュレーションファイル中での静的
716APIの順序の通りに並んでいるものとする.
717
718static 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_lock()) { /* 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_lock()) { /* 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
759static 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
780DEF_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
812DEF_INH(inhno, { inhatr, inthdr });
813
814(5-3-1) 定義する割込みハンドラの数
815
816定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
817(#define)を生成する.また,その値を持つ変数の定義を生成する.具体的
818には,次のような行を生成する.
819
820#define TNUM_INHNO <定義する割込みハンドラの数>
821const uint_t _kernel_tnum_inhno = TNUM_INHNO;
822
823(5-3-2) 割込みハンドラの出入口処理
824
825定義する割込みハンドラ毎に,割込みハンドラの出入口処理ルーチンを生成す
826る.具体的には,次のような行を生成する.
827
828INTHDR_ENTRY(inhno, inhno_num, inthdr)
829
830ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
831アセンブリ言語記述に使用するためのものである.
832
833(5-3-3) 割込みハンドラ初期化ブロックの定義
834
835割込みハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
836する.
837
838const 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がない場合には,このチェックを行わない
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がない場合には,このチェックを行わない
874
875*必要に応じてターゲット依存部で検出するもの
876・inthdrがプログラムの開始番地として正しくない場合(E_PAR)
877
878(6) CPU例外に関する定義
879
880CPU例外に関して生成する情報は,ターゲット毎に定めることができる.ターゲッ
881ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情報
882を生成する.ターゲット毎に定める場合には,これらの情報は生成されない.
883
884システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
885静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
886生成する.
887
888以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
889ている時に生成すべき情報について述べる.
890
891DEF_EXC(excno, { excatr, exchdr });
892
893(6-1) 定義するCPU例外ハンドラの数
894
895定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティ
896ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.具体
897的には,次のような行を生成する.
898
899#define TNUM_EXCNO <定義するCPU例外ハンドラの数>
900const uint_t _kernel_tnum_excno = TNUM_EXCNO;
901
902(6-2) CPU例外ハンドラの出入口処理
903
904定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出入口処理ルーチンを生成
905する.具体的には,次のような行を生成する.
906
907EXCHDR_ENTRY(excno, excno_num, exchdr)
908
909ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
910アセンブリ言語記述に使用するためのものである.
911
912(6-3) CPU例外ハンドラ初期化ブロックの定義
913
914CPU例外ハンドラ初期化ブロックを生成する.具体的には,次のような行を生成
915する.
916
917const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {
918 <CPU例外ハンドラ1の初期化情報>,
919 <CPU例外ハンドラ2の初期化情報>,
920 ……
921 <CPU例外ハンドラTNUM_EXCNOの初期化情報>
922};
923
924この中のCPU例外ハンドラの初期化情報は,次の形式とする.
925
926 { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
927
928(6-4) エラー条件
929
930CPU例外ハンドラに関するエラー条件は次の通りである.
931
932*パス2で検出するもの
933・excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
934・excnoがDEF_EXCによって設定済みの場合(E_OBJ)
935・excatrが(TA_NULL)でない場合(E_RSATR)
936 ※ ターゲット依存部でCPU例外ハンドラ属性を追加可(TARGET_EXCATR)
937
938*必要に応じてターゲット依存部で検出するもの
939・exchdrがプログラムの開始番地として正しくない場合(E_PAR)
940
941(7) 非タスクコンテキスト用のスタック領域に関する定義
942
943非タスクコンテキスト用のスタック領域に関する定義は,必ず生成しなければ
944ならない.
945
946(7-1) DEF_ICSがない場合
947
948システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
949いない場合には,次の行を生成する.
950
951#ifdef DEFAULT_ISTK
952
953#define TOPPERS_ISTKSZ DEFAULT_ISTKSZ
954#define TOPPERS_ISTK DEFAULT_ISTK
955
956#else /* DEFAULT_ISTK */
957
958static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
959#define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)
960#define TOPPERS_ISTK _kernel_istack
961
962#endif /* DEFAULT_ISTK */
963
964(7-2) DEF_ICSがある場合
965
966以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
967いる時に生成すべき情報について述べる.
968
969DEF_ICS({ istksz, istk });
970
971istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
972ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情報を生成
973する.具体的には,上記の静的APIに対して,次の行を生成する.
974
975static STK_T _kernel_istack[COUNT_STK_T(istksz)];
976#define TOPPERS_ISTKSZ ROUND_STK_T(istksz)
977#define TOPPERS_ISTK _kernel_istack
978
979istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
980情報を,次の形式で生成する.
981
982#define TOPPERS_ISTKSZ (istksz)
983#define TOPPERS_ISTK (istk)
984
985(7-3) 変数の生成
986
987DEF_ICSの有無によらず,次の定義を生成する.
988
989const SIZE _kernel_istksz = TOPPERS_ISTKSZ;
990STK_T *const _kernel_istk = TOPPERS_ISTK;
991
992#ifdef TOPPERS_ISTKPT
993STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
994#endif /* TOPPERS_ISTKPT */
995
996(7-4) エラー条件
997
998非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
999
1000*パス2で検出するもの
1001・静的API「DEF_ICS」が複数ある(E_OBJ)
1002・istkszがスタック領域のサイズとして正しくない場合(E_PAR)
1003 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
1004 ※ このエラーチェックは,istkがNULLでない場合にのみ行う
1005
1006*パス3で検出するもの
1007・istkがスタック領域の先頭番地として正しくない場合(E_PAR)
1008 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
1009 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
1010
1011*必要に応じてターゲット依存部で検出するもの
1012・istkszが小さすぎる場合(E_PAR)
1013
1014(8) タイムイベント管理に関する定義
1015
1016タイムイベント管理に関連して,次の定義を生成する.
1017
1018TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
1019
1020(9) 各モジュールの初期化関数の定義
1021
1022各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
1023初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
1024の2つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
1025
1026 _kernel_initialize_interrupt
1027 _kernel_initialize_exception
1028
1029すべての機能を使った場合に生成される関数は次の通りである.
1030
1031void
1032_kernel_initialize_object(void)
1033{
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();
1045}
1046
1047
1048(10) 初期化ルーチンの実行関数の定義
1049
1050システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
1051する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
1052数を生成する.具体的には,
1053
1054ATT_INI({ iniatr, exinf, inirtn });
1055
1056という静的APIに対して,
1057
1058 (inirtn)((intptr_t)(exinf));
1059
1060を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
1061ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1062APIの順序に一致させる.
1063
1064例えば,
1065
1066ATT_INI({ TA_NULL, 0, timer_initialize });
1067ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
1068
1069という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1070る.
1071
1072void
1073_kernel_call_inirtn(void)
1074{
1075 (timer_initialize)((intptr_t)(0));
1076 (serial_initialize)((intptr_t)(CONSOLE_PORTID));
1077}
1078
1079(10-1) エラー条件
1080
1081初期化ルーチンに関するエラー条件は次の通りである.
1082
1083*パス2で検出するもの
1084・iniatrが(TA_NULL)でない場合(E_RSATR)
1085
1086*必要に応じてターゲット依存部で検出するもの
1087・inirtnがプログラムの開始番地として正しくない場合(E_PAR)
1088
1089(11) 終了処理ルーチンの実行関数の定義
1090
1091システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
1092加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
1093す関数を生成する.具体的には,
1094
1095ATT_TER({ teratr, exinf, terrtn });
1096
1097という静的APIに対して,
1098
1099 (terrtn)((intptr_t)(exinf));
1100
1101を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
1102チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1103APIの逆順に一致させる.
1104
1105例えば,
1106
1107ATT_TER({ TA_NULL, 0, timer_terminate });
1108ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
1109
1110という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1111る.
1112
1113void
1114_kernel_call_terrtn(void)
1115{
1116 (serial_terminate)((intptr_t)(CONSOLE_PORTID));
1117 (timer_terminate)((intptr_t)(0));
1118}
1119
1120(11-1) エラー条件
1121
1122終了処理ルーチンに関するエラー条件は次の通りである.
1123
1124*パス2で検出するもの
1125・teratrが(TA_NULL)でない場合(E_RSATR)
1126
1127*必要に応じてターゲット依存部で検出するもの
1128・terrtnがプログラムの開始番地として正しくない場合(E_PAR)
1129
1130以上
Note: See TracBrowser for help on using the repository browser.