source: rubycfg_asp/trunk/asp_dcre/doc/configurator.txt@ 315

Last change on this file since 315 was 315, checked in by coas-nagasima, 7 years ago

SVNプロパティを設定

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