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

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

3.1.0を反映

File size: 67.8 KB
Line 
1
2 TOPPERS/ASP3カーネル
3 コンフィギュレータ仕様
4
5 対応バージョン: Release 3.1.0
6 最終更新: 2016年2月5日
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-2016 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 724 2016-04-02 21:36:23Z 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.6.1 変数の設定によるイベント通知
96 4.6.2 変数のインクリメントによるイベントの通知
97 4.6.3 タスクの起動によるイベント通知
98 4.6.4 タスクの起床によるイベント通知
99 4.6.5 セマフォの返却によるイベント通知
100 4.6.6 イベントフラグのセットによるイベント通知
101 4.6.7 データキューへの送信によるイベント通知
102 4.6.8 変数の設定によるエラー通知
103 4.6.9 変数のインクリメントによるエラー通知
104 4.6.10 タスクの起動によるエラー通知
105 4.6.11 タスクの起床によるエラー通知
106 4.6.12 セマフォの返却によるエラー通知
107 4.6.13 イベントフラグのセットによるエラー通知
108 4.6.14 データキューへの送信によるエラー通知
109 4.6.15 エラー条件
110 4.7 割込みに関する定義
111 4.7.1 割込みサービスルーチンに関する定義
112 4.7.2 割込みハンドラに関する定義
113 4.7.3 割込み要求ラインに関する定義
114 4.8 CPU例外に関する定義
115 4.9 非タスクコンテキスト用のスタック領域に関する定義
116 4.10 タイムイベント管理に関する定義
117 4.11 各モジュールの初期化関数の定義
118 4.12 初期化ルーチンの実行関数の定義
119 4.13 終了処理ルーチンの実行関数の定義
120
121
1221.生成するファイルの種類
123
124ASP3カーネルのコンフィギュレータは,システムコンフィギュレーションファ
125イルを処理して,カーネル構成・初期化ファイル(kernel_cfg.c)と構成・初
126期化ヘッダファイル(kernel_cfg.h)を生成する.コンフィギュレータの処理
127の途中に,この他にいくつかの中間ファイルを生成する.
128
129
1302.静的API一覧
131
132ASP3カーネルのコンフィギュレータが処理する静的APIは次の通り.
133
134(1) タスク管理機能
135 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
136 PRI itskpri, SIZE stksz, STK_T *stk })
137
138(2) 同期・通信機能
139 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
140 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
141 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
142 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
143 CRE_MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })
144
145※ dtqmb,pdqmbがNULLでない場合はサポートしない.
146
147(3) メモリプール管理機能
148 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
149 MPF_T *mpf, void *mpfmb })
150
151※ mpfmbがNULLでない場合はサポートしない.
152
153(4) 時間管理機能
154 CRE_CYC(ID cycid, { ATR cycatr, <通知方法の指定>,
155 RELTIM cyctim, RELTIM cycphs })
156 CRE_ALM(ID almid, { ATR almatr, <通知方法の指定> })
157
158(5) 割込み管理機能
159 CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
160 CRE_ISR(ID isrid, { ATR isratr, intptr_t exinf,
161 INTNO intno, ISR isr, PRI isrpri })
162 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
163
164(6) CPU例外管理機能
165 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
166
167(7) システム構成管理機能
168 DEF_ICS({ SIZE istksz, STK_T *istk })
169 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
170 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
171
172
1733.カーネル構成・初期化ヘッダファイル(kernel_cfg.h)
174
175この章では,カーネル構成・初期化ヘッダファイル(kernel_cfg.h)に生成す
176べき定義について説明する.なお,生成位置が明示されているものを除いては,
177定義の生成順序は以下の順でなくてもよい.
178
1793.1 固定生成部分
180
181kernel_cfg.hが複数回インクルードされるのを防ぐための記述を生成する.å…
182·
183体的には,ファイルのå…
184ˆé ­ã«æ¬¡ã®è¡Œã‚’生成する.
185
186#ifndef TOPPERS_KERNEL_CFG_H
187#define TOPPERS_KERNEL_CFG_H
188
189また,ファイルの末尾に次の行を生成する.
190
191#endif /* TOPPERS_KERNEL_CFG_H */
192
1933.2 オブジェクト数の定義
194
195カーネルがサポートするオブジェクトの数をマクロ定義するプリプロセッサディ
196レクティブ(#define)を生成する.å…
197·ä½“的には,次のような記述を生成する.
198
199#define TNUM_TSKID <タスクの数>
200#define TNUM_SEMID <セマフォの数>
201#define TNUM_FLGID <イベントフラグの数>
202#define TNUM_DTQID <データキューの数>
203#define TNUM_PDQID <優å…
204ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®æ•°>
205#define TNUM_MTXID <ミューテックスの数>
206#define TNUM_MPFID <固定長メモリプールの数>
207#define TNUM_CYCID <周期ハンドラの数>
208#define TNUM_ALMID <アラームハンドラの数>
209#define TNUM_ISRID <割込みサービスルーチンの数>
210
2113.3 オブジェクトのID番号の定義
212
213コンフィギュレータがID番号を割り付けたオブジェクトの名前を,割り付けた
214ID番号にマクロ定義するプリプロセッサディレクティブ(#define)を生成する.
215例えば,次のような記述を生成する.
216
217#define TASK1 1
218#define TASK2 2
219#define SEM1 1
220
221
2224.カーネル構成・初期化ファイル(kernel_cfg.c)
223
224この章では,カーネル構成・初期化ファイル(kernel_cfg.c)に生成すべき定
225義について説明する.なお,生成位置が明示されているものを除いては,定義
226の生成順序は以下の順でなくてもよい.
227
2284.1 固定生成部分
229
230kernel_cfg.c用のヘッダファイルと,カーネル構成・初期化ヘッダファイルを
231インクルードするプリプロセッサディレクティブ(#include)を生成する.å…
232·
233体的には,次の行を生成する.
234
235#include "kernel/kernel_int.h"
236#include "kernel_cfg.h"
237
2384.2 カーネルの種類のチェック
239
240kernel_cfg.cとカーネルの種類が一致しているかをチェックするために,次の
241行を生成する.
242
243#if !(TKERNEL_PRID == 0x0007U && (TKERNEL_PRVER & 0xf000U) == 0x3000U)
244#error The kernel does not match this configuration file.
245#endif
246
2474.3 インクルードディレクティブ(#include)の処理
248
249システムコンフィギュレーションファイルに含まれるC言語プリプロセッサのイ
250ンクルードディレクティブ(#include)と同一のディレクティブ(#include)
251を生成する.例えば,
252
253#include "sample1.h"
254
255というインクルードディレクティブに対して,
256
257#include "sample1.h"
258
259というディレクティブを生成する.生成するディレクティブの順序は,システ
260ムコンフィギュレーションファイル中でのインクルードディレクティブの記述
261順序に一致させる.
262
2634.4 オブジェクトのID番号を保持する変数の定義
264
265USE_EXTERNAL_IDが定義されている場合(cfg1_out.cをコンパイルする際のコン
266パイルオプションにより定義することを想定)には,コンフィギュレータがID
267番号を割り付けたオブジェクトの名前の末尾に"_id"を付加した名前の変数を生
268成する.変数は,const属性を付加したID型の変数とし,割り付けたID番号を値
269とする.例えば,次のような記述を生成する.
270
271const ID TASK1_id = 1;
272const ID TASK2_id = 2;
273const ID SEM1_id = 1;
274
2754.5 各カーネルオブジェクトに関する定義
276
2774.5.1 カーネルオブジェクトに関する定義の標準構成
278
279システムコンフィギュレーションファイル中に,オブジェクトを生成する静的
280API「CRE_XXX」が含まれる各カーネルオブジェクトに関して,オブジェクト生
281成のための定義を生成する.
282
283コンフィギュレータは,同じ種類のオブジェクトを生成する静的APIを集め,各
284オブジェクトにID番号を割り付ける.ID番号は,他のオブジェクトのID番号と
285重複がなく,ID番号が1から連続するように割り付ける.
286
287コンフィギュレータに対するオプション指定(--id-input-file)により,コン
288フィギュレータがオブジェクトに割り付けるID番号を指定することができる.
289同じ種類の異なるオブジェクトに対して同じID番号を指定したり,コンフィギュ
290レータがID番号をできる限り連続するように割り付けたとしてもID番号が連続
291しない場合には(ASP3カーネルは,オブジェクトのID番号が連続していること
292を仮定して実装
293してある),コンフィギュレータはエラーを報告する.
294
295また,コンフィギュレータに対するオプション指定(--id-output-file)によ
296り,コンフィギュレータがID番号を割り付けたオブジェクトの名前と割り付け
297たID番号の組を,オプションで指定したファイルに出力する.
298
299各カーネルオブジェクトに関する定義の標準的な構成は,次の通りである.オ
300ブジェクトによって例外がある場合には,オブジェクト毎の項
301で説明する.
302
303(a) オブジェクトIDの最大値の変数の定義
304
305オブジェクトIDの最大値を保持する変数の定義を生成する.å…
306·ä½“的には,オブ
307ジェクトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
308
309const ID _kernel_tmax_xxxid = (TMIN_XXXID + TNUM_XXXID - 1);
310
311(b) オブジェクトに必
312要なメモリ領域の定義
313
314オブジェクトによっては,オブジェクトに必
315要なメモリ領域の定義を生成する.
316å…
317·ä½“的には,オブジェクト毎の項
318で説明する.
319
320(c) オブジェクトの初期化ブロックの定義
321
322オブジェクトの初期化ブロックの定義を生成する.å…
323·ä½“的には,オブジェクト
324の省略記号を「XXX/xxx」とすると,次のような行を生成する.
325
326const XXXINIB _kernel_xxxinib_table[TNUM_XXXID] = {
327 <オブジェクトIDが1のオブジェクトの初期化情
328å ±>,
329 <オブジェクトIDが2のオブジェクトの初期化情
330å ±>,
331 ……
332 <オブジェクトIDがTNUM_XXXIDのオブジェクトの初期化情
333å ±>
334};
335
336オブジェクトの初期化情
337報の形式は,オブジェクト毎に異なる.å…
338·ä½“的には,
339オブジェクト毎の項
340で説明する.
341
342オブジェクトが1つも生成されなかった場合には,次のような行を生成する.
343
344 TOPPERS_EMPTY_LABEL(const XXXINIB, _kernel_xxxinib_table);
345
346(d) オブジェクトのコントロールブロックの定義
347
348オブジェクトのコントロールブロックの定義を生成する.å…
349·ä½“的には,オブジェ
350クトの省略記号を「XXX/xxx」とすると,次のような行を生成する.
351
352XXXCB _kernel_xxxcb_table[TNUM_XXXID];
353
354オブジェクトが1つも生成されなかった場合には,次のような行を生成する.
355
356 TOPPERS_EMPTY_LABEL(XXXCB, _kernel_xxxcb_table);$NL$
357
3584.5.2 タスクに関する定義
359
360ASP3カーネルは,タスクが1つもないケースに対応していない.タスクを生成す
361る静的APIが1つもなかった場合,コンフィギュレータはエラーを報告する.
362
363タスクの省略記号は「TSK/tsk」である.ただし,タスク初期化ブロックのデー
364タ型はTINIB,その変数名は_kernel_tinib_table,タスクコントロールブロッ
365クのデータ型はTCB,その変数名は_kernel_tcb_table である(いずれも「TSK/
366tsk」に代えて「T/t」を用いている).
367
368以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
369ている時に生成すべき情
370報について述べる.
371
372 CRE_TSK(tskid, { tskatr, exinf, task, itskpri, stksz, stk });
373
3744.5.2.1 タスクに必
375要なメモリ領域の定義
376
377タスクに必
378要なメモリ領域として,タスクのスタック領域がある.stkがNULLの
379場合には,生成するタスク毎に,指定されたサイズのスタック領域を確保する.
380å…
381·ä½“的には,上記の静的APIに対して,次の定義を生成する.
382
383*stkがNULLの場合のみ生成
384static STK_T _kernel_stack_<タスク名>[COUNT_STK_T(stksz)];
385
386ただし,この方法でスタック領域が確保できないターゲットにおいては,ター
387ゲット依存の方法でスタック領域を確保する.
388
3894.5.2.2 タスクの初期化情
390å ±
391
392タスク初期化ブロック中に生成するタスクの初期化情
393報は,次の形式とする.
394
395*stkがNULLでない場合
396 { (tskatr), (intptr_t)(exinf), (TASK)(task), INT_PRIORITY(itskpri),
397 (stksz), (void *)(stk) }
398
399*stkがNULLの場合
400 { (tskatr), (intptr_t)(exinf), (TASK)(task), INT_PRIORITY(itskpri),
401 ROUND_STK_T(stksz), _kernel_stack_<タスク名> }
402
4034.5.2.3 タスク生成順序テーブルの定義
404
405タスクの生成された順序で,タスクの初期化(よりå…
406·ä½“的には,タスクの起動)
407を行う必
408要があることからに,タスクが生成された順序(タスクを生成する静
409的APIが記述された順序)をテーブルに出力する.
410
411å…
412·ä½“的には,次のような行を生成する.
413
414const ID _kernel_torder_table[TNUM_TSKID] = {
415 <最初に生成されたタスクのタスクID>,
416 <2番目に生成されたタスクのタスクID>,
417 ……
418 <最後に生成されたタスクのタスクID>
419};
420
421(6-1-4) エラー条件
422
423タスクに関するエラー条件は次の通りである.
424
425*コンフィギュレータ本体が検出するもの
426・同じtskidに対するCRE_TSKが複数ある場合(E_OBJ)[NGKI1040]
427
428*パス2で検出するもの
429・タスクが1つも登録されていない場合[NGKI0033]
430・tskatrが無効の場合(E_RSATR)[NGKI1028]
431 (TA_ACT,TA_NOACTQUE,TARGET_TSKATR以外のビットがセットされている場合)
432 ※ TAGET_TSKATRは,ターゲット依存部で追加するタスク属性
433・(TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)[NGKI1034]
434・stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも小さ
435 い場合(E_PAR)[NGKI1042]
436・stkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI1056]
437 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
438 ※ このエラーチェックは,stkがNULLでない場合にのみ行う
439
440*パス3で検出するもの
441・taskがプログラムの開始番地として正しくない場合(E_PAR)[NGKI1033]
442 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
443 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
444・stkがスタック領域のå…
445ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)[NGKI1056ï¼½
446 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
447 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
448
4494.5.3 セマフォに関する定義
450
451セマフォの省略記号は「SEM/sem」である.以下では,システムコンフィギュレー
452ションファイルに次の静的APIが含まれている時に生成すべき情
453報について述べ
454る.なお,セマフォに必
455要なメモリ領域はない.
456
457 CRE_SEM(semid, { sematr, isemcnt, maxsem });
458
4594.5.3.1 セマフォの初期化情
460å ±
461
462セマフォ初期化ブロック中に生成するセマフォの初期化情
463報は,次の形式とす
464る.
465
466 { (sematr), (isemcnt), (maxsem) }
467
4684.5.3.2 エラー条件
469
470セマフォに関するエラー条件は次の通りである.
471
472*コンフィギュレータ本体が検出するもの
473・同じsemidに対するCRE_SEMが複数ある場合(E_OBJ)[NGKI1463]
474
475*パス2で検出するもの
476・sematrが無効の場合(E_RSATR)[NGKI1456]
477 (TA_TPRI以外のビットがセットされている場合)
478・(1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)[NGKI1468]
479・(0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)[NGKI1466]
480
4814.5.4 イベントフラグに関する定義
482
483イベントフラグの省略記号は「FLG/flg」である.以下では,システムコンフィ
484ギュレーションファイルに次の静的APIが含まれている時に生成すべき情
485報につ
486いて述べる.なお,イベントフラグに必
487要なメモリ領域はない.
488
489 CRE_FLG(flgid, { flgatr, iflgptn });
490
4914.5.4.1 イベントフラグの初期化情
492å ±
493
494イベントフラグ初期化ブロック中に生成するイベントフラグの初期化情
495報は,
496次の形式とする.
497
498 { (flgatr), (iflgptn) }
499
5004.5.4.2 エラー条件
501
502イベントフラグに関するエラー条件は次の通りである.
503
504*コンフィギュレータ本体が検出するもの
505・同じflgidに対するCRE_FLGが複数ある場合(E_OBJ)[NGKI1569]
506
507*パス1で検出するもの
508・iflgptnがFLGPTNに格納できない場合(E_PAR)
509 → iflgptnがuint32_tに格納できない場合は,cfg1_out.cのコンパイル時
510 にエラーとなる.
511
512*パス2で検出するもの
513・flgatrが無効の場合(E_RSATR)[NGKI1562]
514 (TA_TPRI,TA_WMUL,TA_CLR以外のビットがセットされている場合)
515・iflgptnがFLGPTNに格納できない場合(E_PAR)[NGKI3275]
516 → iflgptnがuint32_tには格納できるが,FLGPTNに格納できない場合は,
517 パス2でエラーを検出する.
518
5194.5.5 データキューに関する定義
520
521データキューの省略記号は「DTQ/dtq」である.以下では,システムコンフィギュ
522レーションファイルに次の静的APIが含まれている時に生成すべき情
523報について
524述べる.
525
526 CRE_DTQ(dtqid, { dtqatr, dtqcnt, dtqmb });
527
5284.5.5.1 データキューに必
529要なメモリ領域の定義
530
531データキューに必
532要なメモリ領域として,データキュー管理領域がある.生成
533するデータキュー毎に,必
534要なサイズのデータキュー管理領域を定義する.å…
535·
536体的には,上記の静的APIに対して,次の定義を生成する.
537
538*dtqcntが0でない場合のみ生成
539static DTQMB _kernel_dtqmb_<データキュー名>[dtqcnt];
540
5414.5.5.2 データキューの初期化情
542å ±
543
544データキュー初期化ブロック中に生成するデータキューの初期化情
545報は,次の
546形式とする.
547
548 { (dtqatr), (dtqcnt), _kernel_dtqmb_<データキュー名> }
549
550ここで,dtqcntが0の場合には,_kernel_dtqmb_<データキュー名>に代えて,
551NULLを用いる.
552
5534.5.5.3 エラー条件
554
555データキューに関するエラー条件は次の通りである.
556
557*コンフィギュレータ本体が検出するもの
558・同じdtqidに対するCRE_DTQが複数ある場合(E_OBJ)[NGKI1677]
559
560*パス2で検出するもの
561・dtqatrが無効の場合(E_RSATR)[NGKI1669]
562 (TA_TPRI以外のビットがセットされている場合)
563・dtqcntが負の値の場合(E_PAR)[NGKI3288]
564・dtqmbがNULLでない場合(E_NOSPT)[ASPS0132]
565
5664.5.6 優å…
567ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹å®šç¾©
568
569優å…
570ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çœç•¥è¨˜å·ã¯ã€ŒPDQ/pdq」である.以下では,システムコ
571ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
572
573報について述べる.
574
575 CRE_PDQ(ID pdqid, { pdqatr, pdqcnt, maxdpri, pdqmb });
576
5774.5.6.1 優å…
578ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿…
579要なメモリ領域の定義
580
581優å…
582ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¿…
583要なメモリ領域として,優å…
584ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸ
585がある.生成する優å…
586ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ¯Žã«ï¼Œå¿…
587要なサイズの優å…
588ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼
589管理領域を定義する.å…
590·ä½“的には,上記の静的APIに対して,次の定義を生成す
591る.
592
593*pdqcntが0でない場合のみ生成
594static PDQMB _kernel_pdqmb_<優å…
595ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>[pdqcnt];
596
5974.5.6.2 優å…
598ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®åˆæœŸåŒ–情
599å ±
600
601優å…
602ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼åˆæœŸåŒ–ブロック中に生成する優å…
603ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®åˆæœŸåŒ–
604情
605報は,次の形式とする.
606
607 { (pdqatr), (pdqcnt), (maxdpri), _kernel_pdqmb_<優å…
608ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å> }
609
610ここで,pdqcntが0の場合には,_kernel_pdqmb_<優å…
611ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼å>に代え
612て,NULLを用いる.
613
6144.5.6.3 エラー条件
615
616優å…
617ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«é–¢ã™ã‚‹ã‚¨ãƒ©ãƒ¼æ¡ä»¶ã¯æ¬¡ã®é€šã‚Šã§ã‚る.
618
619*コンフィギュレータ本体が検出するもの
620・同じpdqidに対するCRE_PDQが複数ある場合(E_OBJ)[NGKI1812]
621
622*パス2で検出するもの
623・pdqatrが無効の場合(E_RSATR)[NGKI1804]
624 (TA_TPRI以外のビットがセットされている場合)
625・pdqcntが負の値の場合(E_PAR)[NGKI3289]
626・(TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)[NGKI1819]
627・pdqmbがNULLでない場合(E_NOSPT)[ASPS0142]
628
6294.5.7 ミューテックスに関する定義
630
631ミューテックスの省略記号は「MTX/mtx」である.以下では,システムコンフィ
632ギュレーションファイルに次の静的APIが含まれている時に生成すべき情
633報につ
634いて述べる.なお,ミューテックスに必
635要なメモリ領域はない.
636
637 CRE_MTX(mtxid, { mtxatr, maxmpri, mprihd });
638
6394.5.7.1 ミューテックスの初期化情
640å ±
641
642ミューテックス初期化ブロック中に生成するミューテックスの初期化情
643報は,
644次の形式とする.
645
646 { (mtxatr), (maxmpri) }
647
6484.5.7.2 エラー条件
649
650ミューテックスに関するエラー条件は次の通りである.
651
652*コンフィギュレータ本体が検出するもの
653・同じmtxidに対するCRE_MTXが複数ある場合(E_OBJ)[NGKI2032]
654
655*パス2で検出するもの
656・mtxatrが無効の場合(E_RSATR)[NGKI2025]
657 (TA_NULL,TA_TPRI,TA_CEILINGのいずれでもない場合)
658・優å…
659ˆåº¦ä¸Šé™ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã§ï¼Œ(TMIN_MPRI <= maxmpri && maxmpri <=
660 TMAX_MPRI)でない場合(E_PAR)[NGKI2037]
661
6624.5.8 固定長メモリプールに関する定義
663
664固定長メモリプールの省略記号は「MPF/mpf」である.以下では,システムコ
665ンフィギュレーションファイルに次の静的APIが含まれている時に生成すべき情
666
667報について述べる.
668
669 CRE_MPF(mpfid, { mpfatr, blkcnt, blksz, mpf, mpfmb });
670
6714.5.8.1 固定長メモリプールに必
672要なメモリ領域の定義
673
674固定長メモリプールに必
675要なメモリ領域として,固定長メモリプール領域と固
676定長メモリプール管理領域がある.生成する固定長メモリプール毎に,必
677要な
678サイズの固定長メモリプール領域(mpfがNULLの場合のみ)と固定長メモリプー
679ル管理領域を確保する.å…
680·ä½“的には,上記の静的APIに対して,次の定義を生成
681する.
682
683*mpfがNULLの場合のみ生成
684static MPF_T _kernel_mpf_<固定長メモリプール名>[(blkcnt) * COUNT_MPF_T(blksz)];
685
686*必
687ず生成
688static MPFMB _kernel_mpfmb_<固定長メモリプール名>[blkcnt];
689
6904.5.8.2 固定長メモリプールの初期化情
691å ±
692
693固定長メモリプール初期化ブロック中に生成する固定長メモリプールの初期化
694情
695報は,次の形式とする.
696
697*mpfがNULLでない場合
698 { (mpfatr), (blkcnt), ROUND_MPF_T(blksz), (void *)(mpf),
699 _kernel_mpfmb_<固定長メモリプール名> }
700
701*mpfがNULLの場合
702 { (mpfatr), (blkcnt), ROUND_MPF_T(blksz),
703 _kernel_mpf_<固定長メモリプール名>,
704 _kernel_mpfmb_<固定長メモリプール名> }
705
7064.5.8.3 エラー条件
707
708固定長メモリプールに関するエラー条件は次の通りである.
709
710*コンフィギュレータ本体が検出するもの
711・同じmpfidに対するCRE_MPFが複数ある場合(E_OBJ)[NGKI2236]
712
713*パス2で検出するもの
714・mpfatrが無効の場合(E_RSATR)[NGKI2225]
715 (TA_TPRI以外のビットがセットされている場合)
716・blkcntが0以下の場合(E_PAR)[NGKI2229]
717・blkszが0以下の場合(E_PAR)[NGKI2230]
718・mpfmbがNULLでない場合(E_NOSPT)[ASPS0166]
719
720*パス3で検出するもの
721・mpfが固定長メモリプール領域のå…
722ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)
723 [NGKI2249]
724 - ターゲット依存の値(CHECK_MPF_ALIGN)の倍数でない場合
725 - NULLの場合(ターゲット依存,CHECK_MPF_NONNULL)
726
7274.5.9 周期通知に関する定義
728
729周期通知の省略記号は「CYC/cyc」である.以下では,システムコンフィギュ
730レーションファイルに次の静的APIが含まれている時に生成すべき情
731報について
732述べる.なお,周期通知に必
733要なメモリ領域はない.
734
735 CRE_CYC(cycid, { cycatr, <通知方法の指定>, cyctim, cycphs });
736
7374.5.9.1 通知ハンドラの生成
738
739静的API中の<通知方法の指定>に従って,通知ハンドラを生成する.以下では,
740生成した通知ハンドラの関数名をnfyhdr,拡張情
741報をexinfと記述する.
742
743ただし,<通知方法の指定>の最初のパラメータである通知処理モード
744(nfymode)がTNFY_HANDLER(タイムイベントハンドラの呼出しによる通知)で
745ある場合には,続く2つのパラメータ(タイムイベントハンドラの拡張情
746報とå…
747ˆ
748頭番地)の指定に従ってタイムイベントハンドラを呼び出すものとし,通知ハ
749ンドラは生成しない.この場合,nfyhdrとexinfは,次の通りとする.
750
751 nfyhdr (NFYHDR)(<タイムイベントハンドラのå…
752ˆé ­ç•ªåœ°ï¼ž)
753 exinf <タイムイベントハンドラの拡張情
754報>
755
756なお,通知ハンドラの生成方法については,「4.6 通知ハンドラの生成」の節
757を参ç…
758§ã™ã‚‹ã“と.
759
7604.5.9.2 周期通知の初期化情
761å ±
762
763周期通知初期化ブロック中に生成する周期通知の初期化情
764報は,次の形式とす
765る.
766
767 { (cycatr), (intptr_t)(exinf), nfyhdr, (cyctim), (cycphs) }
768
7694.5.9.3 エラー条件
770
771周期通知に関するエラー条件は次の通りである.
772
773*コンフィギュレータ本体が検出するもの
774・同じcycidに対するCRE_CYCが複数ある場合(E_OBJ)[NGKI2392]
775
776*パス2で検出するもの
777・cycatrが無効の場合(E_RSATR)[NGKI2383]
778 (TA_STA以外のビットがセットされている場合)
779・(0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)[NGKI2397]
780・(0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)[NGKI2399]
781・その他,通知ハンドラの生成に関するエラー(4.6.15節)を参ç…
782§
783
784*パス3で検出するもの
785・通知方法中のタイムイベントハンドラのå…
786ˆé ­ç•ªåœ°ã¾ãŸã¯å¤‰æ•°ã®ç•ªåœ°ãŒæ­£ã—く
787 ない(E_PAR)[NGKI3693]
788 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
789 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
790・その他,通知ハンドラの生成に関するエラー(4.6.15節)を参ç…
791§
792
7934.5.10 アラーム通知に関する定義
794
795アラーム通知の省略記号は「ALM/alm」である.以下では,システムコンフィ
796ギュレーションファイルに次の静的APIが含まれている時に生成すべき情
797報につ
798いて述べる.なお,アラーム通知に必
799要なメモリ領域はない.
800
801 CRE_ALM(ID almid, { almatr, <通知方法の指定> });
802
8034.5.10.1 通知ハンドラの生成
804
805静的API中の<通知方法の指定>に従って,通知ハンドラを生成する.以下では,
806生成した通知ハンドラの関数名をnfyhdr,拡張情
807報をexinfと記述する.
808
809ただし,<通知方法の指定>の最初のパラメータである通知処理モード
810(nfymode)がTNFY_HANDLER(タイムイベントハンドラの呼出しによる通知)で
811ある場合には,続く2つのパラメータ(タイムイベントハンドラの拡張情
812報とå…
813ˆ
814頭番地)の指定に従ってタイムイベントハンドラを呼び出すものとし,通知ハ
815ンドラは生成しない.この場合,nfyhdrとexinfは,次の通りとする.
816
817 nfyhdr (NFYHDR)(<タイムイベントハンドラのå…
818ˆé ­ç•ªåœ°ï¼ž)
819 exinf <タイムイベントハンドラの拡張情
820報>
821
822なお,通知ハンドラの生成方法については,「4.6 通知ハンドラの生成」の節
823を参ç…
824§ã™ã‚‹ã“と.
825
8264.5.10.2 アラーム通知の初期化情
827å ±
828
829アラーム通知初期化ブロック中に生成するアラーム通知の初期化情
830報は,次の
831形式とする.
832
833 { (almatr), (intptr_t)(exinf), nfyhdr }
834
8354.5.10.3 エラー条件
836
837アラーム通知に関するエラー条件は次の通りである.
838
839*コンフィギュレータ本体が検出するもの
840・同じalmidに対するCRE_ALMが複数ある場合(E_OBJ)[NGKI2500]
841
842*パス2で検出するもの
843・almatrが無効の場合(E_RSATR)[NGKI2491]
844 (TA_STA以外のビットがセットされている場合)
845・その他,通知ハンドラの生成に関するエラー(4.6.15節)を参ç…
846§
847
848*パス3で検出するもの
849・通知方法中のタイムイベントハンドラのå…
850ˆé ­ç•ªåœ°ã¾ãŸã¯å¤‰æ•°ã®ç•ªåœ°ãŒæ­£ã—く
851 ない(E_PAR)[NGKI3693]
852 - ターゲット依存の値(CHECK_FUNC_ALIGN)の倍数でない場合
853 - NULLの場合(ターゲット依存,CHECK_FUNC_NONNULL)
854・その他,通知ハンドラの生成に関するエラー(4.6.15節)を参ç…
855§
856
8574.6 通知ハンドラの生成
858
859通知ハンドラは,周期通知機能とアラーム通知機能のためのイベントの通知お
860よびイベント通知時に発生したエラーの通知を行うためのハンドラである.通
861知ハンドラは,カーネル実装
862上の概念であり,外部仕様書には登場しない(タ
863イムイベントハンドラと位置付けが類似しているため,混同しないように注意
864すること).
865
866ASP3カーネルでは,コンフィギュレータにより,周期通知毎およびアラーム通
867知毎に通知ハンドラを生成する.ただし,タイムイベントハンドラの呼出しに
868よる通知の場合には,通知ハンドラを生成せず,直接タイムイベントハンドラ
869を呼び出す.
870
871生成する通知ハンドラの枠組みは次の通り.
872
873(a) エラーの通知を行わない場合
874
875static void
876_kernel_nfyhdr_<cycid または almid>(intptr_t exinf)
877{
878 (void) <イベントの通知処理>;
879}
880
881(b) エラーの通知を行う場合
882
883static void
884_kernel_nfyhdr_<cycid または almid>(intptr_t exinf)
885{
886 ER ercd;
887
888 ercd = <イベントの通知処理>;
889 if (ercd != E_OK) {
890 (void) <エラーの通知処理>;
891 }
892}
893
894<イベントの通知処理>と<エラーの通知処理>は,<通知方法の指定>の最
895初のパラメータである通知処理モード(nfymode)により定まる.å…
896·ä½“的には,
897nfymodeの下位4ビット(以下,これをnfymode1と書く)でイベントの通知方法
898を,残りのビット(以下,これをnfymode2と書く)でエラーの通知方法を指定
899する.
900
9014.6.1 変数の設定によるイベント通知
902
903nfymode1がTNFY_SETVAR(変数の設定によるイベント通知)の場合には,続く2
904つのパラメータ(変数の番地と設定する値)の指定に従って変数を設定するも
905のとする.コンフィギュレータのパス3でのエラーチェックを可能にするために,
906変数の番地は,exinfとして通知ハンドラに渡す.
907
908å…
909·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
910
911 *((intptr_t *) exinf) = (<設定する値>);
912
913周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
914る.
915
916 nfyhdr _kernel_nfyhdr_<cycid または almid>
917 exinf <変数の番地>
918
919なお,変数の設定によるイベント通知の場合,エラーが検出されることはない
920ため,エラーの通知は意味がない.エラーの通知が指定されていた場合,コン
921フィギュレータはエラーを報告する.
922
9234.6.2 変数のインクリメントによるイベントの通知
924
925nfymode1がTNFY_INCVAR(変数のインクリメントによるイベント通知)の場合に
926は,続く1つのパラメータ(変数の番地)の指定に従って変数をインクリメント
927するものとする.コンフィギュレータのパス3でのエラーチェックを可能にする
928ために,変数の番地は,exinfとして通知ハンドラに渡す.
929
930å…
931·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
932
933 loc_cpu();
934 *((intptr_t *) exinf) += 1;
935 unl_cpu();
936
937周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
938る.
939
940 nfyhdr _kernel_nfyhdr_<cycid または almid>
941 exinf <変数の番地>
942
943なお,変数の設定によるイベント通知の場合,エラーが検出されることはない
944ため,エラーの通知は意味がない.エラーの通知が指定されていた場合,コン
945フィギュレータはエラーを報告する.
946
9474.6.3 タスクの起動によるイベント通知
948
949nfymode1がTNFY_ACTTSK(タスクの起動によるイベント通知)の場合には,続く
9501つのパラメータ(タスクID)の指定に従ってタスクを起動するものとする.コ
951ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
952exinfとして通知ハンドラに渡す.
953
954å…
955·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
956
957 act_tsk((ID) exinf);
958
959周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
960る.
961
962 nfyhdr _kernel_nfyhdr_<cycid または almid>
963 exinf <タスクID>
964
9654.6.4 タスクの起床によるイベント通知
966
967nfymode1がTNFY_WUPTSK(タスクの起床によるイベント通知)の場合には,続く
9681つのパラメータ(タスクID)の指定に従ってタスクを起床するものとする.コ
969ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
970exinfとして通知ハンドラに渡す.
971
972å…
973·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
974
975 wup_tsk((ID) exinf);
976
977周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
978る.
979
980 nfyhdr _kernel_nfyhdr_<cycid または almid>
981 exinf <タスクID>
982
9834.6.5 セマフォの返却によるイベント通知
984
985nfymode1がTNFY_SIGSEM(セマフォの返却によるイベント通知)の場合には,続
986く1つのパラメータ(セマフォID)の指定に従ってセマフォを返却を起動するも
987のとする.コンフィギュレータのパス3でのエラーチェックを可能にするために,
988セマフォIDは,exinfとして通知ハンドラに渡す.
989
990å…
991·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
992
993 sig_sem((ID) exinf);
994
995周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
996る.
997
998 nfyhdr _kernel_nfyhdr_<cycid または almid>
999 exinf <セマフォID>
1000
10014.6.6 イベントフラグのセットによるイベント通知
1002
1003nfymode1がTNFY_SETFLG(イベントフラグのセットによるイベント通知)の場合
1004には,続く2つのパラメータ(イベントフラグIDとセットするビットパターン)
1005の指定に従ってイベントフラグをセットするものとする.コンフィギュレータ
1006のパス3でのエラーチェックを可能にするために,イベントフラグIDは,exinf
1007として通知ハンドラに渡す.
1008
1009å…
1010·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
1011
1012 set_flg((ID) exinf, <セットするビットパターン>);
1013
1014周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
1015る.
1016
1017 nfyhdr _kernel_nfyhdr_<cycid または almid>
1018 exinf <イベントフラグID>
1019
10204.6.7 データキューへの送信によるイベント通知
1021
1022nfymode1がTNFY_SNDDTQ(データキューへの送信によるイベント通知)の場合に
1023は,続く2つのパラメータ(データキューIDと送信する値)の指定に従ってデー
1024タキューへ送信するものとする.コンフィギュレータのパス3でのエラーチェッ
1025クを可能にするために,データキューIDは,exinfとして通知ハンドラに渡す.
1026
1027å…
1028·ä½“的には,<イベントの通知処理>には,次のコードを生成する.
1029
1030 snd_dtq((ID) exinf, <送信する値>);
1031
1032周期/アラーム通知初期化ブロックに登録するnfyhdrとexinfは,次の通りとす
1033る.
1034
1035 nfyhdr _kernel_nfyhdr_<cycid または almid>
1036 exinf <データキューID>
1037
10384.6.8 変数の設定によるエラー通知
1039
1040nfymode2がTENFY_SETVAR(変数の設定によるエラー通知)の場合には,続く1つ
1041のパラメータ(変数の番地)の指定に従って,エラーコードを変数に設定する
1042ものとする.コンフィギュレータのパス3でのエラーチェックを可能にするため
1043に,変数の番地は,グローバル変数を通じてて通知ハンドラに渡す.
1044
1045å…
1046·ä½“的には,通知ハンドラの定義にå…
1047ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1048
1049 intptr_t *const _kernel_nfyhdr_<cycid または almid>_p_evar
1050 = (intptr_t *)(<変数の番地>);
1051
1052また,<エラーの通知処理>には,次のコードを生成する.
1053
1054 *((intptr_t *) _kernel_nfyhdr_<cycid または almid>_p_evar)
1055 = (intptr_t) ercd;
1056
10574.6.9 変数のインクリメントによるエラー通知
1058
1059nfymode2がTENFY_INCVAR(変数のインクリメント設定によるエラー通知)の場
1060合には,続く1つのパラメータ(変数の番地)の指定に従って変数をインクリメ
1061ントするものとする.コンフィギュレータのパス3でのエラーチェックを可能に
1062するために,変数の番地は,グローバル変数を通じてて通知ハンドラに渡す.
1063
1064å…
1065·ä½“的には,通知ハンドラの定義にå…
1066ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1067
1068 intptr_t *const _kernel_nfyhdr_<cycid または almid>_p_evar
1069 = (intptr_t *)(<変数の番地>);
1070
1071また,<エラーの通知処理>には,次のコードを生成する.
1072
1073 loc_cpu();
1074 *((intptr_t *) _kernel_nfyhdr_<cycid または almid>_p_evar) += 1;
1075 unl_cpu();
1076
10774.6.10 タスクの起動によるエラー通知
1078
1079nfymode2がTENFY_ACTTSK(タスクの起動によるエラー通知)の場合には,続く
10801つのパラメータ(タスクID)の指定に従ってタスクを起動するものとする.コ
1081ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
1082グローバル変数を通じて通知ハンドラに渡す.
1083
1084å…
1085·ä½“的には,通知ハンドラの定義にå…
1086ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1087
1088 const ID _kernel_nfyhdr_<cycid または almid>_etskid
1089 = <タスクID>;
1090
1091また,<エラーの通知処理>には,次のコードを生成する.
1092
1093 act_tsk(_kernel_nfyhdr_<cycid または almid>_etskid);
1094
10954.6.11 タスクの起床によるエラー通知
1096
1097nfymode2がTENFY_WUPTSK(タスクの起床によるエラー通知)の場合には,続く
10981つのパラメータ(タスクID)の指定に従ってタスクを起床するものとする.コ
1099ンフィギュレータのパス3でのエラーチェックを可能にするために,タスクIDは,
1100グローバル変数を通じて通知ハンドラに渡す.
1101
1102å…
1103·ä½“的には,通知ハンドラの定義にå…
1104ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1105
1106 const ID _kernel_nfyhdr_<cycid または almid>_etskid
1107 = <タスクID>;
1108
1109また,<エラーの通知処理>には,次のコードを生成する.
1110
1111 wup_tsk(_kernel_nfyhdr_<cycid または almid>_ptskid);
1112
11134.6.12 セマフォの返却によるエラー通知
1114
1115nfymode2がTENFY_SIGSEM(セマフォの返却によるエラー通知)の場合には,続
1116く1つのパラメータ(セマフォID)の指定に従ってセマフォを返却するものとす
1117る.コンフィギュレータのパス3でのエラーチェックを可能にするために,セマ
1118フォIDは,グローバル変数を通じて通知ハンドラに渡す.
1119
1120å…
1121·ä½“的には,通知ハンドラの定義にå…
1122ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1123
1124 const ID _kernel_nfyhdr_<cycid または almid>_esemid
1125 = <セマフォID>;
1126
1127また,<エラーの通知処理>には,次のコードを生成する.
1128
1129 sig_sem(_kernel_nfyhdr_<cycid または almid>_esemid);
1130
11314.6.13 イベントフラグのセットによるエラー通知
1132
1133nfymode2がTENFY_SETFIG(イベントフラグのセットによるエラー通知)の場合
1134には,続く2つのパラメータ(イベントフラグIDとセットするビットパターン)
1135の指定に従ってイベントフラグをセットするものとする.コンフィギュレータ
1136のパス3でのエラーチェックを可能にするために,イベントフラグIDは,グロー
1137バル変数を通じて通知ハンドラに渡す.
1138
1139å…
1140·ä½“的には,通知ハンドラの定義にå…
1141ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1142
1143 const ID _kernel_nfyhdr_<cycid または almid>_eflgid
1144 = <イベントフラグID>;
1145
1146また,<エラーの通知処理>には,次のコードを生成する.
1147
1148 set_flg(_kernel_nfyhdr_<cycid または almid>_eflgid,
1149 <セットするビットパターン>);
1150
11514.6.14 データキューへの送信によるエラー通知
1152
1153nfymode2がTENFY_SNDDTQ(データキューへの送信によるエラー通知)の場合に
1154は,続く1つのパラメータ(データキューID)の指定に従って,エラーコードを
1155データキューへ送信するものとする.コンフィギュレータのパス3でのエラー
1156チェックを可能にするために,データキューIDは,グローバル変数を通じて通
1157知ハンドラに渡す.
1158
1159å…
1160·ä½“的には,通知ハンドラの定義にå…
1161ˆç«‹ã¡ï¼Œæ¬¡ã®ã‚³ãƒ¼ãƒ‰ã‚’生成する.
1162
1163 const ID _kernel_nfyhdr_<cycid または almid>_edtqid
1164 = <データキューID>;
1165
1166また,<エラーの通知処理>には,次のコードを生成する.
1167
1168 snd_dtq(_kernel_nfyhdr_<cycid または almid>_edtqid, (intptr_t) ercd);
1169
11704.6.15 エラー条件
1171
1172通知ハンドラの生成に関するエラー条件は次の通りである.
1173
1174*パス2で検出するもの
1175・nfymodeの値が正しくない(E_PAR)[NGKI3730][NGKI3721]
1176
1177*パス3で検出するもの
1178・通知方法中の変数の番地が正しくない(E_PAR)[NGKI3699][NGKI3701]
1179 - ターゲット依存の値(CHECK_INTPTR_ALIGN)の倍数でない場合
1180 - NULLの場合(ターゲット依存,CHECK_INTPTR_NONNULL)
1181・通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704]
1182・通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707]
1183・通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710]
1184・通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3713]
1185 [NGKI3715]
1186
11874.7 割込みに関する定義
1188
11894.7.1 割込みサービスルーチンに関する定義
1190
11914.7.1.1 トレースログマクロのデフォルト定義
1192
1193生成する割込みハンドラcの中で使用するトレースログマクロのデフォルト定義
1194を生成する.å…
1195·ä½“的には,次の行を生成する.
1196
1197#ifndef LOG_ISR_ENTER
1198#define LOG_ISR_ENTER(isrid)
1199#endif /* LOG_ISR_ENTER */
1200
1201#ifndef LOG_ISR_LEAVE
1202#define LOG_ISR_LEAVE(isrid)
1203#endif /* LOG_ISR_LEAVE */
1204
12054.7.1.2 割込みハンドラの生成
1206
1207システムコンフィギュレーションファイル中に含まれる割込みサービスルーチ
1208ンを追加する静的API「CRE_ISR」に対して,同一の割込み番号に対して追加さ
1209れた割込みサービスルーチンを順に呼び出す関数を生成する.
1210
1211å…
1212·ä½“的には,同一の割込み番号に対して割込みサービスルーチンを追加する
1213
1214 CRE_ISR(ISR_1, { isratr_1, exinf_1, intno, isr_1, isrpri_1 });
1215 CRE_ISR(ISR_2, { isratr_2, exinf_2, intno, isr_2, isrpri_2 });
1216 ……
1217 CRE_ISR(ISR_N, { isratr_n, exinf_n, intno, isr_n, isrpri_n });
1218
1219という静的APIに対して,次のような関数を生成する.ここで,isrpri_1,
1220isrpri_2,……,isrpri_nは,値の小さい順に並べ替えられているものとする.
1221値が同じものの間では,システムコンフィギュレーションファイル中での静的
1222APIの順序の通りに並んでいるものとする.
1223
1224static void
1225_kernel_inthdr_<intno>(void)
1226{
1227 LOG_ISR_ENTER(ISR_1); /* ISR_1の呼出し */
1228 ((ISR)(isr_1))((intptr_t)(exinf_1));
1229 LOG_ISR_LEAVE(ISR_1);
1230
1231 if (sense_lock()) { /* ISRの呼出し前の状æ…
1232‹ã«æˆ»ã™ */
1233 unlock_cpu();
1234 }
1235
1236 LOG_ISR_ENTER(ISR_2); /* ISR_2の呼出し */
1237 ((ISR)(isr_2))((intptr_t)(exinf_2));
1238 LOG_ISR_LEAVE(ISR_2);
1239
1240 if (sense_lock()) { /* ISRの呼出し前の状æ…
1241‹ã«æˆ»ã™ */
1242 unlock_cpu();
1243 }
1244
1245 ……
1246
1247 LOG_ISR_ENTER(ISR_N); /* ISR_Nの呼出し */
1248 ((ISR)(isr_n))((intptr_t)(exinf_n));
1249 LOG_ISR_LEAVE(ISR_N);
1250}
1251
1252ここで,ISR_Nの呼出しの後に呼出し前の状æ…
1253‹ã«æˆ»ã•ãªã„のは,割込みハンドラ
1254からのリターンにより,カーネルがå…
1255ƒã®çŠ¶æ…
1256‹ã«æˆ»ã™ãŸã‚ã§ã‚る.
1257
1258同一の割込み番号に対して追加された割込みサービスルーチンが1つのみの場合
1259には,次のような関数を生成する.
1260
1261static void
1262_kernel_inthdr_<intno>(void)
1263{
1264 LOG_ISR_ENTER(ISR_1);
1265 ((ISR)(isr_1))((intptr_t)(exinf_1));
1266 LOG_ISR_LEAVE(ISR_1);
1267}
1268
12694.7.1.3 割込みハンドラの定義に相当する処理
1270
1271上のように割込みハンドラを生成した場合には,次に説明する割込みハンドラ
1272に関する定義において,システムコンフィギュレーションファイル中に次の静
1273的APIが含まれているのと同様に処理する.
1274
1275 DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> });
1276
1277ここでinhnoは,intnoに対応する割込みハンドラ番号である.
1278
12794.7.1.4 エラー条件
1280
1281割込みサービスルーチンに関するエラー条件は次の通りである.
1282
1283*コンフィギュレータ本体が検出するもの
1284・同じisridに対するCRE_ISRが複数ある場合(E_OBJ)[NGKI3009]
1285
1286*パス2で検出するもの
1287・isratrが無効の場合(E_RSATR)[NGKI2998]
1288 (TARGET_ISRATR以外のビットがセットされている場合)
1289 ※ TAGET_ISRATRは,ターゲット依存部で追加する割込みサービスルーチン属性
1290・intnoがCRE_ISRに対する割込み番号として正しくない場合(E_PAR)[NGKI3003]
1291 ※ intnoに対応するinhnoがない場合を含む
1292・(TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
1293 [NGKI3005]
1294・intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
1295・intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
1296・intnoに対してCFG_INTで設定された割込み優å…
1297ˆåº¦ãŒTMIN_INTPRIよりも小さい
1298 場合(E_OBJ)[NGKI3014]
1299 ※ カーネル管理外の割込みサービスルーチンはサポートしないため
1300
1301*可能であればターゲット依存部で検出するもの[NGKI3020]
1302・isrがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3004]
1303
13044.7.2 割込みハンドラに関する定義
1305
1306割込みハンドラに関して生成する情
1307報は,ターゲット毎に定めることができる.
1308ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない標準
1309的な情
1310報を生成する.
1311
1312割込みハンドラを定義する静的API「DEF_INH」で定義した割込みハンドラ(上
1313述の割込みサービスルーチンの追加によりコンフィギュレータが生成した割込
1314みハンドラを含む)に関する定義を生成する.å…
1315·ä½“的には次の通り.
1316
1317以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
1318ている時に生成すべき情
1319報について述べる.
1320
1321 DEF_INH(inhno, { inhatr, inthdr });
1322
13234.7.2.1 定義する割込みハンドラの数
1324
1325定義する割込みハンドラの数をマクロ定義するプリプロセッサディレクティブ
1326(#define)を生成する.また,その値を持つ変数の定義を生成する.å…
1327·ä½“çš„
1328には,次のような行を生成する.
1329
1330#define TNUM_DEF_INHNO <定義する割込みハンドラの数>
1331const uint_t _kernel_tnum_def_inhno = TNUM_DEF_INHNO;
1332
13334.7.2.2 割込みハンドラの出å…
1334¥å£å‡¦ç†
1335
1336定義する割込みハンドラ毎に,割込みハンドラの出å…
1337¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成す
1338る.å…
1339·ä½“的には,次のような行を生成する.
1340
1341INTHDR_ENTRY(inhno, inhno_num, inthdr)
1342
1343ここでinhno_numは,inhno(割込みハンドラ番号)を数値で表現したもので,
1344アセンブリ言語記述に使用するためのものである.
1345
13464.7.2.3 割込みハンドラ初期化ブロックの定義
1347
1348割込みハンドラ初期化ブロックを生成する.å…
1349·ä½“的には,次のような行を生成
1350する.
1351
1352const INHINIB _kernel_inhinib_table[TNUM_DEF_INHNO] = {
1353 <割込みハンドラ1の初期化情
1354å ±>,
1355 <割込みハンドラ2の初期化情
1356å ±>,
1357 ……
1358 <割込みハンドラTNUM_DEF_INHNOの初期化情
1359å ±>
1360};
1361
1362この中の割込みハンドラの初期化情
1363報は,次の形式とする.
1364
1365 { (inhno), (inhatr), (FP)(INT_ENTRY(inhno, inthdr)) }
1366
13674.7.2.4 エラー条件
1368
1369割込みハンドラに関するエラー条件は次の通りである.
1370
1371*パス2で検出するもの
1372・inhnoが割込みハンドラ番号として正しくない場合(E_PAR)[NGKI3055]
1373・inhnoがDEF_INHによって設定済みの場合(E_OBJ)[NGKI3063]
1374・inhatrが無効の場合(E_RSATR)[NGKI3052]
1375 (TARGET_INHATR以外のビットがセットされている場合)
1376 ※ TAGET_INHATRは,ターゲット依存部で追加する割込みハンドラ属性
1377・カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNELが指
1378 定されていない場合(E_RSATR)[NGKI3067]
1379・カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNELが指定
1380 されている場合(E_RSATR)[NGKI3068]
1381・inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)[NGKI3062]
1382 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1383#・inhnoに対応するintnoに対してCRE_ISRがある場合(E_OBJ)[NGKI3063]
1384# ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1385# → このチェックは,割込みサービスルーチン側で行う
1386・inhatrにTA_NONKERNELが指定されておらず,inhnoに対応するintnoに対して
1387 CFG_INTで設定された割込み優å…
1388ˆåº¦ãŒTMIN_INTPRIよりも小さい場合(E_OBJ)
1389 [NGKI3065]
1390 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1391・inhatrにTA_NONKERNELが指定されており,inhnoに対応するintnoに対して
1392 CFG_INTで設定された割込み優å…
1393ˆåº¦ãŒTMIN_INTPRI以上である場合(E_OBJ)
1394 [NGKI3066]
1395 ※ inhnoに対応するintnoがない場合には,このチェックを行わない
1396
1397*可能であればターゲット依存部で検出するもの[NGKI3080]
1398・inthdrがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3056]
1399
14004.7.3 割込み要求ラインに関する定義
1401
1402割込み要求ラインに関して生成する情
1403報は,ターゲット毎に定めることができ
1404る.ターゲット毎に定めない場合には,以下で述べるターゲットに依存しない
1405標準的な情
1406報を生成する.
1407
1408割込み要求ラインの属性を設定する静的API「CFG_INT」で設定した割込み要求
1409ラインに関する定義を生成する.å…
1410·ä½“的には次の通り.
1411
1412以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
1413ている時に生成すべき情
1414報について述べる.
1415
1416 CFG_INT(INTNO intno, { intatr, intpri });
1417
14184.7.3.1 設定する割込み要求ラインの数
1419
1420設定する割込み要求ラインの数をマクロ定義するプリプロセッサディレクティ
1421ブ(#define)を生成する.また,その値を持つ変数の定義を生成する.å…
1422·ä½“çš„
1423には,次のような行を生成する.
1424
1425#define TNUM_CFG_INTNO <設定する割込み要求ラインの数>
1426const uint_t _kernel_tnum_cfg_intno = TNUM_CFG_INTNO;
1427
14284.7.3.2 割込み要求ライン初期化ブロックの定義
1429
1430割込み要求ライン初期化ブロックを生成する.å…
1431·ä½“的には,次のような行を生
1432成する.
1433
1434const INTINIB _kernel_intinib_table[TNUM_CFG_INTNO] = {
1435 <割込み要求ライン1の初期化情
1436å ±>,
1437 <割込み要求ライン2の初期化情
1438å ±>,
1439 ……
1440 <割込み要求ラインTNUM_CFG_INTNOの初期化情
1441å ±>
1442};
1443
1444この中の割込み要求ラインの初期化情
1445報は,次の形式とする.
1446
1447 { (intno), (intatr), (intpri) }
1448
14494.7.3.3 エラー条件
1450
1451割込み要求ラインに関するエラー条件は次の通りである.
1452
1453*パス2で検出するもの
1454・intnoが割込み番号として正しくない場合(E_PAR)[NGKI2972]
1455・intnoがCFG_INTによって設定済みの場合(E_OBJ)[NGKI2976]
1456・intatrが無効の場合(E_RSATR)[NGKI2969]
1457 (TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合)
1458 ※ TAGET_INTATRは,ターゲット依存部で追加する割込み要求ライン属性
1459・intpriがCFG_INTに対する割込み優å…
1460ˆåº¦ã¨ã—て正しくない場合(E_PAR)[NGKI2973ï¼½
1461・カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRIより
1462 も小さい値が指定されなかった場合(E_OBJ)[NGKI2983]
1463・カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRIよりも
1464 小さい値が指定された場合(E_OBJ)[NGKI2984]
1465
1466*必
1467要に応じてターゲット依存部で検出するもの[NGKI2986]
1468・intatrが割込み属性として設定できない値の場合(E_RSATR)[NGKI2985]
1469・intpriが割込み優å…
1470ˆåº¦ã¨ã—て設定できない値の場合(E_PAR)[NGKI2985ï¼½
1471・同一の割込み優å…
1472ˆåº¦ã—か設定できない割込み要求ラインに対して,異なる割
1473 込み優å…
1474ˆåº¦ã‚’設定した場合(E_PAR)[NGKI2985ï¼½
1475
14764.8 CPU例外に関する定義
1477
1478CPU例外に関して生成する情
1479報は,ターゲット毎に定めることができる.ターゲッ
1480ト毎に定めない場合には,以下で述べるターゲットに依存しない標準的な情
1481å ±
1482を生成する.
1483
1484システムコンフィギュレーションファイル中に,CPU例外ハンドラを定義する
1485静的API「DEF_EXC」が含まれている場合に,CPU例外ハンドラに関する定義を
1486生成する.
1487
1488以下では,システムコンフィギュレーションファイルに次の静的APIが含まれ
1489ている時に生成すべき情
1490報について述べる.
1491
1492 DEF_EXC(excno, { excatr, exchdr });
1493
14944.8.1 定義するCPU例外ハンドラの数
1495
1496定義するCPU例外ハンドラの数をマクロ定義するプリプロセッサディレクティブ
1497(#define)を生成する.また,その値を持つ変数の定義を生成する.å…
1498·ä½“的に
1499は,次のような行を生成する.
1500
1501#define TNUM_DEF_EXCNO <定義するCPU例外ハンドラの数>
1502const uint_t _kernel_tnum_def_excno = TNUM_DEF_EXCNO;
1503
15044.8.2 CPU例外ハンドラの出å…
1505¥å£å‡¦ç†
1506
1507定義するCPU例外ハンドラ毎に,CPU例外ハンドラの出å…
1508¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ã‚’生成
1509する.å…
1510·ä½“的には,次のような行を生成する.
1511
1512EXCHDR_ENTRY(excno, excno_num, exchdr)
1513
1514ここでexcno_numは,excno(CPU例外ハンドラ番号)を数値で表現したもので,
1515アセンブリ言語記述に使用するためのものである.
1516
15174.8.3 CPU例外ハンドラ初期化ブロックの定義
1518
1519CPU例外ハンドラ初期化ブロックを生成する.å…
1520·ä½“的には,次のような行を生成
1521する.
1522
1523const EXCINIB _kernel_excinib_table[TNUM_DEF_EXCNO] = {
1524 <CPU例外ハンドラ1の初期化情
1525å ±>,
1526 <CPU例外ハンドラ2の初期化情
1527å ±>,
1528 ……
1529 <CPU例外ハンドラTNUM_DEF_EXCNOの初期化情
1530å ±>
1531};
1532
1533この中のCPU例外ハンドラの初期化情
1534報は,次の形式とする.
1535
1536 { (excno), (excatr), (FP)(EXC_ENTRY(excno, exchdr)) }
1537
15384.8.4 エラー条件
1539
1540CPU例外ハンドラに関するエラー条件は次の通りである.
1541
1542*パス2で検出するもの
1543・excnoがCPU例外ハンドラ番号として正しくない場合(E_PAR)[NGKI3134]
1544・excnoがDEF_EXCによって設定済みの場合(E_OBJ)[NGKI3141]
1545・excatrが無効の場合(E_RSATR)[NGKI3131]
1546 (TARGET_EXCATR以外のビットがセットされている場合)
1547 ※ TAGET_EXCATRは,ターゲット依存部で追加するCPU例外ハンドラ属性
1548
1549*可能であればターゲット依存部で検出するもの[NGKI3149]
1550・exchdrがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3135]
1551
15524.9 非タスクコンテキスト用のスタック領域に関する定義
1553
1554非タスクコンテキスト用のスタック領域に関する定義は,必
1555ず生成しなければ
1556ならない.
1557
15584.9.1 DEF_ICSがない場合
1559
1560システムコンフィギュレーションファイルに,静的API「DEF_ICS」が含まれて
1561いない場合には,次の行を生成する.
1562
1563#ifdef DEFAULT_ISTK
1564
1565#define TOPPERS_ISTKSZ DEFAULT_ISTKSZ
1566#define TOPPERS_ISTK DEFAULT_ISTK
1567
1568#else /* DEFAULT_ISTK */
1569
1570static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];
1571#define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)
1572#define TOPPERS_ISTK _kernel_istack
1573
1574#endif /* DEFAULT_ISTK */
1575
15764.9.2 DEF_ICSがある場合
1577
1578以下では,システムコンフィギュレーションファイルに次の静的APIが含まれて
1579いる時に生成すべき情
1580報について述べる.
1581
1582 DEF_ICS({ istksz, istk });
1583
1584istkがNULLの場合には,指定されたサイズの非タスクコンテキスト用のスタッ
1585ク領域を確保し,非タスクコンテキスト用のスタック領域の初期化情
1586報を生成
1587する.å…
1588·ä½“的には,上記の静的APIに対して,次の行を生成する.
1589
1590static STK_T _kernel_istack[COUNT_STK_T(istksz)];
1591#define TOPPERS_ISTKSZ ROUND_STK_T(istksz)
1592#define TOPPERS_ISTK _kernel_istack
1593
1594istkがNULLでない場合には,非タスクコンテキスト用のスタック領域の初期化
1595情
1596報を,次の形式で生成する.
1597
1598#define TOPPERS_ISTKSZ (istksz)
1599#define TOPPERS_ISTK (istk)
1600
16014.9.3 変数の生成
1602
1603DEF_ICSの有無によらず,次の定義を生成する.
1604
1605const SIZE _kernel_istksz = TOPPERS_ISTKSZ;
1606STK_T *const _kernel_istk = TOPPERS_ISTK;
1607
1608#ifdef TOPPERS_ISTKPT
1609STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);
1610#endif /* TOPPERS_ISTKPT */
1611
16124.9.4 エラー条件
1613
1614非タスクコンテキスト用のスタック領域に関するエラー条件は次の通りである.
1615
1616*パス2で検出するもの
1617・静的API「DEF_ICS」が複数ある(E_OBJ)[NGKI3216]
1618・istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも小
1619 さい場合(E_PAR)[NGKI3254]
1620・istkszがスタック領域のサイズとして正しくない場合(E_PAR)[NGKI3222]
1621 - ターゲット依存の値(CHECK_STKSZ_ALIGN)の倍数でない場合
1622 ※ このエラーチェックは,istkがNULLでない場合にのみ行う
1623
1624*パス3で検出するもの
1625・istkがスタック領域のå…
1626ˆé ­ç•ªåœ°ã¨ã—て正しくない場合(E_PAR)[NGKI3222ï¼½
1627 - ターゲット依存の値(CHECK_STACK_ALIGN)の倍数でない場合
1628 - NULLの場合(ターゲット依存,CHECK_STACK_NONNULL)
1629
16304.10 タイムイベント管理に関する定義
1631
1632タイムイベント管理に関連して,次の定義を生成する.
1633
1634TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];
1635
16364.11 各モジュールの初期化関数の定義
1637
1638各カーネルオブジェクトの管理,割込み管理,CPU例外ハンドラ管理の各機能を
1639初期化関数を順に呼び出す関数(_kernel_initialize_object)を生成する.次
1640の3つの初期化関数を除いては,使用しない機能の初期化関数は呼び出さない.
1641
1642 _kernel_initialize_task
1643 _kernel_initialize_interrupt
1644 _kernel_initialize_exception
1645
1646すべての機能を使った場合に生成される関数は次の通りである.
1647
1648void
1649_kernel_initialize_object(void)
1650{
1651 _kernel_initialize_task();
1652 _kernel_initialize_semaphore();
1653 _kernel_initialize_eventflag();
1654 _kernel_initialize_dataqueue();
1655 _kernel_initialize_pridataq();
1656 _kernel_initialize_mutex();
1657 _kernel_initialize_mempfix();
1658 _kernel_initialize_cyclic();
1659 _kernel_initialize_alarm();
1660 _kernel_initialize_interrupt();
1661 _kernel_initialize_exception();
1662}
1663
16644.12 初期化ルーチンの実行関数の定義
1665
1666システムコンフィギュレーションファイル中に含まれる初期化ルーチンを追加
1667する静的API「ATT_INI」に対して,追加した初期化ルーチンを順に呼び出す関
1668数を生成する.å…
1669·ä½“的には,
1670
1671 ATT_INI({ iniatr, exinf, inirtn });
1672
1673という静的APIに対して,
1674
1675 ((INIRTN)(inirtn))((intptr_t)(exinf));
1676
1677を呼び出す関数を,_kernel_call_inirtnという名前で生成する.初期化ルーチ
1678ンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1679APIの順序に一致させる.
1680
1681例えば,
1682
1683 ATT_INI({ TA_NULL, 0, timer_initialize });
1684 ATT_INI({ TA_NULL, CONSOLE_PORTID, serial_initialize });
1685
1686という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1687る.
1688
1689void
1690_kernel_call_inirtn(void)
1691{
1692 ((INIRTN)(timer_initialize))((intptr_t)(0));
1693 ((INIRTN)(serial_initialize))((intptr_t)(CONSOLE_PORTID));
1694}
1695
16964.12.1 エラー条件
1697
1698初期化ルーチンに関するエラー条件は次の通りである.
1699
1700*パス2で検出するもの
1701・iniatrが無効の場合(E_RSATR)[NGKI3241]
1702 (TA_NULLでない場合)
1703
1704*可能であればターゲット依存部で検出するもの[NGKI3246]
1705・inirtnがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3243]
1706
17074.13 終了処理ルーチンの実行関数の定義
1708
1709システムコンフィギュレーションファイル中に含まれる終了処理ルーチンを追
1710加する静的API「ATT_TER」に対して,追加した終了処理ルーチンを順に呼び出
1711す関数を生成する.å…
1712·ä½“的には,
1713
1714 ATT_TER({ teratr, exinf, terrtn });
1715
1716という静的APIに対して,
1717
1718 ((TERRTN)(terrtn))((intptr_t)(exinf));
1719
1720を呼び出す関数を,_kernel_call_terrtnという名前で生成する.終了処理ルー
1721チンを呼び出す順序は,システムコンフィギュレーションファイル中での静的
1722APIの逆順に一致させる.
1723
1724例えば,
1725
1726 ATT_TER({ TA_NULL, 0, timer_terminate });
1727 ATT_TER({ TA_NULL, CONSOLE_PORTID, serial_terminate });
1728
1729という2つの静的APIがこの順序で記述された時に生成する関数は次の通りであ
1730る.
1731
1732void
1733_kernel_call_terrtn(void)
1734{
1735 ((TERRTN)(serial_terminate))((intptr_t)(CONSOLE_PORTID));
1736 ((TERRTN)(timer_terminate))((intptr_t)(0));
1737}
1738
17394.13.1 エラー条件
1740
1741終了処理ルーチンに関するエラー条件は次の通りである.
1742
1743*パス2で検出するもの
1744・teratrが無効の場合(E_RSATR)[NGKI3248]
1745 (TA_NULLでない場合)
1746
1747*可能であればターゲット依存部で検出するもの[NGKI3253]
1748・terrtnがプログラムの開始番地として正しくない場合(E_PAR)[NGKI3250]
1749
1750以上
Note: See TracBrowser for help on using the repository browser.