source: asp3_wo_tecs/trunk/doc/configurator.txt@ 302

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 65.0 KB
Line 
1
2 TOPPERS/ASP3カーネル
3 コンフィギュレータ仕様
4
5 対応バージョン: Release 3.0.0
6 最終更新: 2015年8月8日
7
8このドキュメントは,TOPPERS/ASP3カーネルのコンフィギュレータが標準的に
9生成すべきファイルの内
10容について解説したものである.ターゲット依存に生
11成する内
12容については,このドキュメントの範囲外である.
13
14----------------------------------------------------------------------
15 TOPPERS/ASP Kernel
16 Toyohashi Open Platform for Embedded Real-Time Systems/
17 Advanced Standard Profile Kernel
18
19 Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
20 Graduate School of Information Science, Nagoya Univ., JAPAN
21
22 上記著作権者
23は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
24 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
25 変・再é…
26å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
27 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
28 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
29 スコード中に含まれていること.
30 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
31 用できる形で再é…
32å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
34 者
35マニュアルなど)に,上記の著作権表示,この利用条件および下記
36 の無保証規定を掲載すること.
37 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
38 用できない形で再é…
39å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
40 と.
41 (a) 再é…
42å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
43マニュアルなど)に,上記の著
44 作権表示,この利用条件および下記の無保証規定を掲載すること.
45 (b) 再é…
46å¸ƒã®å½¢æ…
47‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
48 報告すること.
49 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
50 害からも,上記著作権者
51およびTOPPERSプロジェクトをå…
52è²¬ã™ã‚‹ã“と.
53 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
54 由に基づく請求からも,上記著作権者
55およびTOPPERSプロジェクトを
56 å…
57è²¬ã™ã‚‹ã“と.
58
59 本ソフトウェアは,無保証で提供されているものである.上記著作権者
60お
61 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
62 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
63 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
64 の責任を負わない.
65
66 $Id: configurator.txt 431 2015-08-08 12:05:02Z ertl-hiro $
67----------------------------------------------------------------------
68
69○目次
70
711.生成するファイルの種類
722.静的API一覧
733.カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
74 3.1 固定生成部分
75 3.2 オブジェクト数の定義
76 3.3 オブジェクトのID番号の定義
774.カーネル構成・初期化ファイル(kernel_cfg.c)
78 4.1 固定生成部分
79 4.2 カーネルの種類のチェック
80 4.3 インクルードディレクティブ(#include)の処理
81 4.4 オブジェクトのID番号を保持する変数の定義
82 4.5 各カーネルオブジェクトに関する定義
83 4.5.1 カーネルオブジェクトに関する定義の標準構成
84 4.5.2 タスクに関する定義
85 4.5.3 セマフォに関する定義
86 4.5.4 イベントフラグに関する定義
87 4.5.5 データキューに関する定義
88 4.5.6 優å…
89ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹å®šç¾©
90 4.5.7 ミューテックスに関する定義
91 4.5.8 固定長メモリプールに関する定義
92 4.5.9 周期通知に関する定義
93 4.5.10 アラーム通知に関する定義
94 4.6 通知ハンドラの生成
95 4.7 割込みに関する定義
96 4.7.1 割込みサービスルーチンに関する定義
97 4.7.2 割込みハンドラに関する定義
98 4.7.3 割込み要求ラインに関する定義
99 4.8 CPU例外に関する定義
100 4.9 非タスクコンテキスト用のスタック領域に関する定義
101 4.10 タイムイベント管理に関する定義
102 4.11 各モジュールの初期化関数の定義
103 4.12 初期化ルーチンの実行関数の定義
104 4.13 終了処理ルーチンの実行関数の定義
105
106
1071.生成するファイルの種類
108
109ASP3カーネルのコンフィギュレータは,システムコンフィギュレーションファ
110イルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初
111期化ヘッダファイル(kernel_cfg.h)を生成する.コンフィギュレータの処理
112の途中に,この他にいくつかの中間ファイルを生成する.
113
114
1152.静的API一覧
116
117ASP3カーネルのコンフィギュレータが処理する静的APIは次の通り.
118
119(1) タスク管理機能
120 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
121 PRI itskpri, SIZE stksz, STK_T *stk })
122
123(2) 同期・通信機能
124 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
125 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
126 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
127 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
128 CRE_MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })
129
130※ dtqmb,pdqmbがNULLでない場合はサポートしない.
131
132(3) メモリプール管理機能
133 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
134 MPF_T *mpf, void *mpfmb })
135
136※ mpfmbがNULLでない場合はサポートしない.
137
138(4) 時間管理機能
139 CRE_CYC(ID cycid, { ATR cycatr, <通知方法の指定>,
140 RELTIM cyctim, RELTIM cycphs })
141 CRE_ALM(ID almid, { ATR almatr, <通知方法の指定> })
142
143(5) 割込み管理機能
144 CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
145 CRE_ISR(ID isrid, { ATR isratr, intptr_t exinf,
146 INTNO intno, ISR isr, PRI isrpri })
147 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
148
149(6) CPU例外管理機能
150 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
151
152(7) システム構成管理機能
153 DEF_ICS({ SIZE istksz, STK_T *istk })
154 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
155 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
156
157
1583.カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
159
160この章では,カーネル構成・初期化ヘッダファイル(kernel_cfg.h)に生成す
161べき定義について説明する.なお,生成位置が明示されているものを除いては,
162定義の生成順序は以下の順でなくてもよい.
163
1643.1 固定生成部分
165
166kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.å…
167·
168体的には,ファイルのå…
169ˆé ­ã«æ¬¡ã®è¡Œã‚’生成する.
170
171#ifndef TOPPERS_KERNEL_CFG_H
172#define TOPPERS_KERNEL_CFG_H
173
174また,ファイルの末尾に次の行を生成する.
175
176#endif /* TOPPERS_KERNEL_CFG_H */
177
1783.2 オブジェクト数の定義
179
180カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ
181レクティブ(#define)を生成する.å…
182·ä½“的には,次のような記述を生成する.
183
184#define TNUM_TSKID <タスクの数>
185#define TNUM_SEMID <セマフォの数>
186#define TNUM_FLGID <イベントフラグの数>
187#define TNUM_DTQID <データキューの数>
188#define TNUM_PDQID <優å…
189ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ•°>
190#define TNUM_MTXID <ミューテックスの数>
191#define TNUM_MPFID <固定長メモリプールの数>
192#define TNUM_CYCID <周期ハンドラの数>
193#define TNUM_ALMID <アラームハンドラの数>
194#define TNUM_ISRID <割込みサービスルーチンの数>
195
1963.3 オブジェクトのID番号の定義
197
198コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた
199ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
200例えば,次のような記述を生成する.
201
202#define TASK1 1
203#define TASK2 2
204#define SEM1 1
205
206
2074.カーネル構成・初期化ファイル(kernel_cfg.c)
208
209この章では,カーネル構成・初期化ファイル(kernel_cfg.c)に生成すべき定
210義について説明する.なお,生成位置が明示されているものを除いては,定義
211の生成順序は以下の順でなくてもよい.
212
2134.1 固定生成部分
214
215kernel_cfg.c用のヘッダファイルと,カーネル構成・初期化ヘッダファイルを
216インクルードするプリプロセッサディレクティブ(#include)を生成する.å…
217·
218体的には,次の行を生成する.
219
220#include "kernel/kernel_int.h"
221#include "kernel_cfg.h"
222
2234.2 カーネルの種類のチェック
224
225kernel_cfg.cとカーネルの種類が一致しているかをチェックするために,次の
226行を生成する.
227
228#if !(TKERNEL_PRID == 0x0007U && (TKERNEL_PRVER & 0xf000U) == 0x3000U)
229#error The kernel does not match this configuration file.
230#endif
231
2324.3 インクルードディレクティブ(#include)の処理
233
234システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ
235ンクルードディレクティブ(#include)と同一のディレクティブ(#include)
236を生成する.例えば,
237
238#include "sample1.h"
239
240というインクルードディレクティブに対して,
241
242#include "sample1.h"
243
244というディレクティブを生成する.生成するディレクティブの順序は,システ
245ムコンフィギュレーションファイル中でのインクルードディレクティブの記述
246順序に一致させる.
247
2484.4 オブジェクトのID番号を保持する変数の定義
249
250コンフィギュレータに対するオプション指定(--external-id)により,コンフィ
251ギュレータがID番号を割り付けたオブジェクトの名前の末尾に"_id"を付加した
252名前の変数を生成する.変数は,const属性を付加したID型の変数とし,割り付
253けたID番号を値とする.例えば,次のような記述を生成する.
254
255const ID TASK1_id = 1;
256const ID TASK2_id = 2;
257const ID SEM1_id = 1;
258
2594.5 各カーネルオブジェクトに関する定義
260
2614.5.1 カーネルオブジェクトに関する定義の標準構成
262
263システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
264API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
265成のための定義を生成する.
266
267コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各
268オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
269重複がなく,ID番号が1から連続するように割り付ける.
270
271コンフィギュレータに対するオプション指定(--id-input-file)により,コン
272フィギュレータがオブジェクトに割り付けるID番号を指定することができる.
273同じ種類の異なるオブジェクトに対して同じID番号を指定したり,コンフィギュ
274レータがID番号をできる限り連続するように割り付けたとしてもID番号が連続
275しない場合には(ASP3カーネルは,オブジェクトのID番号が連続していること
276を仮定して実装
277してある),コンフィギュレータはエラーを報告する.
278
279また,コンフィギュレータに対するオプション指定(--id-output-file)によ
280り,コンフィギュレータがID番号を割り付けたオブジェクトの名前と割り付け
281たID番号の組を,オプションで指定したファイルに出力する.
282
283各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
284ブジェクトによって例外がある場合には,オブジェクト毎の項
285で説明する.
286
287(a) オブジェクトIDの最大値の変数の定義
288
289オブジェクトIDの最大値を保持する変数の定義を生成する.å…
290·ä½“的には,オブ
291ジェクトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
292
293const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
294
295(b) オブジェクトに必
296要なメモリ領域の定義
297
298オブジェクトによっては,オブジェクトに必
299要なメモリ領域の定義を生成する.
300å…
301·ä½“的には,オブジェクト毎の項
302で説明する.
303
304(c) オブジェクトの初期化ブロックの定義
305
306オブジェクトの初期化ブロックの定義を生成する.å…
307·ä½“的には,オブジェクト
308の省略記号を「XXX/xxx」とすると,次のような行を生成する.
309
310const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
311 <オブジェクトIDが1のオブジェクトの初期化情
312å ±>,
313 <オブジェクトIDが2のオブジェクトの初期化情
314å ±>,
315 ……
316 <オブジェクトIDがTNUM_XXXIDのオブジェクトの初期化情
317å ±>
318};
319
320オブジェクトの初期化情
321報の形式は,オブジェクト毎に異なる.å…
322·ä½“的には,
323オブジェクト毎の項
324で説明する.
325
326オブジェクトが1つも生成されなかった場合には,次のような行を生成する.
327
328 TOPPERS_EMPTY_LABEL(const XXXINIB, _kernel_xxxinib_table);
329
330(d) オブジェクトのコントロールブロックの定義
331
332オブジェクトのコントロールブロックの定義を生成する.å…
333·ä½“的には,オブジェ
334クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
335
336XXXCB _kernel_xxxcb_table[TNUM_XXXID];
337
338オブジェクトが1つも生成されなかった場合には,次のような行を生成する.
339
340 TOPPERS_EMPTY_LABEL(XXXCB, _kernel_xxxcb_table);$NL$
341
3424.5.2 タスクに関する定義
343
344ASP3カーネルは,タスクが1つもないケースに対応していない.タスクを生成す
345る静的APIが1つもなかった場合,コンフィギュレータはエラーを報告する.
346
347タスクの省略記号は「TSK/tsk」である.ただし,タスク初期化ブロックのデー
348タ型はTINIB,その変数名は_kernel_tinib_table,タスクコントロールブロッ
349クのデータ型はTCB,その変数名は_kernel_tcb_table である(いずれも「TSK/
350tsk」に代えて「T/t」を用いている).
351
352以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
353ている時に生成すべき情
354報について述べる.
355
356 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
357
3584.5.2.1 タスクに必
359要なメモリ領域の定義
360
361タスクに必
362要なメモリ領域として,タスクのスタック領域がある.stkがNULLの
363場合には,生成するタスク毎に,指定されたサイズのスタック領域を確保する.
364å…
365·ä½“的には,上記の静的APIに対して,次の定義を生成する.
366
367*stkがNULLの場合のみ生成
368static STK_T _kernel_stack_<タスク名>[COUNT_STK_T(stksz)];
369
370ただし,この方法でスタック領域が確保できないターゲットにおいては,ター
371ゲット依存の方法でスタック領域を確保する.
372
3734.5.2.2 タスクの初期化情
374å ±
375
376タスク初期化ブロック中に生成するタスクの初期化情
377報は,次の形式とする.
378
379*stkがNULLでない場合
380 { (tskatr), (intptr_t)(exinf), (TASK)(task), INT_PRIORITY(itskpri),
381 (stksz), (void *)(stk) }
382
383*stkがNULLの場合
384 { (tskatr), (intptr_t)(exinf), (TASK)(task), INT_PRIORITY(itskpri),
385 ROUND_STK_T(stksz), _kernel_stack_<タスク名> }
386
3874.5.2.3 タスク生成順序テーブルの定義
388
389タスクの生成された順序で,タスクの初期化(よりå…
390·ä½“的には,タスクの起動)
391を行う必
392要があることからに,タスクが生成された順序(タスクを生成する静
393的APIが記述された順序)をテーブルに出力する.
394
395å…
396·ä½“的には,次のような行を生成する.
397
398const ID _kernel_torder_table[TNUM_TSKID] = {
399 <最初に生成されたタスクのタスクID>,
400 <2番目に生成されたタスクのタスクID>,
401 ……
402 <最後に生成されたタスクのタスクID>
403};
404
405(6-1-4) エラー条件
406
407タスクに関するエラー条件は次の通りである.
408
409*コンフィギュレータ本体が検出するもの
410・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ)[NGKI1040]
411
412*パス2で検出するもの
413・タスクが1つも登録されていない場合[NGKI0033]
414・tskatrが無効の場合(E_RSATR)[NGKI1028]
415 (TA_ACT,TA_NOACTQUE,TARGET_TSKATR以外のビットがセットされている場合)
416 ※ TAGET_TSKATRは,ターゲット依存部で追加するタスク属性
417・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)[NGKI1034]
418・stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さ
419 い場合(E_PAR)[NGKI1042]
420・stkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI1056]
421 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
422 ※ このエラーチェックは,stkがNULLでない場合にのみ行う
423
424*パス3で検出するもの
425・taskがプログラムの開始番地として正しくない場合(E_PAR)[NGKI1033]
426 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
427 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
428・stkがスタック領域のå…
429ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)[NGKI1056ï¼½
430 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
431 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
432
4334.5.3 セマフォに関する定義
434
435セマフォの省略記号は「SEM/sem」である.以下では,システムコンフィギュレー
436ションファイルに次の静的APIが含まれている時に生成すべき情
437報について述べ
438る.なお,セマフォに必
439要なメモリ領域はない.
440
441 CRE_SEM(semid, { sematr, isemcnt, maxsem });
442
4434.5.3.1 セマフォの初期化情
444å ±
445
446セマフォ初期化ブロック中に生成するセマフォの初期化情
447報は,次の形式とす
448る.
449
450 { (sematr), (isemcnt), (maxsem) }
451
4524.5.3.2 エラー条件
453
454セマフォに関するエラー条件は次の通りである.
455
456*コンフィギュレータ本体が検出するもの
457・同じsemidに対するCRE_SEMが複数ある場合(E_OBJ)[NGKI1463]
458
459*パス2で検出するもの
460・sematrが無効の場合(E_RSATR)[NGKI1456]
461 (TA_TPRI以外のビットがセットされている場合)
462・(1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)[NGKI1468]
463・(0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)[NGKI1466]
464
4654.5.4 イベントフラグに関する定義
466
467イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ
468ギュレーションファイルに次の静的APIが含まれている時に生成すべき情
469報につ
470いて述べる.なお,イベントフラグに必
471要なメモリ領域はない.
472
473 CRE_FLG(flgid, { flgatr, iflgptn });
474
4754.5.4.1 イベントフラグの初期化情
476å ±
477
478イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情
479報は,
480次の形式とする.
481
482 { (flgatr), (iflgptn) }
483
4844.5.4.2 エラー条件
485
486イベントフラグに関するエラー条件は次の通りである.
487
488*コンフィギュレータ本体が検出するもの
489・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ)[NGKI1569]
490
491*パス1で検出するもの
492・iflgptnがFLGPTNに格納できない場合(E_PAR)
493 → iflgptnがuint32_tに格納できない場合は,cfg1_out.cのコンパイル時
494 にエラーとなる.
495
496*パス2で検出するもの
497・flgatrが無効の場合(E_RSATR)[NGKI1562]
498 (TA_TPRI,TA_WMUL,TA_CLR以外のビットがセットされている場合)
499・iflgptnがFLGPTNに格納できない場合(E_PAR)[NGKI3275]
500 → iflgptnがuint32_tには格納できるが,FLGPTNに格納できない場合は,
501 パス2でエラーを検出する.
502
5034.5.5 データキューに関する定義
504
505データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ
506レーションファイルに次の静的APIが含まれている時に生成すべき情
507報について
508述べる.
509
510 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
511
5124.5.5.1 データキューに必
513要なメモリ領域の定義
514
515データキューに必
516要なメモリ領域として,データキュー管理領域がある.生成
517するデータキュー毎に,必
518要なサイズのデータキュー管理領域を定義する.å…
519·
520体的には,上記の静的APIに対して,次の定義を生成する.
521
522*dtqcntが0でない場合のみ生成
523static DTQMB _kernel_dtqmb_<データキュー名>[dtqcnt];
524
5254.5.5.2 データキューの初期化情
526å ±
527
528データキュー初期化ブロック中に生成するデータキューの初期化情
529報は,次の
530形式とする.
531
532 { (dtqatr), (dtqcnt), _kernel_dtqmb_<データキュー名> }
533
534ここで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
535NULLを用いる.
536
5374.5.5.3 エラー条件
538
539データキューに関するエラー条件は次の通りである.
540
541*コンフィギュレータ本体が検出するもの
542・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ)[NGKI1677]
543
544*パス2で検出するもの
545・dtqatrが無効の場合(E_RSATR)[NGKI1669]
546 (TA_TPRI以外のビットがセットされている場合)
547・dtqcntが負の値の場合(E_PAR)[NGKI3288]
548・dtqmbがNULLでない場合(E_NOSPT)[ASPS0132]
549
5504.5.6 優å…
551ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹å®šç¾©
552
553優å…
554ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çœç•¥è¨˜å·ã¯ã€ŒPDQ/pdq」である.以下では,システムコ
555ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
556
557報について述べる.
558
559 CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });
560
5614.5.6.1 優å…
562ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿…
563要なメモリ領域の定義
564
565優å…
566ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿…
567要なメモリ領域として,優å…
568ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸ
569がある.生成する優å…
570ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ¯Žã«ï¼Œå¿…
571要なサイズの優å…
572ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼
573管理領域を定義する.å…
574·ä½“的には,上記の静的APIに対して,次の定義を生成す
575る.
576
577*pdqcntが0でない場合のみ生成
578static PDQMB _kernel_pdqmb_<優å…
579ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>[pdqcnt];
580
5814.5.6.2 優å…
582ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®åˆæœŸåŒ–情
583å ±
584
585優å…
586ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼åˆæœŸåŒ–ブロック中に生成する優å…
587ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®åˆæœŸåŒ–
588情
589報は,次の形式とする.
590
591 { (pdqatr), (pdqcnt), (maxdpri), _kernel_pdqmb_<優å…
592ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å> }
593
594ここで,pdqcntが0の場合には,_kernel_pdqmb_<優å…
595ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>に代え
596て,NULLを用いる.
597
5984.5.6.3 エラー条件
599
600優å…
601ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
602
603*コンフィギュレータ本体が検出するもの
604・同じpdqidに対するCRE_PDQが複数ある場合(E_OBJ)[NGKI1812]
605
606*パス2で検出するもの
607・pdqatrが無効の場合(E_RSATR)[NGKI1804]
608 (TA_TPRI以外のビットがセットされている場合)
609・pdqcntが負の値の場合(E_PAR)[NGKI3289]
610・(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)[NGKI1819]
611・pdqmbがNULLでない場合(E_NOSPT)[ASPS0142]
612
6134.5.7 ミューテックスに関する定義
614
615ミューテックスの省略記号は「MTX/mtx」である.以下では,システムコンフィ
616ギュレーションファイルに次の静的APIが含まれている時に生成すべき情
617報につ
618いて述べる.なお,ミューテックスに必
619要なメモリ領域はない.
620
621 CRE_MTX(mtxid, { mtxatr, maxmpri, mprihd });
622
6234.5.7.1 ミューテックスの初期化情
624å ±
625
626ミューテックス初期化ブロック中に生成するミューテックスの初期化情
627報は,
628次の形式とする.
629
630 { (mtxatr), (maxmpri) }
631
6324.5.7.2 エラー条件
633
634ミューテックスに関するエラー条件は次の通りである.
635
636*コンフィギュレータ本体が検出するもの
637・同じmtxidに対するCRE_MTXが複数ある場合(E_OBJ)[NGKI2032]
638
639*パス2で検出するもの
640・mtxatrが無効の場合(E_RSATR)[NGKI2025]
641 (TA_NULL,TA_TPRI,TA_CEILINGのいずれでもない場合)
642・優å…
643ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã§ï¼Œ(TMIN_MPRI <= maxmpri && maxmpri <=
644 TMAX_MPRI)でない場合(E_PAR)[NGKI2037]
645
6464.5.8 固定長メモリプールに関する定義
647
648固定長メモリプールの省略記号は「MPF/mpf」である.以下では,システムコ
649ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
650
651報について述べる.
652
653 CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf, mpfmb });
654
6554.5.8.1 固定長メモリプールに必
656要なメモリ領域の定義
657
658固定長メモリプールに必
659要なメモリ領域として,固定長メモリプール領域と固
660定長メモリプール管理領域がある.生成する固定長メモリプール毎に,必
661要な
662サイズの固定長メモリプール領域(mpfがNULLの場合のみ)と固定長メモリプー
663ル管理領域を確保する.å…
664·ä½“的には,上記の静的APIに対して,次の定義を生成
665する.
666
667*mpfがNULLの場合のみ生成
668static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
669
670*必
671ず生成
672static MPFMB _kernel_mpfmb_<固定長メモリプール名>[blkcnt];
673
6744.5.8.2 固定長メモリプールの初期化情
675å ±
676
677固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
678情
679報は,次の形式とする.
680
681*mpfがNULLでない場合
682 { (mpfatr), (blkcnt), ROUND_MPF_T(blksz), (void *)(mpf),
683 _kernel_mpfmb_<固定長メモリプール名> }
684
685*mpfがNULLの場合
686 { (mpfatr), (blkcnt), ROUND_MPF_T(blksz),
687 _kernel_mpf_<固定長メモリプール名>,
688 _kernel_mpfmb_<固定長メモリプール名> }
689
6904.5.8.3 エラー条件
691
692固定長メモリプールに関するエラー条件は次の通りである.
693
694*コンフィギュレータ本体が検出するもの
695・同じmpfidに対するCRE_MPFが複数ある場合(E_OBJ)[NGKI2236]
696
697*パス2で検出するもの
698・mpfatrが無効の場合(E_RSATR)[NGKI2225]
699 (TA_TPRI以外のビットがセットされている場合)
700・blkcntが0以下の場合(E_PAR)[NGKI2229]
701・blkszが0以下の場合(E_PAR)[NGKI2230]
702・mpfmbがNULLでない場合(E_NOSPT)[ASPS0166]
703
704*パス3で検出するもの
705・mpfが固定長メモリプール領域のå…
706ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)
707 [NGKI2249]
708 - ターゲット依存の値(CHECK_MPF_ALIGN)の倍数でない場合
709 - NULLの場合(ターゲット依存,CHECK_MPF_NONNULL)
710
7114.5.9 周期通知に関する定義
712
713周期通知の省略記号は「CYC/cyc」である.以下では,システムコンフィギュ
714レーションファイルに次の静的APIが含まれている時に生成すべき情
715報について
716述べる.なお,周期通知に必
717要なメモリ領域はない.
718
719 CRE_CYC(cycid, { cycatr, <通知方法の指定>, cyctim, cycphs });
720
7214.5.9.1 通知ハンドラの生成
722
723静的API中の<通知方法の指定>に従って,通知ハンドラを生成する.以下では,
724生成した通知ハンドラの関数名をnfyhdr,拡張情
725報をexinfと記述する.
726
727ただし,<通知方法の指定>の最初のパラメータである通知処理モード
728(nfymode)がTNFY_HANDLER(タイムイベントハンドラの呼出しによる通知)で
729ある場合には,続く2つのパラメータ(タイムイベントハンドラの拡張情
730報とå…
731ˆ
732頭番地)の指定に従ってタイムイベントハンドラを呼び出すものとし,通知ハ
733ンドラは生成しない.この場合,nfyhdrとexinfは,次の通りとする.
734
735 nfyhdr (NFYHDR)(<タイムイベントハンドラのå…
736ˆé ­ç•ªåœ°ï¼ž)
737 exinf <タイムイベントハンドラの拡張情
738報>
739
740なお,通知ハンドラの生成方法については,「4.6 通知ハンドラの生成」の節
741を参ç…
742§ã™ã‚‹ã“と.
743
7444.5.9.2 周期通知の初期化情
745å ±
746
747周期通知初期化ブロック中に生成する周期通知の初期化情
748報は,次の形式とす
749る.
750
751 { (cycatr), (intptr_t)(exinf), nfyhdr, (cyctim), (cycphs) }
752
7534.5.9.3 エラー条件
754
755周期通知に関するエラー条件は次の通りである.
756
757*コンフィギュレータ本体が検出するもの
758・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ)[NGKI2392]
759
760*パス2で検出するもの
761・cycatrが無効の場合(E_RSATR)[NGKI2383]
762 (TA_STA以外のビットがセットされている場合)
763・(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)[NGKI2397]
764・(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)[NGKI2399]
765・その他,通知ハンドラの生成に関するエラー(4.6.13節)を参ç…
766§
767
768*パス3で検出するもの
769・通知方法中のタイムイベントハンドラのå…
770ˆé ­ç•ªåœ°ã¾ãŸã¯å¤‰æ•°ã®ç•ªåœ°ãŒæ­£ã—く
771 ない(E_PAR)[NGKI3693]
772 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
773 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
774・その他,通知ハンドラの生成に関するエラー(4.6.13節)を参ç…
775§
776
7774.5.10 アラーム通知に関する定義
778
779アラーム通知の省略記号は「ALM/alm」である.以下では,システムコンフィ
780ギュレーションファイルに次の静的APIが含まれている時に生成すべき情
781報につ
782いて述べる.なお,アラーム通知に必
783要なメモリ領域はない.
784
785 CRE_ALM(ID almid, { almatr, <通知方法の指定> });
786
7874.5.10.1 通知ハンドラの生成
788
789静的API中の<通知方法の指定>に従って,通知ハンドラを生成する.以下では,
790生成した通知ハンドラの関数名をnfyhdr,拡張情
791報をexinfと記述する.
792
793ただし,<通知方法の指定>の最初のパラメータである通知処理モード
794(nfymode)がTNFY_HANDLER(タイムイベントハンドラの呼出しによる通知)で
795ある場合には,続く2つのパラメータ(タイムイベントハンドラの拡張情
796報とå…
797ˆ
798頭番地)の指定に従ってタイムイベントハンドラを呼び出すものとし,通知ハ
799ンドラは生成しない.この場合,nfyhdrとexinfは,次の通りとする.
800
801 nfyhdr (NFYHDR)(<タイムイベントハンドラのå…
802ˆé ­ç•ªåœ°ï¼ž)
803 exinf <タイムイベントハンドラの拡張情
804報>
805
806なお,通知ハンドラの生成方法については,「4.6 通知ハンドラの生成」の節
807を参ç…
808§ã™ã‚‹ã“と.
809
8104.5.10.2 アラーム通知の初期化情
811å ±
812
813アラーム通知初期化ブロック中に生成するアラーム通知の初期化情
814報は,次の
815形式とする.
816
817 { (almatr), (intptr_t)(exinf), nfyhdr }
818
8194.5.10.3 エラー条件
820
821アラーム通知に関するエラー条件は次の通りである.
822
823*コンフィギュレータ本体が検出するもの
824・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ)[NGKI2500]
825
826*パス2で検出するもの
827・almatrが無効の場合(E_RSATR)[NGKI2491]
828 (TA_STA以外のビットがセットされている場合)
829・その他,通知ハンドラの生成に関するエラー(4.6.13節)を参ç…
830§
831
832*パス3で検出するもの
833・通知方法中のタイムイベントハンドラのå…
834ˆé ­ç•ªåœ°ã¾ãŸã¯å¤‰æ•°ã®ç•ªåœ°ãŒæ­£ã—く
835 ない(E_PAR)[NGKI3693]
836 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
837 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
838・その他,通知ハンドラの生成に関するエラー(4.6.13節)を参ç…
839§
840
8414.6 通知ハンドラの生成
842
843通知ハンドラは,周期通知機能とアラーム通知機能のためのイベントの通知お
844よびイベント通知時に発生したエラーの通知を行うためのハンドラである.通
845知ハンドラは,カーネル実装
846上の概念であり,外部仕様書には登場しない(タ
847イムイベントハンドラと位置付けが類似しているため,混同しないように注意
848すること).
849
850ASP3カーネルでは,コンフィギュレータにより,周期通知毎およびアラーム通
851知毎に通知ハンドラを生成する.ただし,タイムイベントハンドラの呼出しに
852よる通知の場合には,通知ハンドラを生成せず,直接タイムイベントハンドラ
853を呼び出す.
854
855生成する通知ハンドラの枠組みは次の通り.
856
857(a) エラーの通知を行わない場合
858
859static void
860_kernel_nfyhdr_<cycid または almid>(intptr_t exinf)
861{
862 (void) <イベントの通知処理>;
863}
864
865(b) エラーの通知を行う場合
866
867static void
868_kernel_nfyhdr_<cycid または almid>(intptr_t exinf)
869{
870 ER ercd;
871
872 ercd = <イベントの通知処理>;
873 if (ercd != E_OK) {
874 (void) <エラーの通知処理>;
875 }
876}
877
878<イベントの通知処理>と<エラーの通知処理>は,<通知方法の指定>の最
879初のパラメータである通知処理モード(nfymode)により定まる.å…
880·ä½“的には,
881nfymodeの下位4ビット(以下,これをnfymode1と書く)でイベントの通知方法
882を,残りのビット(以下,これをnfymode2と書く)でエラーの通知方法を指定
883する.
884
8854.6.1 変数の設定によるイベント通知
886
887nfymode1がTNFY_SETVER(変数の設定によるイベント通知)の場合には,続く2
888つのパラメータ(変数の番地と設定する値)の指定に従って変数を設定するも
889のとする.コンフィギュレータのパス3でのエラーチェックを可能にするために,
890変数の番地は,exinfとして通知ハンドラに渡す.
891
892å…
893·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
894
895 *((intptr_t *) exinf) = (<設定する値>);
896
897周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
898る.
899
900 nfyhdr _kernel_nfyhdr_<cycid または almid>
901 exinf <変数の番地>
902
903なお,変数の設定によるイベント通知の場合,エラーが検出されることはない
904ため,エラーの通知は意味がない.エラーの通知が指定されていた場合,コン
905フィギュレータはエラーを報告する.
906
9074.6.2 タスクの起動によるイベント通知
908
909nfymode1がTNFY_ACTTSK(タスクの起動によるイベント通知)の場合には,続く
9101つのパラメータ(タスクID)の指定に従ってタスクを起動するものとする.コ
911ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
912exinfとして通知ハンドラに渡す.
913
914å…
915·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
916
917 act_tsk((ID) exinf);
918
919周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
920る.
921
922 nfyhdr _kernel_nfyhdr_<cycid または almid>
923 exinf <タスクID>
924
9254.6.3 タスクの起床によるイベント通知
926
927nfymode1がTNFY_WUPTSK(タスクの起床によるイベント通知)の場合には,続く
9281つのパラメータ(タスクID)の指定に従ってタスクを起床するものとする.コ
929ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
930exinfとして通知ハンドラに渡す.
931
932å…
933·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
934
935 wup_tsk((ID) exinf);
936
937周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
938る.
939
940 nfyhdr _kernel_nfyhdr_<cycid または almid>
941 exinf <タスクID>
942
9434.6.4 セマフォの返却によるイベント通知
944
945nfymode1がTNFY_SIGSEM(セマフォの返却によるイベント通知)の場合には,続
946く1つのパラメータ(セマフォID)の指定に従ってセマフォを返却を起動するも
947のとする.コンフィギュレータのパス3でのエラーチェックを可能にするために,
948セマフォIDは,exinfとして通知ハンドラに渡す.
949
950å…
951·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
952
953 sig_sem((ID) exinf);
954
955周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
956る.
957
958 nfyhdr _kernel_nfyhdr_<cycid または almid>
959 exinf <セマフォID>
960
9614.6.5 イベントフラグのセットによるイベント通知
962
963nfymode1がTNFY_SETFLG(イベントフラグのセットによるイベント通知)の場合
964には,続く2つのパラメータ(イベントフラグIDとセットするビットパターン)
965の指定に従ってイベントフラグをセットするものとする.コンフィギュレータ
966のパス3でのエラーチェックを可能にするために,イベントフラグIDは,exinf
967として通知ハンドラに渡す.
968
969å…
970·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
971
972 set_flg((ID) exinf, <セットするビットパターン>);
973
974周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
975る.
976
977 nfyhdr _kernel_nfyhdr_<cycid または almid>
978 exinf <イベントフラグID>
979
9804.6.6 データキューへの送信によるイベント通知
981
982nfymode1がTNFY_SNDDTQ(データキューへの送信によるイベント通知)の場合に
983は,続く2つのパラメータ(データキューIDと送信する値)の指定に従ってデー
984タキューへ送信するものとする.コンフィギュレータのパス3でのエラーチェッ
985クを可能にするために,データキューIDは,exinfとして通知ハンドラに渡す.
986
987å…
988·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
989
990 snd_dtq((ID) exinf, <送信する値>);
991
992周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
993る.
994
995 nfyhdr _kernel_nfyhdr_<cycid または almid>
996 exinf <データキューID>
997
9984.6.7 変数の設定によるエラー通知
999
1000nfymode2がTENFY_SETVER(変数の設定によるエラー通知)の場合には,続く1つ
1001のパラメータ(変数の番地)の指定に従って,エラーコードを変数に設定する
1002ものとする.コンフィギュレータのパス3でのエラーチェックを可能にするため
1003に,変数の番地は,グローバル変数を通じてて通知ハンドラに渡す.
1004
1005å…
1006·ä½“的には,通知ハンドラの定義にå…
1007ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1008
1009 intptr_t *const _kernel_nfyhdr_<cycid または almid>_p_evar
1010 = (intptr_t *)(<変数の番地>);
1011
1012また,<エラーの通知処理>には,次のコードを生成する.
1013
1014 *((intptr_t *) _kernel_nfyhdr_<cycid または almid>_p_evar)
1015 = (intptr_t) ercd;
1016
10174.6.8 タスクの起動によるエラー通知
1018
1019nfymode2がTENFY_ACTTSK(タスクの起動によるエラー通知)の場合には,続く
10201つのパラメータ(タスクID)の指定に従ってタスクを起動するものとする.コ
1021ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
1022グローバル変数を通じて通知ハンドラに渡す.
1023
1024å…
1025·ä½“的には,通知ハンドラの定義にå…
1026ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1027
1028 const ID _kernel_nfyhdr_<cycid または almid>_etskid
1029 = <タスクID>;
1030
1031また,<エラーの通知処理>には,次のコードを生成する.
1032
1033 act_tsk(_kernel_nfyhdr_<cycid または almid>_etskid);
1034
10354.6.9 タスクの起床によるエラー通知
1036
1037nfymode2がTENFY_WUPTSK(タスクの起床によるエラー通知)の場合には,続く
10381つのパラメータ(タスクID)の指定に従ってタスクを起床するものとする.コ
1039ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
1040グローバル変数を通じて通知ハンドラに渡す.
1041
1042å…
1043·ä½“的には,通知ハンドラの定義にå…
1044ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1045
1046 const ID _kernel_nfyhdr_<cycid または almid>_etskid
1047 = <タスクID>;
1048
1049また,<エラーの通知処理>には,次のコードを生成する.
1050
1051 wup_tsk(_kernel_nfyhdr_<cycid または almid>_ptskid);
1052
10534.6.10 セマフォの返却によるエラー通知
1054
1055nfymode2がTENFY_SIGSEM(セマフォの返却によるエラー通知)の場合には,続
1056く1つのパラメータ(セマフォID)の指定に従ってセマフォを返却するものとす
1057る.コンフィギュレータのパス3でのエラーチェックを可能にするために,セマ
1058フォIDは,グローバル変数を通じて通知ハンドラに渡す.
1059
1060å…
1061·ä½“的には,通知ハンドラの定義にå…
1062ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1063
1064 const ID _kernel_nfyhdr_<cycid または almid>_esemid
1065 = <セマフォID>;
1066
1067また,<エラーの通知処理>には,次のコードを生成する.
1068
1069 sig_sem(_kernel_nfyhdr_<cycid または almid>_esemid);
1070
10714.6.11 イベントフラグのセットによるエラー通知
1072
1073nfymode2がTENFY_SETFIG(イベントフラグのセットによるエラー通知)の場合
1074には,続く2つのパラメータ(イベントフラグIDとセットするビットパターン)
1075の指定に従ってイベントフラグをセットするものとする.コンフィギュレータ
1076のパス3でのエラーチェックを可能にするために,イベントフラグIDは,グロー
1077バル変数を通じて通知ハンドラに渡す.
1078
1079å…
1080·ä½“的には,通知ハンドラの定義にå…
1081ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1082
1083 const ID _kernel_nfyhdr_<cycid または almid>_eflgid
1084 = <イベントフラグID>;
1085
1086また,<エラーの通知処理>には,次のコードを生成する.
1087
1088 set_flg(_kernel_nfyhdr_<cycid または almid>_eflgid,
1089 <セットするビットパターン>);
1090
10914.6.12 データキューへの送信によるエラー通知
1092
1093nfymode2がTENFY_SNDDTQ(データキューへの送信によるエラー通知)の場合に
1094は,続く1つのパラメータ(データキューID)の指定に従って,エラーコードを
1095データキューへ送信するものとする.コンフィギュレータのパス3でのエラー
1096チェックを可能にするために,データキューIDは,グローバル変数を通じて通
1097知ハンドラに渡す.
1098
1099å…
1100·ä½“的には,通知ハンドラの定義にå…
1101ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1102
1103 const ID _kernel_nfyhdr_<cycid または almid>_edtqid
1104 = <データキューID>;
1105
1106また,<エラーの通知処理>には,次のコードを生成する.
1107
1108 snd_dtq(_kernel_nfyhdr_<cycid または almid>_edtqid, (intptr_t) ercd);
1109
11104.6.13 エラー条件
1111
1112通知ハンドラの生成に関するエラー条件は次の通りである.
1113
1114*パス2で検出するもの
1115・nfymodeの値が正しくない(E_PAR)[NGKI3730][NGKI3721]
1116
1117*パス3で検出するもの
1118・通知方法中の変数の番地が正しくない(E_PAR)[NGKI3699][NGKI3701]
1119 - ターゲット依存の値(CHECK_INTPTR_ALIGN)の倍数でない場合
1120 - NULLの場合(ターゲット依存,CHECK_INTPTR_NONNULL)
1121・通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704]
1122・通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707]
1123・通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710]
1124・通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3713]
1125 [NGKI3715]
1126
11274.7 割込みに関する定義
1128
11294.7.1 割込みサービスルーチンに関する定義
1130
11314.7.1.1 トレースログマクロのデフォルト定義
1132
1133生成する割込みハンドラcの中で使用するトレースログマクロのデフォルト定義
1134を生成する.å…
1135·ä½“的には,次の行を生成する.
1136
1137#ifndef LOG_ISR_ENTER
1138#define LOG_ISR_ENTER(isrid)
1139#endif /* LOG_ISR_ENTER */
1140
1141#ifndef LOG_ISR_LEAVE
1142#define LOG_ISR_LEAVE(isrid)
1143#endif /* LOG_ISR_LEAVE */
1144
11454.7.1.2 割込みハンドラの生成
1146
1147システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ
1148ンを追加する静的API「CRE_ISR」に対して,同一の割込み番号に対して追加さ
1149れた割込みサービスルーチンを順に呼び出す関数を生成する.
1150
1151å…
1152·ä½“的には,同一の割込み番号に対して割込みサービスルーチンを追加する
1153
1154 CRE_ISR(ISR_1, { isratr_1, exinf_1, intno, isr_1, isrpri_1 });
1155 CRE_ISR(ISR_2, { isratr_2, exinf_2, intno, isr_2, isrpri_2 });
1156 ……
1157 CRE_ISR(ISR_N, { isratr_n, exinf_n, intno, isr_n, isrpri_n });
1158
1159という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
1160isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
1161値が同じものの間では,システムコンフィギュレーションファイル中での静的
1162APIの順序の通りに並んでいるものとする.
1163
1164static void
1165_kernel_inthdr_<intno>(void)
1166{
1167 LOG_ISR_ENTER(ISR_1); /* ISR_1の呼出し */
1168 ((ISR)(isr_1))((intptr_t)(exinf_1));
1169 LOG_ISR_LEAVE(ISR_1);
1170
1171 if (sense_lock()) { /* ISRの呼出し前の状æ…
1172‹ã«æˆ»ã™ */
1173 unlock_cpu();
1174 }
1175
1176 LOG_ISR_ENTER(ISR_2); /* ISR_2の呼出し */
1177 ((ISR)(isr_2))((intptr_t)(exinf_2));
1178 LOG_ISR_LEAVE(ISR_2);
1179
1180 if (sense_lock()) { /* ISRの呼出し前の状æ…
1181‹ã«æˆ»ã™ */
1182 unlock_cpu();
1183 }
1184
1185 ……
1186
1187 LOG_ISR_ENTER(ISR_N); /* ISR_Nの呼出し */
1188 ((ISR)(isr_n))((intptr_t)(exinf_n));
1189 LOG_ISR_LEAVE(ISR_N);
1190}
1191
1192ここで,ISR_Nの呼出しの後に呼出し前の状æ…
1193‹ã«æˆ»ã•ãªã„のは,割込みハンドラ
1194からのリターンにより,カーネルがå…
1195ƒã®çŠ¶æ…
1196‹ã«æˆ»ã™ãŸã‚ã§ã‚る.
1197
1198同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合
1199には,次のような関数を生成する.
1200
1201static void
1202_kernel_inthdr_<intno>(void)
1203{
1204 LOG_ISR_ENTER(ISR_1);
1205 ((ISR)(isr_1))((intptr_t)(exinf_1));
1206 LOG_ISR_LEAVE(ISR_1);
1207}
1208
12094.7.1.3 割込みハンドラの定義に相当する処理
1210
1211上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ
1212に関する定義において,システムコンフィギュレーションファイル中に次の静
1213的APIが含まれているのと同様に処理する.
1214
1215 DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });
1216
1217ここでinhnoは,intnoに対応する割込みハンドラ番号である.
1218
12194.7.1.4 エラー条件
1220
1221割込みサービスルーチンに関するエラー条件は次の通りである.
1222
1223*コンフィギュレータ本体が検出するもの
1224・同じisridに対するCRE_ISRが複数ある場合(E_OBJ)[NGKI3009]
1225
1226*パス2で検出するもの
1227・isratrが無効の場合(E_RSATR)[NGKI2998]
1228 (TARGET_ISRATR以外のビットがセットされている場合)
1229 ※ TAGET_ISRATRは,ターゲット依存部で追加する割込みサービスルーチン属性
1230・intnoがCRE_ISRに対する割込み番号として正しくない場合(E_PAR)[NGKI3003]
1231 ※ intnoに対応するinhnoがない場合を含む
1232・(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
1233 [NGKI3005]
1234・intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
1235・intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
1236・intnoに対してCFG_INTで設定された割込み優å…
1237ˆåº¦ãŒTMIN_INTPRIよりも小さい
1238 場合(E_OBJ)[NGKI3014]
1239 ※ カーネル管理外の割込みサービスルーチンはサポートしないため
1240
1241*可能であればターゲット依存部で検出するもの[NGKI3020]
1242・isrがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3004]
1243
12444.7.2 割込みハンドラに関する定義
1245
1246割込みハンドラに関して生成する情
1247報は,ターゲット毎に定めることができる.
1248ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない標準
1249的な情
1250報を生成する.
1251
1252割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ(上
1253述の割込みサービスルーチンの追加によりコンフィギュレータが生成した割込
1254みハンドラを含む)に関する定義を生成する.å…
1255·ä½“的には次の通り.
1256
1257以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
1258ている時に生成すべき情
1259報について述べる.
1260
1261 DEF_INH(inhno, { inhatr, inthdr });
1262
12634.7.2.1 定義する割込みハンドラの数
1264
1265定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
1266(#define)を生成する.また,その値を持つ変数の定義を生成する.å…
1267·ä½“çš„
1268には,次のような行を生成する.
1269
1270#define TNUM_DEF_INHNO <定義する割込みハンドラの数>
1271const uint_t _kernel_tnum_def_inhno = TNUM_DEF_INHNO;
1272
12734.7.2.2 割込みハンドラの出å…
1274¥å£å‡¦ç†
1275
1276定義する割込みハンドラ毎に,割込みハンドラの出å…
1277¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成す
1278る.å…
1279·ä½“的には,次のような行を生成する.
1280
1281INTHDR_ENTRY(inhno, inhno_num, inthdr)
1282
1283ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
1284アセンブリ言語記述に使用するためのものである.
1285
12864.7.2.3 割込みハンドラ初期化ブロックの定義
1287
1288割込みハンドラ初期化ブロックを生成する.å…
1289·ä½“的には,次のような行を生成
1290する.
1291
1292const INHINIB _kernel_inhinib_table[TNUM_DEF_INHNO] = {
1293 <割込みハンドラ1の初期化情
1294å ±>,
1295 <割込みハンドラ2の初期化情
1296å ±>,
1297 ……
1298 <割込みハンドラTNUM_DEF_INHNOの初期化情
1299å ±>
1300};
1301
1302この中の割込みハンドラの初期化情
1303報は,次の形式とする.
1304
1305 { (inhno), (inhatr), (FP)(INT_ENTRY(inhno, inthdr)) }
1306
13074.7.2.4 エラー条件
1308
1309割込みハンドラに関するエラー条件は次の通りである.
1310
1311*パス2で検出するもの
1312・inhnoが割込みハンドラ番号として正しくない場合(E_PAR)[NGKI3055]
1313・inhnoがDEF_INHによって設定済みの場合(E_OBJ)[NGKI3063]
1314・inhatrが無効の場合(E_RSATR)[NGKI3052]
1315 (TARGET_INHATR以外のビットがセットされている場合)
1316 ※ TAGET_INHATRは,ターゲット依存部で追加する割込みハンドラ属性
1317・カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
1318 定されていない場合(E_RSATR)[NGKI3067]
1319・カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指定
1320 されている場合(E_RSATR)[NGKI3068]
1321・inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)[NGKI3062]
1322 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1323#・inhnoに対応するintnoに対してCRE_ISRがある場合(E_OBJ)[NGKI3063]
1324# ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1325# → このチェックは,割込みサービスルーチン側で行う
1326・inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintnoに対して
1327 CFG_INTで設定された割込み優å…
1328ˆåº¦ãŒTMIN_INTPRIよりも小さい場合(E_OBJ)
1329 [NGKI3065]
1330 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1331・inhatrにTA_NONKERNELが指定されており,inhnoに対応するintnoに対して
1332 CFG_INTで設定された割込み優å…
1333ˆåº¦ãŒTMIN_INTPRI以上である場合(E_OBJ)
1334 [NGKI3066]
1335 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1336
1337*可能であればターゲット依存部で検出するもの[NGKI3080]
1338・inthdrがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3056]
1339
13404.7.3 割込み要求ラインに関する定義
1341
1342割込み要求ラインに関して生成する情
1343報は,ターゲット毎に定めることができ
1344る.ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない
1345標準的な情
1346報を生成する.
1347
1348割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
1349ラインに関する定義を生成する.å…
1350·ä½“的には次の通り.
1351
1352以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
1353ている時に生成すべき情
1354報について述べる.
1355
1356 CFG_INT(INTNO intno, { intatr, intpri });
1357
13584.7.3.1 設定する割込み要求ラインの数
1359
1360設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
1361ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.å…
1362·ä½“çš„
1363には,次のような行を生成する.
1364
1365#define TNUM_CFG_INTNO <設定する割込み要求ラインの数>
1366const uint_t _kernel_tnum_cfg_intno = TNUM_CFG_INTNO;
1367
13684.7.3.2 割込み要求ライン初期化ブロックの定義
1369
1370割込み要求ライン初期化ブロックを生成する.å…
1371·ä½“的には,次のような行を生
1372成する.
1373
1374const INTINIB _kernel_intinib_table[TNUM_CFG_INTNO] = {
1375 <割込み要求ライン1の初期化情
1376å ±>,
1377 <割込み要求ライン2の初期化情
1378å ±>,
1379 ……
1380 <割込み要求ラインTNUM_CFG_INTNOの初期化情
1381å ±>
1382};
1383
1384この中の割込み要求ラインの初期化情
1385報は,次の形式とする.
1386
1387 { (intno), (intatr), (intpri) }
1388
13894.7.3.3 エラー条件
1390
1391割込み要求ラインに関するエラー条件は次の通りである.
1392
1393*パス2で検出するもの
1394・intnoが割込み番号として正しくない場合(E_PAR)[NGKI2972]
1395・intnoがCFG_INTによって設定済みの場合(E_OBJ)[NGKI2976]
1396・intatrが無効の場合(E_RSATR)[NGKI2969]
1397 (TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合)
1398 ※ TAGET_INTATRは,ターゲット依存部で追加する割込み要求ライン属性
1399・intpriがCFG_INTに対する割込み優å…
1400ˆåº¦ã¨ã—て正しくない場合(E_PAR)[NGKI2973ï¼½
1401・カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRIより
1402 も小さい値が指定されなかった場合(E_OBJ)[NGKI2983]
1403・カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIよりも
1404 小さい値が指定された場合(E_OBJ)[NGKI2984]
1405
1406*必
1407要に応じてターゲット依存部で検出するもの[NGKI2986]
1408・intatrが割込み属性として設定できない値の場合(E_RSATR)[NGKI2985]
1409・intpriが割込み優å…
1410ˆåº¦ã¨ã—て設定できない値の場合(E_PAR)[NGKI2985ï¼½
1411・同一の割込み優å…
1412ˆåº¦ã—か設定できない割込み要求ラインに対して,異なる割
1413 込み優å…
1414ˆåº¦ã‚’設定した場合(E_PAR)[NGKI2985ï¼½
1415
14164.8 CPU例外に関する定義
1417
1418CPU例外に関して生成する情
1419報は,ターゲット毎に定めることができる.ターゲッ
1420ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情
1421å ±
1422を生成する.
1423
1424システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
1425静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
1426生成する.
1427
1428以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
1429ている時に生成すべき情
1430報について述べる.
1431
1432 DEF_EXC(excno, { excatr, exchdr });
1433
14344.8.1 定義するCPU例外ハンドラの数
1435
1436定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティブ
1437(#define)を生成する.また,その値を持つ変数の定義を生成する.å…
1438·ä½“的に
1439は,次のような行を生成する.
1440
1441#define TNUM_DEF_EXCNO <定義するCPU例外ハンドラの数>
1442const uint_t _kernel_tnum_def_excno = TNUM_DEF_EXCNO;
1443
14444.8.2 CPU例外ハンドラの出å…
1445¥å£å‡¦ç†
1446
1447定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出å…
1448¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成
1449する.å…
1450·ä½“的には,次のような行を生成する.
1451
1452EXCHDR_ENTRY(excno, excno_num, exchdr)
1453
1454ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
1455アセンブリ言語記述に使用するためのものである.
1456
14574.8.3 CPU例外ハンドラ初期化ブロックの定義
1458
1459CPU例外ハンドラ初期化ブロックを生成する.å…
1460·ä½“的には,次のような行を生成
1461する.
1462
1463const EXCINIB _kernel_excinib_table[TNUM_DEF_EXCNO] = {
1464 <CPU例外ハンドラ1の初期化情
1465å ±>,
1466 <CPU例外ハンドラ2の初期化情
1467å ±>,
1468 ……
1469 <CPU例外ハンドラTNUM_DEF_EXCNOの初期化情
1470å ±>
1471};
1472
1473この中のCPU例外ハンドラの初期化情
1474報は,次の形式とする.
1475
1476 { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
1477
14784.8.4 エラー条件
1479
1480CPU例外ハンドラに関するエラー条件は次の通りである.
1481
1482*パス2で検出するもの
1483・excnoがCPU例外ハンドラ番号として正しくない場合(E_PAR)[NGKI3134]
1484・excnoがDEF_EXCによって設定済みの場合(E_OBJ)[NGKI3141]
1485・excatrが無効の場合(E_RSATR)[NGKI3131]
1486 (TARGET_EXCATR以外のビットがセットされている場合)
1487 ※ TAGET_EXCATRは,ターゲット依存部で追加するCPU例外ハンドラ属性
1488
1489*可能であればターゲット依存部で検出するもの[NGKI3149]
1490・exchdrがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3135]
1491
14924.9 非タスクコンテキスト用のスタック領域に関する定義
1493
1494非タスクコンテキスト用のスタック領域に関する定義は,必
1495ず生成しなければ
1496ならない.
1497
14984.9.1 DEF_ICSがない場合
1499
1500システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
1501いない場合には,次の行を生成する.
1502
1503#ifdef DEFAULT_ISTK
1504
1505#define TOPPERS_ISTKSZ DEFAULT_ISTKSZ
1506#define TOPPERS_ISTK DEFAULT_ISTK
1507
1508#else /* DEFAULT_ISTK */
1509
1510static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
1511#define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)
1512#define TOPPERS_ISTK _kernel_istack
1513
1514#endif /* DEFAULT_ISTK */
1515
15164.9.2 DEF_ICSがある場合
1517
1518以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
1519いる時に生成すべき情
1520報について述べる.
1521
1522 DEF_ICS({ istksz, istk });
1523
1524istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
1525ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情
1526報を生成
1527する.å…
1528·ä½“的には,上記の静的APIに対して,次の行を生成する.
1529
1530static STK_T _kernel_istack[COUNT_STK_T(istksz)];
1531#define TOPPERS_ISTKSZ ROUND_STK_T(istksz)
1532#define TOPPERS_ISTK _kernel_istack
1533
1534istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
1535情
1536報を,次の形式で生成する.
1537
1538#define TOPPERS_ISTKSZ (istksz)
1539#define TOPPERS_ISTK (istk)
1540
15414.9.3 変数の生成
1542
1543DEF_ICSの有無によらず,次の定義を生成する.
1544
1545const SIZE _kernel_istksz = TOPPERS_ISTKSZ;
1546STK_T *const _kernel_istk = TOPPERS_ISTK;
1547
1548#ifdef TOPPERS_ISTKPT
1549STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
1550#endif /* TOPPERS_ISTKPT */
1551
15524.9.4 エラー条件
1553
1554非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
1555
1556*パス2で検出するもの
1557・静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
1558・istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも小
1559 さい場合(E_PAR)[NGKI3254]
1560・istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
1561 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
1562 ※ このエラーチェックは,istkがNULLでない場合にのみ行う
1563
1564*パス3で検出するもの
1565・istkがスタック領域のå…
1566ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)[NGKI3222ï¼½
1567 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
1568 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
1569
15704.10 タイムイベント管理に関する定義
1571
1572タイムイベント管理に関連して,次の定義を生成する.
1573
1574TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
1575
15764.11 各モジュールの初期化関数の定義
1577
1578各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
1579初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
1580の3つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
1581
1582 _kernel_initialize_task
1583 _kernel_initialize_interrupt
1584 _kernel_initialize_exception
1585
1586すべての機能を使った場合に生成される関数は次の通りである.
1587
1588void
1589_kernel_initialize_object(void)
1590{
1591 _kernel_initialize_task();
1592 _kernel_initialize_semaphore();
1593 _kernel_initialize_eventflag();
1594 _kernel_initialize_dataqueue();
1595 _kernel_initialize_pridataq();
1596 _kernel_initialize_mutex();
1597 _kernel_initialize_mempfix();
1598 _kernel_initialize_cyclic();
1599 _kernel_initialize_alarm();
1600 _kernel_initialize_interrupt();
1601 _kernel_initialize_exception();
1602}
1603
16044.12 初期化ルーチンの実行関数の定義
1605
1606システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
1607する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
1608数を生成する.å…
1609·ä½“的には,
1610
1611 ATT_INI({ iniatr, exinf, inirtn });
1612
1613という静的APIに対して,
1614
1615 ((INIRTN)(inirtn))((intptr_t)(exinf));
1616
1617を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
1618ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1619APIの順序に一致させる.
1620
1621例えば,
1622
1623 ATT_INI({ TA_NULL, 0, timer_initialize });
1624 ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
1625
1626という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1627る.
1628
1629void
1630_kernel_call_inirtn(void)
1631{
1632 ((INIRTN)(timer_initialize))((intptr_t)(0));
1633 ((INIRTN)(serial_initialize))((intptr_t)(CONSOLE_PORTID));
1634}
1635
16364.12.1 エラー条件
1637
1638初期化ルーチンに関するエラー条件は次の通りである.
1639
1640*パス2で検出するもの
1641・iniatrが無効の場合(E_RSATR)[NGKI3241]
1642 (TA_NULLでない場合)
1643
1644*可能であればターゲット依存部で検出するもの[NGKI3246]
1645・inirtnがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3243]
1646
16474.13 終了処理ルーチンの実行関数の定義
1648
1649システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
1650加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
1651す関数を生成する.å…
1652·ä½“的には,
1653
1654 ATT_TER({ teratr, exinf, terrtn });
1655
1656という静的APIに対して,
1657
1658 ((TERRTN)(terrtn))((intptr_t)(exinf));
1659
1660を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
1661チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1662APIの逆順に一致させる.
1663
1664例えば,
1665
1666 ATT_TER({ TA_NULL, 0, timer_terminate });
1667 ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
1668
1669という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1670る.
1671
1672void
1673_kernel_call_terrtn(void)
1674{
1675 ((TERRTN)(serial_terminate))((intptr_t)(CONSOLE_PORTID));
1676 ((TERRTN)(timer_terminate))((intptr_t)(0));
1677}
1678
16794.13.1 エラー条件
1680
1681終了処理ルーチンに関するエラー条件は次の通りである.
1682
1683*パス2で検出するもの
1684・teratrが無効の場合(E_RSATR)[NGKI3248]
1685 (TA_NULLでない場合)
1686
1687*可能であればターゲット依存部で検出するもの[NGKI3253]
1688・terrtnがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3250]
1689
1690以上
Note: See TracBrowser for help on using the repository browser.