source: UsbWattMeter/trunk/asp_dcre/kernel/kernel.tf

Last change on this file was 167, checked in by coas-nagasima, 8 years ago

MIMEにSJISを設定

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain; charset=SHIFT_JIS
File size: 44.8 KB
Line 
1$ ======================================================================
2$
3$ TOPPERS/ASP Kernel
4$ Toyohashi Open Platform for Embedded Real-Time Systems/
5$ Advanced Standard Profile Kernel
6$
7$ Copyright (C) 2007 by TAKAGI Nobuhisa
8$ Copyright (C) 2007-2014 by Embedded and Real-Time Systems Laboratory
9$ Graduate School of Information Science, Nagoya Univ., JAPAN
10$
11$ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13$ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16$ スコード中に含まれていること.
17$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18$ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19$ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20$ の無保証規定を掲載すること.
21$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22$ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23$ と.
24$ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
26$ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27$ 報告すること.
28$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29$ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31$ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32$ 免責すること.
33$
34$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38$ の責任を負わない.
39$
40$ $Id: kernel.tf 167 2016-03-08 11:37:45Z coas-nagasima $
41$
42$ =====================================================================
43
44$ =====================================================================
45$ AID_YYYの処理
46$ =====================================================================
47
48$num_atskid = 0$
49$FOREACH i ATSK.ORDER_LIST$
50$ // notskが負の場合(E_PAR)
51 $IF ATSK.NOTSK[i] < 0$
52 $ERROR ATSK.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "notsk", ATSK.NOTSK[i], "AID_TSK")$$END$
53 $END$
54 $num_atskid = num_atskid + ATSK.NOTSK[i]$
55$END$
56$num_tskid = LENGTH(TSK.ID_LIST) + num_atskid$
57
58$num_asemid = 0$
59$FOREACH i ASEM.ORDER_LIST$
60$ // nosemが負の場合(E_PAR)
61 $IF ASEM.NOSEM[i] < 0$
62 $ERROR ASEM.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "nosem", ASEM.NOSEM[i], "AID_SEM")$$END$
63 $END$
64 $num_asemid = num_asemid + ASEM.NOSEM[i]$
65$END$
66$num_semid = LENGTH(SEM.ID_LIST) + num_asemid$
67
68$num_aflgid = 0$
69$FOREACH i AFLG.ORDER_LIST$
70$ // noflgが負の場合(E_PAR)
71 $IF AFLG.NOFLG[i] < 0$
72 $ERROR AFLG.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "noflg", AFLG.NOFLG[i], "AID_FLG")$$END$
73 $END$
74 $num_aflgid = num_aflgid + AFLG.NOFLG[i]$
75$END$
76$num_flgid = LENGTH(FLG.ID_LIST) + num_aflgid$
77
78$num_adtqid = 0$
79$FOREACH i ADTQ.ORDER_LIST$
80$ // nodtqが負の場合(E_PAR)
81 $IF ADTQ.NODTQ[i] < 0$
82 $ERROR ADTQ.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "nodtq", ADTQ.NODTQ[i], "AID_DTQ")$$END$
83 $END$
84 $num_adtqid = num_adtqid + ADTQ.NODTQ[i]$
85$END$
86$num_dtqid = LENGTH(DTQ.ID_LIST) + num_adtqid$
87
88$num_apdqid = 0$
89$FOREACH i APDQ.ORDER_LIST$
90$ // nopdqが負の場合(E_PAR)
91 $IF APDQ.NOPDQ[i] < 0$
92 $ERROR APDQ.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "nopdq", APDQ.NOPDQ[i], "AID_PDQ")$$END$
93 $END$
94 $num_apdqid = num_apdqid + APDQ.NOPDQ[i]$
95$END$
96$num_pdqid = LENGTH(PDQ.ID_LIST) + num_apdqid$
97
98$num_ambxid = 0$
99$FOREACH i AMBX.ORDER_LIST$
100$ // nombxが負の場合(E_PAR)
101 $IF AMBX.NOMBX[i] < 0$
102 $ERROR AMBX.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "nombx", AMBX.NOMBX[i], "AID_MBX")$$END$
103 $END$
104 $num_ambxid = num_ambxid + AMBX.NOMBX[i]$
105$END$
106$num_mbxid = LENGTH(MBX.ID_LIST) + num_ambxid$
107
108$num_ampfid = 0$
109$FOREACH i AMPF.ORDER_LIST$
110$ // nompfが負の場合(E_PAR)
111 $IF AMPF.NOMPF[i] < 0$
112 $ERROR AMPF.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "nompf", AMPF.NOMPF[i], "AID_MPF")$$END$
113 $END$
114 $num_ampfid = num_ampfid + AMPF.NOMPF[i]$
115$END$
116$num_mpfid = LENGTH(MPF.ID_LIST) + num_ampfid$
117
118$num_acycid = 0$
119$FOREACH i ACYC.ORDER_LIST$
120$ // nocycが負の場合(E_PAR)
121 $IF ACYC.NOCYC[i] < 0$
122 $ERROR ACYC.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "nocyc", ACYC.NOCYC[i], "AID_CYC")$$END$
123 $END$
124 $num_acycid = num_acycid + ACYC.NOCYC[i]$
125$END$
126$num_cycid = LENGTH(CYC.ID_LIST) + num_acycid$
127
128$num_aalmid = 0$
129$FOREACH i AALM.ORDER_LIST$
130$ // noalmが負の場合(E_PAR)
131 $IF AALM.NOALM[i] < 0$
132 $ERROR AALM.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "noalm", AALM.NOALM[i], "AID_ALM")$$END$
133 $END$
134 $num_aalmid = num_aalmid + AALM.NOALM[i]$
135$END$
136$num_almid = LENGTH(ALM.ID_LIST) + num_aalmid$
137
138$num_aisrid = 0$
139$FOREACH i AISR.ORDER_LIST$
140$ // noisrが負の場合(E_PAR)
141 $IF AISR.NOISR[i] < 0$
142 $ERROR AISR.TEXT_LINE[i]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "noisr", AISR.NOISR[i], "AID_ISR")$$END$
143 $END$
144 $num_aisrid = num_aisrid + AISR.NOISR[i]$
145$END$
146$num_isrid = num_aisrid$
147$num_isr = LENGTH(ISR.ORDER_LIST) + num_aisrid$
148
149$ =====================================================================
150$ kernel_cfg.hの生成
151$ =====================================================================
152
153$FILE "kernel_cfg.h"$
154/* kernel_cfg.h */$NL$
155#ifndef TOPPERS_KERNEL_CFG_H$NL$
156#define TOPPERS_KERNEL_CFG_H$NL$
157$NL$
158#define TNUM_TSKID $num_tskid$$NL$
159#define TNUM_SEMID $num_semid$$NL$
160#define TNUM_FLGID $num_flgid$$NL$
161#define TNUM_DTQID $num_dtqid$$NL$
162#define TNUM_PDQID $num_pdqid$$NL$
163#define TNUM_MBXID $num_mbxid$$NL$
164#define TNUM_MPFID $num_mpfid$$NL$
165#define TNUM_CYCID $num_cycid$$NL$
166#define TNUM_ALMID $num_almid$$NL$
167#define TNUM_ISRID $num_isrid$$NL$
168$NL$
169$FOREACH id TSK.ID_LIST$
170 #define $id$ $+id$$NL$
171$END$
172$FOREACH id SEM.ID_LIST$
173 #define $id$ $+id$$NL$
174$END$
175$FOREACH id FLG.ID_LIST$
176 #define $id$ $+id$$NL$
177$END$
178$FOREACH id DTQ.ID_LIST$
179 #define $id$ $+id$$NL$
180$END$
181$FOREACH id PDQ.ID_LIST$
182 #define $id$ $+id$$NL$
183$END$
184$FOREACH id MBX.ID_LIST$
185 #define $id$ $+id$$NL$
186$END$
187$FOREACH id MPF.ID_LIST$
188 #define $id$ $+id$$NL$
189$END$
190$FOREACH id CYC.ID_LIST$
191 #define $id$ $+id$$NL$
192$END$
193$FOREACH id ALM.ID_LIST$
194 #define $id$ $+id$$NL$
195$END$
196$NL$
197#endif /* TOPPERS_KERNEL_CFG_H */$NL$
198
199$ =====================================================================
200$ kernel_cfg.cの生成
201$ =====================================================================
202
203$FILE "kernel_cfg.c"$
204/* kernel_cfg.c */$NL$
205#include "kernel/kernel_int.h"$NL$
206#include "kernel_cfg.h"$NL$
207$NL$
208#if TKERNEL_PRID != 0x07u$NL$
209#error The kernel does not match this configuration file.$NL$
210#endif$NL$
211$NL$
212
213$
214$ インクルードディレクティブ(#include)
215$
216/*$NL$
217$SPC$* Include Directives (#include)$NL$
218$SPC$*/$NL$
219$NL$
220$INCLUDES$
221$NL$
222
223$
224$ オブジェクトのID番号を保持する変数
225$
226$IF USE_EXTERNAL_ID$
227 /*$NL$
228 $SPC$* Variables for Object ID$NL$
229 $SPC$*/$NL$
230 $NL$
231 $FOREACH id TSK.ID_LIST$
232 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
233 $END$
234 $FOREACH id SEM.ID_LIST$
235 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
236 $END$
237 $FOREACH id FLG.ID_LIST$
238 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
239 $END$
240 $FOREACH id DTQ.ID_LIST$
241 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
242 $END$
243 $FOREACH id PDQ.ID_LIST$
244 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
245 $END$
246 $FOREACH id MBX.ID_LIST$
247 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
248 $END$
249 $FOREACH id MPF.ID_LIST$
250 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
251 $END$
252 $FOREACH id CYC.ID_LIST$
253 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
254 $END$
255 $FOREACH id ALM.ID_LIST$
256 const ID $id$_id$SPC$=$SPC$$+id$;$NL$
257 $END$
258$END$
259
260$
261$ タスク
262$
263/*$NL$
264$SPC$* Task Management Functions$NL$
265$SPC$*/$NL$
266$NL$
267
268$ 静的に生成されたタスクが1個以上存在することのチェック
269$IF !LENGTH(TSK.ID_LIST)$
270 $ERROR$$FORMAT(_("no task is registered"))$$END$
271$END$
272
273$ 静的に生成されたタスクの数
274#define TNUM_STSKID $LENGTH(TSK.ID_LIST)$$NL$
275$NL$
276
277$ タスクID番号の最大値
278const ID _kernel_tmax_tskid = (TMIN_TSKID + TNUM_TSKID - 1);$NL$
279const ID _kernel_tmax_stskid = (TMIN_TSKID + TNUM_STSKID - 1);$NL$
280$NL$
281
282$ エラーチェック
283$FOREACH tskid TSK.ID_LIST$
284$ // tskatrが([TA_ACT])でない場合(E_RSATR)
285 $IF (TSK.TSKATR[tskid] & ~(TA_ACT|TARGET_TSKATR)) != 0$
286 $ERROR TSK.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "tskatr", TSK.TSKATR[tskid], tskid, "CRE_TSK")$$END$
287 $END$
288
289$ // (TMIN_TPRI <= itskpri && itskpri <= TMAX_TPRI)でない場合(E_PAR)
290 $IF !(TMIN_TPRI <= TSK.ITSKPRI[tskid] && TSK.ITSKPRI[tskid] <= TMAX_TPRI)$
291 $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "itskpri", TSK.ITSKPRI[tskid], tskid, "CRE_TSK")$$END$
292 $END$
293
294$ // texatrが(TA_NULL)でない場合(E_RSATR)
295 $IF LENGTH(TSK.TEXATR[tskid]) && TSK.TEXATR[tskid] != 0$
296 $ERROR DEF_TEX.TEXT_LINE[tskid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "texatr", TSK.TEXATR[tskid], tskid, "DEF_TEX")$$END$
297 $END$
298$END$
299
300$ スタック領域の生成とそれに関するエラーチェック
301$FOREACH tskid TSK.ID_LIST$
302$ // stkszが0以下か,ターゲット定義の最小値(TARGET_MIN_STKSZ)よりも
303$ // 小さい場合(E_PAR)
304 $IF TSK.STKSZ[tskid] <= 0 || (TARGET_MIN_STKSZ
305 && TSK.STKSZ[tskid] < TARGET_MIN_STKSZ)$
306 $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is too small"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
307 $END$
308
309$ // stkszがスタック領域のサイズとして正しくない場合(E_PAR)
310 $IF !EQ(TSK.STK[tskid], "NULL") && CHECK_STKSZ_ALIGN
311 && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
312 $ERROR TSK.TEXT_LINE[tskid]$E_PAR: $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"), "stksz", TSK.STKSZ[tskid], tskid, "CRE_TSK")$$END$
313 $END$
314
315 $IF EQ(TSK.STK[tskid],"NULL")$
316 static STK_T _kernel_stack_$tskid$[COUNT_STK_T($TSK.STKSZ[tskid]$)];$NL$
317 $TSK.TINIB_STKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", TSK.STKSZ[tskid])$
318 $TSK.TINIB_STK[tskid] = CONCAT("_kernel_stack_", tskid)$
319 $ELSE$
320 $TSK.TINIB_STKSZ[tskid] = TSK.STKSZ[tskid]$
321 $TSK.TINIB_STK[tskid] = FORMAT("(void *)(%1%)", TSK.STK[tskid])$
322 $END$
323$END$
324$NL$
325
326$ タスク初期化ブロックの生成(タスクは1個以上存在する)
327const TINIB _kernel_tinib_table[TNUM_STSKID] = {$NL$
328$JOINEACH tskid TSK.ID_LIST ",\n"$
329$ // タスク属性,拡張情報,起動番地,起動時優先度
330 $TAB${
331 $SPC$($TSK.TSKATR[tskid]$), (intptr_t)($TSK.EXINF[tskid]$),
332 $SPC$((TASK)($TSK.TASK[tskid]$)), INT_PRIORITY($TSK.ITSKPRI[tskid]$),
333
334$ // タスク初期化コンテキストブロック,スタック領域
335 $IF USE_TSKINICTXB$
336 $GENERATE_TSKINICTXB(tskid)$
337 $ELSE$
338 $SPC$$TSK.TINIB_STKSZ[tskid]$, $TSK.TINIB_STK[tskid]$,
339 $END$
340
341$ // タスク例外処理ルーチンの属性と起動番地
342 $SPC$($ALT(TSK.TEXATR[tskid],"TA_NULL")$), ($ALT(TSK.TEXRTN[tskid],"NULL")$) }
343$END$$NL$
344};$NL$
345$NL$
346
347$ 動的生成タスク用のタスク初期化ブロックの生成
348$IF num_atskid > 0$
349 TINIB _kernel_atinib_table[$num_atskid$];$NL$
350$ELSE$
351 TOPPERS_EMPTY_LABEL(TINIB, _kernel_atinib_table);$NL$
352$END$$NL$
353
354$ タスク管理ブロックの生成
355TCB _kernel_tcb_table[TNUM_TSKID];$NL$
356$NL$
357
358$ タスク生成順序テーブルの生成
359const ID _kernel_torder_table[TNUM_STSKID] = {$NL$
360$TAB$$JOINEACH tskid TSK.ORDER_LIST ", "$$tskid$$END$$NL$
361};$NL$
362$NL$
363
364$
365$ セマフォ
366$
367/*$NL$
368$SPC$* Semaphore Functions$NL$
369$SPC$*/$NL$
370$NL$
371
372$ 静的に生成されたセマフォの数
373#define TNUM_SSEMID $LENGTH(SEM.ID_LIST)$$NL$
374$NL$
375
376$ セマフォID番号の最大値
377const ID _kernel_tmax_semid = (TMIN_SEMID + TNUM_SEMID - 1);$NL$
378const ID _kernel_tmax_ssemid = (TMIN_SEMID + TNUM_SSEMID - 1);$NL$
379$NL$
380
381$ セマフォ初期化ブロックの生成
382$IF LENGTH(SEM.ID_LIST)$
383 const SEMINIB _kernel_seminib_table[TNUM_SSEMID] = {$NL$
384 $JOINEACH semid SEM.ID_LIST ",\n"$
385$ // sematrが([TA_TPRI])でない場合(E_RSATR)
386 $IF (SEM.SEMATR[semid] & ~TA_TPRI) != 0$
387 $ERROR SEM.TEXT_LINE[semid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "sematr", SEM.SEMATR[semid], semid, "CRE_SEM")$$END$
388 $END$
389
390$ // (0 <= isemcnt && isemcnt <= maxsem)でない場合(E_PAR)
391 $IF !(0 <= SEM.ISEMCNT[semid] && SEM.ISEMCNT[semid] <= SEM.MAXSEM[semid])$
392 $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("too large %1% `%2%\' of `%3%\' in %4%"), "isemcnt", SEM.ISEMCNT[semid], semid, "CRE_SEM")$$END$
393 $END$
394
395$ // (1 <= maxsem && maxsem <= TMAX_MAXSEM)でない場合(E_PAR)
396 $IF !(1 <= SEM.MAXSEM[semid] && SEM.MAXSEM[semid] <= TMAX_MAXSEM)$
397 $ERROR SEM.TEXT_LINE[semid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxsem", SEM.MAXSEM[semid], semid, "CRE_SEM")$$END$
398 $END$
399
400$ // セマフォ初期化ブロック
401 $TAB${ ($SEM.SEMATR[semid]$), ($SEM.ISEMCNT[semid]$), ($SEM.MAXSEM[semid]$) }
402 $END$$NL$
403 };$NL$
404$ELSE$
405 TOPPERS_EMPTY_LABEL(const SEMINIB, _kernel_seminib_table);$NL$
406$END$$NL$
407
408$ 動的生成セマフォ用のセマフォ初期化ブロックの生成
409$IF num_asemid > 0$
410 SEMINIB _kernel_aseminib_table[$num_asemid$];$NL$
411$ELSE$
412 TOPPERS_EMPTY_LABEL(SEMINIB, _kernel_aseminib_table);$NL$
413$END$$NL$
414
415$ セマフォ管理ブロックの生成
416$IF num_semid > 0$
417 SEMCB _kernel_semcb_table[TNUM_SEMID];$NL$
418$ELSE$
419 TOPPERS_EMPTY_LABEL(SEMCB, _kernel_semcb_table);$NL$
420$END$$NL$
421
422$
423$ イベントフラグ
424$
425/*$NL$
426$SPC$* Eventflag Functions$NL$
427$SPC$*/$NL$
428$NL$
429
430$ 静的に生成されたイベントフラグの数
431#define TNUM_SFLGID $LENGTH(FLG.ID_LIST)$$NL$
432$NL$
433
434$ イベントフラグID番号の最大値
435const ID _kernel_tmax_flgid = (TMIN_FLGID + TNUM_FLGID - 1);$NL$
436const ID _kernel_tmax_sflgid = (TMIN_FLGID + TNUM_SFLGID - 1);$NL$
437$NL$
438
439$ イベントフラグ初期化ブロックの生成
440$IF LENGTH(FLG.ID_LIST)$
441 const FLGINIB _kernel_flginib_table[TNUM_SFLGID] = {$NL$
442 $JOINEACH flgid FLG.ID_LIST ",\n"$
443$ // flgatrが([TA_TPRI]|[TA_WMUL]|[TA_CLR])でない場合(E_RSATR)
444 $IF (FLG.FLGATR[flgid] & ~(TA_TPRI|TA_WMUL|TA_CLR)) != 0$
445 $ERROR FLG.TEXT_LINE[flgid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "flgatr", FLG.FLGATR[flgid], flgid, "CRE_FLG")$$END$
446 $END$
447
448$ // iflgptnがFLGPTNに格納できない場合(E_PAR)
449 $IF (FLG.IFLGPTN[flgid] & ~((1 << TBIT_FLGPTN) - 1)) != 0$
450 $ERROR FLG.TEXT_LINE[flgid]$E_PAR: $FORMAT(_("too large %1% `%2%\' of `%3%\' in %4%"), "iflgptn", FLG.IFLGPTN[flgid], flgid, "CRE_FLG")$$END$
451 $END$
452
453$ // イベントフラグ初期化ブロック
454 $TAB${ ($FLG.FLGATR[flgid]$), ($FLG.IFLGPTN[flgid]$) }
455 $END$$NL$
456 };$NL$
457$ELSE$
458 TOPPERS_EMPTY_LABEL(const FLGINIB, _kernel_flginib_table);$NL$
459$END$$NL$
460
461$ 動的生成イベントフラグ用のイベントフラグ初期化ブロックの生成
462$IF num_aflgid > 0$
463 FLGINIB _kernel_aflginib_table[$num_aflgid$];$NL$
464$ELSE$
465 TOPPERS_EMPTY_LABEL(FLGINIB, _kernel_aflginib_table);$NL$
466$END$$NL$
467
468$ イベントフラグ管理ブロックの生成
469$IF num_flgid > 0$
470 FLGCB _kernel_flgcb_table[TNUM_FLGID];$NL$
471$ELSE$
472 TOPPERS_EMPTY_LABEL(FLGCB, _kernel_flgcb_table);$NL$
473$END$$NL$
474
475$
476$ データキュー
477$
478/*$NL$
479$SPC$* Dataqueue Functions$NL$
480$SPC$*/$NL$
481$NL$
482
483$ 静的に生成されたデータキューの数
484#define TNUM_SDTQID $LENGTH(DTQ.ID_LIST)$$NL$
485$NL$
486
487$ データキューID番号の最大値
488const ID _kernel_tmax_dtqid = (TMIN_DTQID + TNUM_DTQID - 1);$NL$
489const ID _kernel_tmax_sdtqid = (TMIN_DTQID + TNUM_SDTQID - 1);$NL$
490$NL$
491
492$IF LENGTH(DTQ.ID_LIST)$
493 $FOREACH dtqid DTQ.ID_LIST$
494$ // dtqatrが([TA_TPRI])でない場合(E_RSATR)
495 $IF (DTQ.DTQATR[dtqid] & ~TA_TPRI) != 0$
496 $ERROR DTQ.TEXT_LINE[dtqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqatr", DTQ.DTQATR[dtqid], dtqid, "CRE_DTQ")$$END$
497 $END$
498
499$ // dtqcntが負の場合(E_PAR)
500 $IF DTQ.DTQCNT[dtqid] < 0$
501 $ERROR DTQ.TEXT_LINE[dtqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqcnt", DTQ.DTQCNT[dtqid], dtqid, "CRE_DTQ")$$END$
502 $END$
503
504$ // dtqmbがNULLでない場合(E_NOSPT)
505 $IF !EQ(DTQ.DTQMB[dtqid], "NULL")$
506 $ERROR DTQ.TEXT_LINE[dtqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "dtqmb", DTQ.DTQMB[dtqid], dtqid, "CRE_DTQ")$$END$
507 $END$
508
509$ // データキュー管理領域
510 $IF DTQ.DTQCNT[dtqid]$
511 static DTQMB _kernel_dtqmb_$dtqid$[$DTQ.DTQCNT[dtqid]$];$NL$
512 $END$
513 $END$
514
515$ // データキュー初期化ブロックの生成
516 const DTQINIB _kernel_dtqinib_table[TNUM_SDTQID] = {$NL$
517 $JOINEACH dtqid DTQ.ID_LIST ",\n"$
518 $TAB${ ($DTQ.DTQATR[dtqid]$), ($DTQ.DTQCNT[dtqid]$), $IF DTQ.DTQCNT[dtqid]$(_kernel_dtqmb_$dtqid$)$ELSE$NULL$END$ }
519 $END$$NL$
520 };$NL$
521$ELSE$
522 TOPPERS_EMPTY_LABEL(const DTQINIB, _kernel_dtqinib_table);$NL$
523$END$$NL$
524
525$ 動的生成データキュー用のデータキュー初期化ブロックの生成
526$IF num_adtqid > 0$
527 DTQINIB _kernel_adtqinib_table[$num_adtqid$];$NL$
528$ELSE$
529 TOPPERS_EMPTY_LABEL(DTQINIB, _kernel_adtqinib_table);$NL$
530$END$$NL$
531
532$ データキュー管理ブロックの生成
533$IF num_dtqid > 0$
534 DTQCB _kernel_dtqcb_table[TNUM_DTQID];$NL$
535$ELSE$
536 TOPPERS_EMPTY_LABEL(DTQCB, _kernel_dtqcb_table);$NL$
537$END$$NL$
538
539$
540$ 優先度データキュー
541$
542/*$NL$
543$SPC$* Priority Dataqueue Functions$NL$
544$SPC$*/$NL$
545$NL$
546
547$ 静的に生成された優先度データキューの数
548#define TNUM_SPDQID $LENGTH(PDQ.ID_LIST)$$NL$
549$NL$
550
551$ 優先度データキューID番号の最大値
552const ID _kernel_tmax_pdqid = (TMIN_PDQID + TNUM_PDQID - 1);$NL$
553const ID _kernel_tmax_spdqid = (TMIN_PDQID + TNUM_SPDQID - 1);$NL$
554$NL$
555
556$IF LENGTH(PDQ.ID_LIST)$
557 $FOREACH pdqid PDQ.ID_LIST$
558$ // pdqatrが([TA_TPRI])でない場合(E_RSATR)
559 $IF (PDQ.PDQATR[pdqid] & ~TA_TPRI) != 0$
560 $ERROR PDQ.TEXT_LINE[pdqid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqatr", PDQ.PDQATR[pdqid], pdqid, "CRE_PDQ")$$END$
561 $END$
562
563$ // pdqcntが負の場合(E_PAR)
564 $IF PDQ.PDQCNT[pdqid] < 0$
565 $ERROR PDQ.TEXT_LINE[pdqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqcnt", PDQ.PDQCNT[pdqid], pdqid, "CRE_PDQ")$$END$
566 $END$
567
568$ // (TMIN_DPRI <= maxdpri && maxdpri <= TMAX_DPRI)でない場合(E_PAR)
569 $IF !(TMIN_DPRI <= PDQ.MAXDPRI[pdqid] && PDQ.MAXDPRI[pdqid] <= TMAX_DPRI)$
570 $ERROR PDQ.TEXT_LINE[pdqid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxdpri", PDQ.MAXDPRI[pdqid], pdqid, "CRE_PDQ")$$END$
571 $END$
572
573$ // pdqmbがNULLでない場合(E_NOSPT)
574 $IF !EQ(PDQ.PDQMB[pdqid], "NULL")$
575 $ERROR PDQ.TEXT_LINE[pdqid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "pdqmb", PDQ.PDQMB[pdqid], pdqid, "CRE_PDQ")$$END$
576 $END$
577
578$ // 優先度データキュー管理領域
579 $IF PDQ.PDQCNT[pdqid]$
580 static PDQMB _kernel_pdqmb_$pdqid$[$PDQ.PDQCNT[pdqid]$];$NL$
581 $END$
582 $END$
583
584$ // 優先度データキュー初期化ブロックの生成
585 const PDQINIB _kernel_pdqinib_table[TNUM_SPDQID] = {$NL$
586 $JOINEACH pdqid PDQ.ID_LIST ",\n"$
587 $TAB${ ($PDQ.PDQATR[pdqid]$), ($PDQ.PDQCNT[pdqid]$), ($PDQ.MAXDPRI[pdqid]$), $IF PDQ.PDQCNT[pdqid]$(_kernel_pdqmb_$pdqid$)$ELSE$NULL$END$ }
588 $END$$NL$
589 };$NL$
590$ELSE$
591 TOPPERS_EMPTY_LABEL(const PDQINIB, _kernel_pdqinib_table);$NL$
592$END$$NL$
593
594$ 動的生成優先度データキュー用の優先度データキュー初期化ブロックの生成
595$IF num_apdqid > 0$
596 PDQINIB _kernel_apdqinib_table[$num_apdqid$];$NL$
597$ELSE$
598 TOPPERS_EMPTY_LABEL(PDQINIB, _kernel_apdqinib_table);$NL$
599$END$$NL$
600
601$ 優先度データキュー管理ブロックの生成
602$IF num_pdqid > 0$
603 PDQCB _kernel_pdqcb_table[TNUM_PDQID];$NL$
604$ELSE$
605 TOPPERS_EMPTY_LABEL(PDQCB, _kernel_pdqcb_table);$NL$
606$END$$NL$
607
608$
609$ メールボックス
610$
611/*$NL$
612$SPC$* Mailbox Functions$NL$
613$SPC$*/$NL$
614$NL$
615
616$ 静的に生成されたメールボックスの数
617#define TNUM_SMBXID $LENGTH(MBX.ID_LIST)$$NL$
618$NL$
619
620$ メールボックスID番号の最大値
621const ID _kernel_tmax_mbxid = (TMIN_MBXID + TNUM_MBXID - 1);$NL$
622const ID _kernel_tmax_smbxid = (TMIN_MBXID + TNUM_SMBXID - 1);$NL$
623$NL$
624
625$ メールボックス初期化ブロックの生成
626$IF LENGTH(MBX.ID_LIST)$
627 const MBXINIB _kernel_mbxinib_table[TNUM_SMBXID] = {$NL$
628 $JOINEACH mbxid MBX.ID_LIST ",\n"$
629$ // mbxatrが([TA_TPRI]|[TA_MPRI])でない場合(E_RSATR)
630 $IF (MBX.MBXATR[mbxid] & ~(TA_TPRI|TA_MPRI)) != 0$
631 $ERROR MBX.TEXT_LINE[mbxid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mbxatr", MBX.MBXATR[mbxid], mbxid, "CRE_MBX")$$END$
632 $END$
633
634$ // (TMIN_MPRI <= maxmpri && maxmpri <= TMAX_MPRI)でない場合(E_PAR)
635 $IF !(TMIN_MPRI <= MBX.MAXMPRI[mbxid] && MBX.MAXMPRI[mbxid] <= TMAX_MPRI)$
636 $ERROR MBX.TEXT_LINE[mbxid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "maxmpri", MBX.MAXMPRI[mbxid], mbxid, "CRE_MBX")$$END$
637 $END$
638
639$ // mprihdがNULLでない場合(E_NOSPT)
640 $IF !EQ(MBX.MPRIHD[mbxid], "NULL")$
641 $ERROR MBX.TEXT_LINE[mbxid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mprihd", MBX.MPRIHD[mbxid], mbxid, "CRE_MBX")$$END$
642 $END$
643
644$ // メールボックス初期化ブロック
645 $TAB${ ($MBX.MBXATR[mbxid]$), ($MBX.MAXMPRI[mbxid]$) }
646 $END$$NL$
647 };$NL$
648$ELSE$
649 TOPPERS_EMPTY_LABEL(const MBXINIB, _kernel_mbxinib_table);$NL$
650$END$$NL$
651
652$ 動的生成メールボックス用のメールボックス初期化ブロックの生成
653$IF num_ambxid > 0$
654 MBXINIB _kernel_ambxinib_table[$num_ambxid$];$NL$
655$ELSE$
656 TOPPERS_EMPTY_LABEL(MBXINIB, _kernel_ambxinib_table);$NL$
657$END$$NL$
658
659$ メールボックス管理ブロックの生成
660$IF num_mbxid > 0$
661 MBXCB _kernel_mbxcb_table[TNUM_MBXID];$NL$
662$ELSE$
663 TOPPERS_EMPTY_LABEL(MBXCB, _kernel_mbxcb_table);$NL$
664$END$$NL$
665
666$
667$ 固定長メモリプール
668$
669/*$NL$
670$SPC$* Fixed-sized Memorypool Functions$NL$
671$SPC$*/$NL$
672$NL$
673
674$ 静的に生成された固定長メモリプールの数
675#define TNUM_SMPFID $LENGTH(MPF.ID_LIST)$$NL$
676$NL$
677
678$ 固定長メモリプールID番号の最大値
679const ID _kernel_tmax_mpfid = (TMIN_MPFID + TNUM_MPFID - 1);$NL$
680const ID _kernel_tmax_smpfid = (TMIN_MPFID + TNUM_SMPFID - 1);$NL$
681$NL$
682
683$IF LENGTH(MPF.ID_LIST)$
684 $FOREACH mpfid MPF.ID_LIST$
685$ // mpfatrが([TA_TPRI])でない場合(E_RSATR)
686 $IF (MPF.MPFATR[mpfid] & ~TA_TPRI) != 0$
687 $ERROR MPF.TEXT_LINE[mpfid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfatr", MPF.MPFATR[mpfid], mpfid, "CRE_MPF")$$END$
688 $END$
689
690$ // blkcntが0以下の場合(E_PAR)
691 $IF MPF.BLKCNT[mpfid] <= 0$
692 $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blkcnt", MPF.BLKCNT[mpfid], mpfid, "CRE_MPF")$$END$
693 $END$
694
695$ // blkszが0以下の場合(E_PAR)
696 $IF MPF.BLKSZ[mpfid] <= 0$
697 $ERROR MPF.TEXT_LINE[mpfid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "blksz", MPF.BLKSZ[mpfid], mpfid, "CRE_MPF")$$END$
698 $END$
699
700$ // 固定長メモリプール領域
701 $IF EQ(MPF.MPF[mpfid], "NULL")$
702 static MPF_T _kernel_mpf_$mpfid$[($MPF.BLKCNT[mpfid]$) * COUNT_MPF_T($MPF.BLKSZ[mpfid]$)];$NL$
703 $END$
704
705$ // mpfmbがNULLでない場合(E_NOSPT)
706 $IF !EQ(MPF.MPFMB[mpfid], "NULL")$
707 $ERROR MPF.TEXT_LINE[mpfid]$E_NOSPT: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "mpfmb", MPF.MPFMB[mpfid], mpfid, "CRE_MPF")$$END$
708 $END$
709
710$ // 固定長メモリプール管理領域
711 static MPFMB _kernel_mpfmb_$mpfid$[$MPF.BLKCNT[mpfid]$];$NL$
712 $END$
713
714$ // 固定長メモリプール初期化ブロックの生成
715 const MPFINIB _kernel_mpfinib_table[TNUM_SMPFID] = {$NL$
716 $JOINEACH mpfid MPF.ID_LIST ",\n"$
717 $TAB${ ($MPF.MPFATR[mpfid]$), ($MPF.BLKCNT[mpfid]$), ROUND_MPF_T($MPF.BLKSZ[mpfid]$), $IF EQ(MPF.MPF[mpfid],"NULL")$(_kernel_mpf_$mpfid$)$ELSE$(void *)($MPF.MPF[mpfid]$)$END$, (_kernel_mpfmb_$mpfid$) }
718 $END$$NL$
719 };$NL$
720$ELSE$
721 TOPPERS_EMPTY_LABEL(const MPFINIB, _kernel_mpfinib_table);$NL$
722$END$$NL$
723
724$ 動的生成固定長メモリプール用の固定長メモリプール初期化ブロックの生成
725$IF num_ampfid > 0$
726 MPFINIB _kernel_ampfinib_table[$num_ampfid$];$NL$
727$ELSE$
728 TOPPERS_EMPTY_LABEL(MPFINIB, _kernel_ampfinib_table);$NL$
729$END$$NL$
730
731$ 固定長メモリプール管理ブロックの生成
732$IF num_mpfid > 0$
733 MPFCB _kernel_mpfcb_table[TNUM_MPFID];$NL$
734$ELSE$
735 TOPPERS_EMPTY_LABEL(MPFCB, _kernel_mpfcb_table);$NL$
736$END$$NL$
737
738$
739$ 周期ハンドラ
740$
741/*$NL$
742$SPC$* Cyclic Handler Functions$NL$
743$SPC$*/$NL$
744$NL$
745
746$ 静的に生成された周期ハンドラの数
747#define TNUM_SCYCID $LENGTH(CYC.ID_LIST)$$NL$
748$NL$
749
750$ 周期ハンドラID番号の最大値
751const ID _kernel_tmax_cycid = (TMIN_CYCID + TNUM_CYCID - 1);$NL$
752const ID _kernel_tmax_scycid = (TMIN_CYCID + TNUM_SCYCID - 1);$NL$
753$NL$
754
755$ 周期ハンドラ初期化テーブルの生成
756$IF LENGTH(CYC.ID_LIST)$
757 const CYCINIB _kernel_cycinib_table[TNUM_SCYCID] = {$NL$
758 $JOINEACH cycid CYC.ID_LIST ",\n"$
759$ // cycatrが([TA_STA])でない場合(E_RSATR)
760 $IF (CYC.CYCATR[cycid] & ~TA_STA) != 0$
761 $ERROR CYC.TEXT_LINE[cycid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycatr", CYC.CYCATR[cycid], cycid, "CRE_CYC")$$END$
762 $END$
763
764$ // (0 < cyctim && cyctim <= TMAX_RELTIM)でない場合(E_PAR)
765 $IF !(0 < CYC.CYCTIM[cycid] && CYC.CYCTIM[cycid] <= TMAX_RELTIM)$
766 $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cyctim", CYC.CYCTIM[cycid], cycid, "CRE_CYC")$$END$
767 $END$
768
769$ // (0 <= cycphs && cycphs <= TMAX_RELTIM)でない場合(E_PAR)
770 $IF !(0 <= CYC.CYCPHS[cycid] && CYC.CYCPHS[cycid] <= TMAX_RELTIM)$
771 $ERROR CYC.TEXT_LINE[cycid]$E_PAR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "cycphs", CYC.CYCPHS[cycid], cycid, "CRE_CYC")$$END$
772 $END$
773
774$ // 警告:cycatrにTA_STAが設定されていて,(cycphs == 0)の場合
775 $IF (CYC.CYCATR[cycid] & TA_STA) != 0 && CYC.CYCPHS[cycid] == 0$
776 $WARNING CYC.TEXT_LINE[cycid]$$FORMAT(_("%1% is not recommended when %2% is set to %3% in %4%"), "cycphs==0", "TA_STA", "cycatr", "CRE_CYC")$$END$
777 $END$
778
779$ // 周期ハンドラ初期化ブロック
780 $TAB${ ($CYC.CYCATR[cycid]$), (intptr_t)($CYC.EXINF[cycid]$), ($CYC.CYCHDR[cycid]$), ($CYC.CYCTIM[cycid]$), ($CYC.CYCPHS[cycid]$) }
781 $END$$NL$
782 };$NL$
783$ELSE$
784 TOPPERS_EMPTY_LABEL(const CYCINIB, _kernel_cycinib_table);$NL$
785$END$$NL$
786
787$ 動的生成周期ハンドラ用の周期ハンドラ初期化ブロックの生成
788$IF num_acycid > 0$
789 CYCINIB _kernel_acycinib_table[$num_acycid$];$NL$
790$ELSE$
791 TOPPERS_EMPTY_LABEL(CYCINIB, _kernel_acycinib_table);$NL$
792$END$$NL$
793
794$ 周期ハンドラ管理ブロックの生成
795$IF num_cycid > 0$
796 CYCCB _kernel_cyccb_table[TNUM_CYCID];$NL$
797$ELSE$
798 TOPPERS_EMPTY_LABEL(CYCCB, _kernel_cyccb_table);$NL$
799$END$$NL$
800
801$
802$ アラームハンドラ
803$
804/*$NL$
805$SPC$* Alarm Handler Functions$NL$
806$SPC$*/$NL$
807$NL$
808
809$ 静的に生成されたアラームハンドラの数
810#define TNUM_SALMID $LENGTH(ALM.ID_LIST)$$NL$
811$NL$
812
813$ アラームハンドラID番号の最大値
814const ID _kernel_tmax_almid = (TMIN_ALMID + TNUM_ALMID - 1);$NL$
815const ID _kernel_tmax_salmid = (TMIN_ALMID + TNUM_SALMID - 1);$NL$
816$NL$
817
818$ アラームハンドラ初期化ブロックの生成
819$IF LENGTH(ALM.ID_LIST)$
820 const ALMINIB _kernel_alminib_table[TNUM_SALMID] = {$NL$
821 $JOINEACH almid ALM.ID_LIST ",\n"$
822$ // almatrが(TA_NULL)でない場合(E_RSATR)
823 $IF ALM.ALMATR[almid] != 0$
824 $ERROR ALM.TEXT_LINE[almid]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of `%3%\' in %4%"), "almatr", ALM.ALMATR[almid], almid, "CRE_ALM")$$END$
825 $END$
826
827$ // アラームハンドラ初期化ブロック
828 $TAB${ ($ALM.ALMATR[almid]$), (intptr_t)($ALM.EXINF[almid]$), ($ALM.ALMHDR[almid]$) }
829 $END$$NL$
830 };$NL$
831$ELSE$
832 TOPPERS_EMPTY_LABEL(const ALMINIB, _kernel_alminib_table);$NL$
833$END$$NL$
834
835$ 動的生成アラームハンドラ用のアラームハンドラ初期化ブロックの生成
836$IF num_aalmid > 0$
837 ALMINIB _kernel_aalminib_table[$num_aalmid$];$NL$
838$ELSE$
839 TOPPERS_EMPTY_LABEL(ALMINIB, _kernel_aalminib_table);$NL$
840$END$$NL$
841
842$ アラームハンドラ管理ブロックの生成
843$IF num_almid > 0$
844 ALMCB _kernel_almcb_table[TNUM_ALMID];$NL$
845$ELSE$
846 TOPPERS_EMPTY_LABEL(ALMCB, _kernel_almcb_table);$NL$
847$END$$NL$
848
849$
850$ 割込み管理機能
851$
852/*$NL$
853$SPC$* Interrupt Management Functions$NL$
854$SPC$*/$NL$
855$NL$
856
857$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
858$IF LENGTH(INTNO_ATTISR_VALID) != LENGTH(INHNO_ATTISR_VALID)$
859 $ERROR$length of `INTNO_ATTISR_VALID' is different from length of `INHNO_ATTISR_VALID'$END$
860$END$
861$i = 0$
862$FOREACH intno INTNO_ATTISR_VALID$
863 $inhno = AT(INHNO_ATTISR_VALID, i)$
864 $INHNO[intno] = inhno$
865 $INTNO[inhno] = intno$
866 $i = i + 1$
867$END$
868
869$ 割込み要求ラインに関するエラーチェック
870$i = 0$
871$FOREACH intno INT.ORDER_LIST$
872$ // intnoがCFG_INTに対する割込み番号として正しくない場合(E_PAR)
873 $IF !LENGTH(FIND(INTNO_CFGINT_VALID, INT.INTNO[intno]))$
874 $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
875 $END$
876
877$ // intnoがCFG_INTによって設定済みの場合(E_OBJ)
878 $j = 0$
879 $FOREACH intno2 INT.ORDER_LIST$
880 $IF INT.INTNO[intno] == INT.INTNO[intno2] && j < i$
881 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "intno", INT.INTNO[intno], "CFG_INT")$$END$
882 $END$
883 $j = j + 1$
884 $END$
885
886$ // intatrが([TA_ENAINT]|[TA_EDGE])でない場合(E_RSATR)
887 $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
888 $ERROR INT.TEXT_LINE[intno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "intatr", INT.INTATR[intno], "intno", INT.INTNO[intno], "CFG_INT")$$END$
889 $END$
890
891$ // intpriがCFG_INTに対する割込み優先度として正しくない場合(E_PAR)
892 $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
893 $ERROR INT.TEXT_LINE[intno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intpri", INT.INTPRI[intno], "CFG_INT")$$END$
894 $END$
895
896$ // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
897$ // よりも小さい値が指定された場合(E_OBJ)
898 $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
899 $IF INT.INTPRI[intno] < TMIN_INTPRI$
900 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
901 $END$
902 $END$
903
904$ // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
905$ // よりも小さい値が指定されなかった場合(E_OBJ)
906 $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
907 $IF INT.INTPRI[intno] >= TMIN_INTPRI$
908 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' must have higher priority than %3%"), "intno", INT.INTNO[intno], "TMIN_INTPRI")$$END$
909 $END$
910 $END$
911 $i = i + 1$
912$END$
913
914$ 割込みハンドラに関するエラーチェック
915$i = 0$
916$FOREACH inhno INH.ORDER_LIST$
917$ // inhnoがDEF_INHに対する割込みハンドラ番号として正しくない場合(E_PAR)
918 $IF !LENGTH(FIND(INHNO_DEFINH_VALID, INH.INHNO[inhno]))$
919 $ERROR INH.TEXT_LINE[inhno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
920 $END$
921
922$ // inhnoがDEF_INHによって設定済みの場合(E_OBJ)
923 $j = 0$
924 $FOREACH inhno2 INH.ORDER_LIST$
925 $IF INH.INHNO[inhno] == INH.INHNO[inhno2] && j < i$
926 $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
927 $END$
928 $j = j + 1$
929 $END$
930
931$ // inhatrが(TA_NULL)でない場合(E_RSATR)
932 $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
933 $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "inhatr", INH.INHATR[inhno], "inhno", INH.INHNO[inhno], "DEF_INH")$$END$
934 $END$
935
936$ // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
937$ // が指定されている場合(E_RSATR)
938 $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
939 $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
940 $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
941 $END$
942 $END$
943
944$ // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
945$ // が指定されていない場合(E_RSATR)
946 $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
947 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
948 $ERROR INH.TEXT_LINE[inhno]$E_RSATR: $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"), "inhno", INH.INHNO[inhno])$$END$
949 $END$
950 $END$
951
952 $IF LENGTH(INTNO[INH.INHNO[inhno]])$
953 $intno = INTNO[INH.INHNO[inhno]]$
954$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)
955 $IF !LENGTH(INT.INTNO[intno])$
956 $ERROR INH.TEXT_LINE[inhno]$E_OBJ: $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"), "intno", INT.INTNO[intno], "inhno", INH.INHNO[inhno], "CFG_INT")$$END$
957 $ELSE$
958 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
959$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
960$ // するintnoに対してCFG_INTで設定された割込み優先度が
961$ // TMIN_INTPRIよりも小さい場合(E_OBJ)
962 $IF INT.INTPRI[intno] < TMIN_INTPRI$
963 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
964 $END$
965 $ELSE$
966$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
967$ // するintnoに対してCFG_INTで設定された割込み優先度が
968$ // TMIN_INTPRI以上である場合(E_OBJ)
969 $IF INT.INTPRI[intno] >= TMIN_INTPRI$
970 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"), "intpri", INT.INTPRI[intno], "inhno", INH.INHNO[inhno], "TMIN_INTPRI")$$END$
971 $END$
972 $END$
973 $END$
974 $END$
975 $i = i + 1$
976$END$
977
978$ 割込みサービスルーチン(ISR)に関するエラーチェック
979$FOREACH order ISR.ORDER_LIST$
980$ // isratrが(TA_NULL)でない場合(E_RSATR)
981 $IF (ISR.ISRATR[order] & ~TARGET_ISRATR) != 0$
982 $ERROR ISR.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isratr", ISR.ISRATR[order], "ATT_ISR")$$END$
983 $END$
984
985$ // intnoがATT_ISRに対する割込み番号として正しくない場合(E_PAR)
986 $IF !LENGTH(FIND(INTNO_ATTISR_VALID, ISR.INTNO[order]))$
987 $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "intno", ISR.INTNO[order], "ATT_ISR")$$END$
988 $END$
989
990$ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
991 $IF !(TMIN_ISRPRI <= ISR.ISRPRI[order] && ISR.ISRPRI[order] <= TMAX_ISRPRI)$
992 $ERROR ISR.TEXT_LINE[order]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "isrpri", ISR.ISRPRI[order], "ATT_ISR")$$END$
993 $END$
994$END$
995
996$FOREACH intno INTNO_ATTISR_VALID$
997 $inhno = INHNO[intno]$
998
999$ // 割込み番号intnoに対して登録されたISRのリストの作成
1000 $isr_order_list = {}$
1001 $FOREACH order ISR.ORDER_LIST$
1002 $IF ISR.INTNO[order] == intno$
1003 $isr_order_list = APPEND(isr_order_list, order)$
1004 $order_for_error = order$
1005 $END$
1006 $END$
1007
1008$ // 割込み番号intnoに対して登録されたISRが存在する場合
1009 $IF LENGTH(isr_order_list) > 0$
1010$ // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)
1011 $IF LENGTH(INH.INHNO[inhno])$
1012 $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"), "intno", ISR.INTNO[order_for_error], "ATT_ISR", "inhno", INH.INHNO[inhno])$$END$
1013 $END$
1014
1015$ // intnoに対するCFG_INTがない場合(E_OBJ)
1016 $IF !LENGTH(INT.INTNO[intno])$
1017 $ERROR ISR.TEXT_LINE[order_for_error]$E_OBJ: $FORMAT(_("%1% `%2%\' is not configured with %3%"), "intno", ISR.INTNO[order_for_error], "CFG_INT")$$END$
1018 $ELSE$
1019$ // intnoに対してCFG_INTで設定された割込み優先度がTMIN_INTPRI
1020$ // よりも小さい場合(E_OBJ)
1021 $IF INT.INTPRI[intno] < TMIN_INTPRI$
1022 $ERROR INT.TEXT_LINE[intno]$E_OBJ: $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"), "intpri", INT.INTPRI[intno], "intno", ISR.INTNO[order_for_error], "TMIN_INTPRI")$$END$
1023 $END$
1024 $END$
1025 $END$
1026$END$
1027
1028$ 割込みサービスルーチン(ISR)管理のデータ構造
1029$intno_isr_list = {}$
1030$FOREACH intno INTNO_ATTISR_VALID$
1031 $inhno = INHNO[intno]$
1032 $IF LENGTH(INT.INTNO[intno]) && !LENGTH(INH.INHNO[inhno])$
1033 $intno_isr_list = APPEND(intno_isr_list, intno)$
1034 $END$
1035$END$
1036
1037$INTNO_ISR = {}$
1038$i = 0$
1039$FOREACH intno SORT(intno_isr_list, "INT.INTNO")$
1040 $INTNO_ISR = APPEND(INTNO_ISR, intno)$
1041 $ISR_QUEUE_HEADER[intno] = FORMAT("&(_kernel_isr_queue_table[%d])", i)$
1042 $i = i + 1$
1043$END$
1044
1045const uint_t _kernel_tnum_isr_queue = $LENGTH(INTNO_ISR)$;$NL$
1046$NL$
1047
1048$IF LENGTH(INTNO_ISR)$
1049 const ISR_ENTRY _kernel_isr_queue_list[$LENGTH(INTNO_ISR)$] = {$NL$
1050 $JOINEACH intno INTNO_ISR ",\n"$
1051 $TAB${ $intno$, $ISR_QUEUE_HEADER[intno]$ }
1052 $END$$NL$
1053 };$NL$
1054$ELSE$
1055 TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
1056$END$$NL$
1057
1058$IF LENGTH(INTNO_ISR)$
1059 QUEUE _kernel_isr_queue_table[$LENGTH(INTNO_ISR)$];$NL$
1060$ELSE$
1061 TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
1062$END$$NL$
1063
1064$ 割込みサービスルーチン(ISR)呼出しのための割込みハンドラの生成
1065$FOREACH intno INTNO_ISR$
1066 $inhno = INHNO[intno]$
1067
1068$ // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
1069 $INH.INHNO[inhno] = inhno$
1070 $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
1071 $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
1072 $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
1073
1074$ // ISR用の割込みハンドラ
1075 void$NL$
1076 _kernel_inthdr_$intno$(void)$NL$
1077 {$NL$
1078 $TAB$i_begin_int($intno$);$NL$
1079 $TAB$_kernel_call_isr($ISR_QUEUE_HEADER[intno]$);$NL$
1080 $TAB$i_end_int($intno$);$NL$
1081 }$NL$
1082 $NL$
1083$END$
1084
1085$ 割込みサービスルーチンの数
1086#define TNUM_SISR $LENGTH(ISR.ORDER_LIST)$$NL$
1087#define TNUM_ISR $LENGTH(ISR.ORDER_LIST) + num_aisrid$$NL$
1088$NL$
1089
1090$ 割込みサービスルーチンID番号の最大値
1091const ID _kernel_tmax_isrid = (TMIN_ISRID + TNUM_ISRID - 1);$NL$
1092const uint_t _kernel_tnum_sisr = TNUM_SISR;$NL$
1093$NL$
1094
1095$ 割込みサービスルーチン初期化ブロックの生成
1096$IF LENGTH(ISR.ORDER_LIST)$
1097 const ISRINIB _kernel_sisrinib_table[TNUM_SISR] = {$NL$
1098 $JOINEACH order ISR.ORDER_LIST ",\n"$
1099 $TAB${ ($ISR.ISRATR[order]$), ($ISR.EXINF[order]$), ($ISR.INTNO[order]$), ($ISR_QUEUE_HEADER[ISR.INTNO[order]]$), ($ISR.ISR[order]$), ($ISR.ISRPRI[order]$) }
1100 $END$$NL$
1101 };$NL$
1102$ELSE$
1103 TOPPERS_EMPTY_LABEL(const ISRINIB, _kernel_sisrinib_table);$NL$
1104$END$
1105$NL$
1106
1107$ 動的生成割込みサービスルーチン用の割込みサービスルーチン初期化ブロッ
1108$ クの生成
1109$IF num_aisrid > 0$
1110 ISRINIB _kernel_aisrinib_table[$num_aisrid$];$NL$
1111$ELSE$
1112 TOPPERS_EMPTY_LABEL(ISRINIB, _kernel_aisrinib_table);$NL$
1113$END$
1114$NL$
1115
1116$ 割込みサービスルーチン管理ブロックの生成
1117$IF num_isr > 0$
1118 ISRCB _kernel_isrcb_table[TNUM_ISR];$NL$
1119$ELSE$
1120 TOPPERS_EMPTY_LABEL(ISRCB, _kernel_isrcb_table);$NL$
1121$END$
1122$NL$
1123
1124$
1125$ 割込み管理機能のための標準的な初期化情報の生成
1126$
1127$ 割込みハンドラの初期化に必要な情報
1128$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INHINIB_TABLE,0)$
1129
1130$ 割込みハンドラ数
1131#define TNUM_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
1132const uint_t _kernel_tnum_inhno = TNUM_INHNO;$NL$
1133$NL$
1134$FOREACH inhno INH.ORDER_LIST$
1135 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
1136 INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)$NL$
1137 $END$
1138$END$
1139$NL$
1140
1141$ 割込みハンドラ初期化テーブル
1142$IF LENGTH(INH.ORDER_LIST)$
1143 const INHINIB _kernel_inhinib_table[TNUM_INHNO] = {$NL$
1144 $JOINEACH inhno INH.ORDER_LIST ",\n"$
1145 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
1146 $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$)) }
1147 $ELSE$
1148 $TAB${ ($INH.INHNO[inhno]$), ($INH.INHATR[inhno]$), (FP)($INH.INTHDR[inhno]$) }
1149 $END$
1150 $END$$NL$
1151 };$NL$
1152$ELSE$
1153 TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
1154$END$$NL$
1155$END$
1156
1157$ 割込み要求ラインの初期化に必要な情報
1158$IF !OMIT_INITIALIZE_INTERRUPT || ALT(USE_INTINIB_TABLE,0)$
1159
1160$ 割込み要求ライン数
1161#define TNUM_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
1162const uint_t _kernel_tnum_intno = TNUM_INTNO;$NL$
1163$NL$
1164
1165$ 割込み要求ライン初期化テーブル
1166$IF LENGTH(INT.ORDER_LIST)$
1167 const INTINIB _kernel_intinib_table[TNUM_INTNO] = {$NL$
1168 $JOINEACH intno INT.ORDER_LIST ",\n"$
1169 $TAB${ ($INT.INTNO[intno]$), ($INT.INTATR[intno]$), ($INT.INTPRI[intno]$) }
1170 $END$$NL$
1171 };$NL$
1172$ELSE$
1173 TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
1174$END$$NL$
1175$END$
1176
1177$
1178$ CPU例外管理機能
1179$
1180/*$NL$
1181$SPC$* CPU Exception Management Functions$NL$
1182$SPC$*/$NL$
1183$NL$
1184
1185$ CPU例外ハンドラに関するエラーチェック
1186$i = 0$
1187$FOREACH excno EXC.ORDER_LIST$
1188$ // excnoがDEF_EXCに対するCPU例外ハンドラ番号として正しくない場合(E_PAR)
1189 $IF !LENGTH(FIND(EXCNO_DEFEXC_VALID, EXC.EXCNO[excno]))$
1190 $ERROR EXC.TEXT_LINE[excno]$E_PAR: $FORMAT(_("illegal %1% `%2%\' in %3%"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
1191 $END$
1192
1193$ // excnoがDEF_EXCによって設定済みの場合(E_OBJ)
1194 $j = 0$
1195 $FOREACH excno2 EXC.ORDER_LIST$
1196 $IF EXC.EXCNO[excno] == EXC.EXCNO[excno2] && j < i$
1197 $ERROR EXC.TEXT_LINE[excno]$E_OBJ: $FORMAT(_("%1% `%2%\' in %3% is duplicated"), "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
1198 $END$
1199 $j = j + 1$
1200 $END$
1201
1202$ // excatrが(TA_NULL)でない場合(E_RSATR)
1203 $IF (EXC.EXCATR[excno] & ~TARGET_EXCATR) != 0$
1204 $ERROR EXC.TEXT_LINE[excno]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "excatr", EXC.EXCATR[excno], "excno", EXC.EXCNO[excno], "DEF_EXC")$$END$
1205 $END$
1206 $i = i + 1$
1207$END$
1208
1209$ CPU例外ハンドラのための標準的な初期化情報の生成
1210$IF !OMIT_INITIALIZE_EXCEPTION$
1211
1212$ CPU例外ハンドラ数
1213#define TNUM_EXCNO $LENGTH(EXC.ORDER_LIST)$$NL$
1214const uint_t _kernel_tnum_excno = TNUM_EXCNO;$NL$
1215$NL$
1216$FOREACH excno EXC.ORDER_LIST$
1217 EXCHDR_ENTRY($EXC.EXCNO[excno]$, $+EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)$NL$
1218$END$
1219$NL$
1220
1221$ CPU例外ハンドラ初期化テーブル
1222$IF LENGTH(EXC.ORDER_LIST)$
1223 const EXCINIB _kernel_excinib_table[TNUM_EXCNO] = {$NL$
1224 $JOINEACH excno EXC.ORDER_LIST ",\n"$
1225 $TAB${ ($EXC.EXCNO[excno]$), ($EXC.EXCATR[excno]$), (FP)(EXC_ENTRY($EXC.EXCNO[excno]$, $EXC.EXCHDR[excno]$)) }
1226 $END$$NL$
1227 };$NL$
1228$ELSE$
1229 TOPPERS_EMPTY_LABEL(const EXCINIB, _kernel_excinib_table);$NL$
1230$END$$NL$
1231$END$
1232
1233$
1234$ 非タスクコンテキスト用のスタック領域
1235$
1236/*$NL$
1237$SPC$* Stack Area for Non-task Context$NL$
1238$SPC$*/$NL$
1239$NL$
1240
1241$IF !LENGTH(ICS.ORDER_LIST)$
1242$ // DEF_ICSがない場合のデフォルト値の設定
1243 #ifdef DEFAULT_ISTK$NL$
1244 $NL$
1245 #define TOPPERS_ISTKSZ DEFAULT_ISTKSZ$NL$
1246 #define TOPPERS_ISTK DEFAULT_ISTK$NL$
1247 $NL$
1248 #else /* DEAULT_ISTK */$NL$
1249 $NL$
1250 static STK_T _kernel_istack[COUNT_STK_T(DEFAULT_ISTKSZ)];$NL$
1251 #define TOPPERS_ISTKSZ ROUND_STK_T(DEFAULT_ISTKSZ)$NL$
1252 #define TOPPERS_ISTK _kernel_istack$NL$
1253 $NL$
1254 #endif /* DEAULT_ISTK */$NL$
1255$ELSE$
1256
1257$ // 静的API「DEF_ICS」が複数ある(E_OBJ)
1258 $IF LENGTH(ICS.ORDER_LIST) > 1$
1259 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_ICS")$$END$
1260 $END$
1261
1262$ // istkszが0以下か,ターゲット定義の最小値(TARGET_MIN_ISTKSZ)よりも
1263$ // 小さい場合(E_PAR)
1264 $IF ICS.ISTKSZ[1] <= 0 || (TARGET_MIN_ISTKSZ
1265 && ICS.ISTKSZ[1] < TARGET_MIN_ISTKSZ)$
1266 $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is too small"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
1267 $END$
1268
1269$ // istkszがスタック領域のサイズとして正しくない場合(E_PAR)
1270 $IF !EQ(ICS.ISTK[1], "NULL") && CHECK_STKSZ_ALIGN
1271 && (ICS.ISTKSZ[1] & (CHECK_STKSZ_ALIGN - 1))$
1272 $ERROR ICS.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "istksz", ICS.ISTKSZ[1], "DEF_ICS")$$END$
1273 $END$
1274
1275 $IF EQ(ICS.ISTK[1], "NULL")$
1276$ // スタック領域の自動割付け
1277 static STK_T _kernel_istack[COUNT_STK_T($ICS.ISTKSZ[1]$)];$NL$
1278 #define TOPPERS_ISTKSZ ROUND_STK_T($ICS.ISTKSZ[1]$)$NL$
1279 #define TOPPERS_ISTK _kernel_istack$NL$
1280 $ELSE$
1281 #define TOPPERS_ISTKSZ ($ICS.ISTKSZ[1]$)$NL$
1282 #define TOPPERS_ISTK (void *)($ICS.ISTK[1]$)$NL$
1283 $END$
1284$END$
1285$NL$
1286
1287$ 非タスクコンテキスト用のスタック領域
1288const SIZE _kernel_istksz = TOPPERS_ISTKSZ;$NL$
1289STK_T *const _kernel_istk = TOPPERS_ISTK;$NL$
1290$NL$
1291#ifdef TOPPERS_ISTKPT$NL$
1292STK_T *const _kernel_istkpt = TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ);$NL$
1293#endif /* TOPPERS_ISTKPT */$NL$
1294$NL$
1295
1296$
1297$ カーネルが割り付けるメモリ領域
1298$
1299/*$NL$
1300$SPC$* Memory Area Allocated by Kernel$NL$
1301$SPC$*/$NL$
1302$NL$
1303
1304$IF !LENGTH(KMM.ORDER_LIST)$
1305$ // DEF_KMMがない場合のデフォルト値の設定
1306 #define TOPPERS_KMMSZ 0$NL$
1307 #define TOPPERS_KMM NULL$NL$
1308$ELSE$
1309$ // 静的API「DEF_KMM」が複数ある(E_OBJ)
1310 $IF LENGTH(KMM.ORDER_LIST) > 1$
1311 $ERROR$E_OBJ: $FORMAT(_("too many %1%"), "DEF_KMM")$$END$
1312 $END$
1313
1314$ // kmmszが0以下の場合(E_PAR)
1315 $IF KMM.KMMSZ[1] <= 0$
1316 $ERROR KMM.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' is zero in %3%"), "kmmsz", KMM.KMMSZ[1], "DEF_KMM")$$END$
1317 $END$
1318
1319$ // kmmszがカーネルが割り付けるメモリ領域のサイズとして正しくない場合(E_PAR)
1320 $IF !EQ(KMM.KMM[1], "NULL") && CHECK_MB_ALIGN
1321 && (KMM.KMMSZ[1] & (CHECK_MB_ALIGN - 1))$
1322 $ERROR KMM.TEXT_LINE[1]$E_PAR: $FORMAT(_("%1% `%2%\' in %3% is not aligned"), "kmmsz", KMM.KMMSZ[1], "DEF_KMM")$$END$
1323 $END$
1324
1325 $IF EQ(KMM.KMM[1], "NULL")$
1326$ // カーネルが割り付けるメモリ領域の自動割付け
1327 static MB_T _kernel_memory[TOPPERS_COUNT_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))];$NL$
1328 #define TOPPERS_KMMSZ TOPPERS_ROUND_SZ($KMM.KMMSZ[1]$, sizeof(MB_T))$NL$
1329 #define TOPPERS_KMM _kernel_memory$NL$
1330 $ELSE$
1331 #define TOPPERS_KMMSZ ($KMM.KMMSZ[1]$)$NL$
1332 #define TOPPERS_KMM (void *)($KMM.KMM[1]$)$NL$
1333 $END$
1334$END$
1335$NL$
1336
1337$ カーネルが割り付けるメモリ領域
1338const SIZE _kernel_kmmsz = TOPPERS_KMMSZ;$NL$
1339MB_T *const _kernel_kmm = TOPPERS_KMM;$NL$
1340$NL$
1341
1342$
1343$ タイムイベント管理
1344$
1345/*$NL$
1346$SPC$* Time Event Management$NL$
1347$SPC$*/$NL$
1348$NL$
1349TMEVTN _kernel_tmevt_heap[TNUM_TSKID + TNUM_CYCID + TNUM_ALMID];$NL$
1350$NL$
1351
1352$
1353$ 各モジュールの初期化関数
1354$
1355/*$NL$
1356$SPC$* Module Initialization Function$NL$
1357$SPC$*/$NL$
1358$NL$
1359void$NL$
1360_kernel_initialize_object(void)$NL$
1361{$NL$
1362$TAB$_kernel_initialize_task();$NL$
1363$IF num_semid$$TAB$_kernel_initialize_semaphore();$NL$$END$
1364$IF num_flgid$$TAB$_kernel_initialize_eventflag();$NL$$END$
1365$IF num_dtqid$$TAB$_kernel_initialize_dataqueue();$NL$$END$
1366$IF num_pdqid$$TAB$_kernel_initialize_pridataq();$NL$$END$
1367$IF num_mbxid$$TAB$_kernel_initialize_mailbox();$NL$$END$
1368$IF num_mpfid$$TAB$_kernel_initialize_mempfix();$NL$$END$
1369$IF num_cycid$$TAB$_kernel_initialize_cyclic();$NL$$END$
1370$IF num_almid$$TAB$_kernel_initialize_alarm();$NL$$END$
1371$TAB$_kernel_initialize_interrupt();$NL$
1372$IF num_isr$$TAB$_kernel_initialize_isr();$NL$$END$
1373$TAB$_kernel_initialize_exception();$NL$
1374}$NL$
1375$NL$
1376
1377$
1378$ 初期化ルーチンの実行関数
1379$
1380/*$NL$
1381$SPC$* Initialization Routine$NL$
1382$SPC$*/$NL$
1383$NL$
1384void$NL$
1385_kernel_call_inirtn(void)$NL$
1386{$NL$
1387$FOREACH order INI.ORDER_LIST$
1388$ // iniatrが(TA_NULL)でない場合(E_RSATR)
1389 $IF INI.INIATR[order] != 0$
1390 $ERROR INI.TEXT_LINE[order]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "iniatr", INI.INIATR[order], "inirtn", INI.INIRTN[order], "ATT_INI")$$END$
1391 $END$
1392 $TAB$((INIRTN)($INI.INIRTN[order]$))((intptr_t)($INI.EXINF[order]$));$NL$
1393$END$
1394}$NL$
1395$NL$
1396
1397$
1398$ 終了処理ルーチンの実行関数
1399$
1400/*$NL$
1401$SPC$* Termination Routine$NL$
1402$SPC$*/$NL$
1403$NL$
1404void$NL$
1405_kernel_call_terrtn(void)$NL$
1406{$NL$
1407$FOREACH rorder TER.RORDER_LIST$
1408$ // teratrが(TA_NULL)でない場合(E_RSATR)
1409 $IF TER.TERATR[rorder] != 0$
1410 $ERROR TER.TEXT_LINE[rorder]$E_RSATR: $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"), "teratr", TER.TERATR[rorder], "terrtn", TER.TERRTN[rorder], "ATT_TER")$$END$
1411 $END$
1412 $TAB$((TERRTN)($TER.TERRTN[rorder]$))((intptr_t)($TER.EXINF[rorder]$));$NL$
1413$END$
1414}$NL$
1415$NL$
Note: See TracBrowser for help on using the repository browser.