source: rtos_arduino/trunk/asp_1.9.2/doc/configurator.txt@ 136

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

ライブラリとOS及びベーシックなサンプルの追加.

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