source: atk1_sh2/trunk/kernel/ecc2/kernel_ecc2.tf@ 5

Last change on this file since 5 was 5, checked in by msugi, 14 years ago

新世代カーネル対応コンフィギュレータと必要なファイル追加.

File size: 15.2 KB
Line 
1$
2$ TOPPERS Automotive Kernel
3$ Toyohashi Open Platform for Embedded Real-Time Systems
4$ Automotive Kernel
5$
6$ Copyright (C) 2010 by Meika Sugimoto
7$
8$ 上記著作権者は,以下の (1)(4) の条件か,Free Software Foundation
9$ によって公表されている GNU General Public License Version 2 に記
10$ 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
11$ を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
12$ 利用と呼ぶ)することを無償で許諾する.
13$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15$ スコード中に含まれていること.
16$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17$ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18$ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19$ の無保証規定を掲載すること.
20$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21$ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22$ と.
23$ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
25$ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26$ 報告すること.
27$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28$ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29$
30$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
32$ 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
33$ 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
34$
35
36$ カーネルコンフィギュレーション定義テンプレートファイルのインクルード
37$INCLUDE "kernel_config.tf"$
38
39$FILE "kernel_cfg.c"$
40
41/*$NL$
42$SPC$*$TAB$kernel_cfg.c$NL$
43$SPC$*$TAB$Generated time : $+CFG_VERSION$$NL$
44$SPC$*$TAB$CFG Vertion : $CFG_VERSION$$NL$
45$SPC$*/$NL$
46
47$NL$
48
49#include "osek_kernel.h"$NL$
50#include "kernel_id.h"$NL$
51#include "alarm.h"$NL$
52#include "interrupt.h"$NL$
53#include "resource.h"$NL$
54#include "task.h"$NL$
55
56$NL$
57$NL$
58
59$ スタックサイズを計算するためのマクロ定義
60
61#define __STK_UNIT VP$NL$
62#define __TCOUNT_STK_UNIT(sz) (((sz) + sizeof(__STK_UNIT) - 1) / sizeof(__STK_UNIT))$NL$
63
64$NL$
65
66$
67$ タスクリストの再割り当て
68$
69$ 拡張タスクの定義の後に基本タスクを割当てなければならないため,
70$ TASK.ID_LISTを作りなおす.
71$
72
73$TASK_LIST = {}$
74$EXTTSK_LIST = {}$
75
76$FOREACH tskid TASK.ID_LIST$
77$ イベントがあれば前に代入,なければ後ろに代入
78 $IF LENGTH(TASK.EVENT[tskid])$
79 $TASK_LIST = APPEND(TASK[tskid] , TASK_LIST)$
80 $EXTTSK_LIST = APPEND(TASK[tskid] , EXTTSK_LIST)$
81 $ELSE$
82 $TASK_LIST = APPEND(TASK_LIST , TASK[tskid])$
83 $END$
84$END$
85
86$
87$ ISRカテゴリ1/2のリスト作成
88$
89
90$ISR1_LIST = {}$
91$ISR2_LIST = {}$
92
93$FOREACH isrid ISR.ID_LIST$
94$ CATEGORY属性で判定
95 $IF EQ(ISR.CATEGORY[isrid] , "1")$
96 $ISR1_LIST = APPEND(ISR1_LIST , ISR[isrid])$
97 $ELSE$
98 $ISR2_LIST = APPEND(ISR2_LIST , ISR[isrid])$
99 $END$
100$END$
101
102
103
104$
105$ オブジェクト数の定義
106$
107
108/*
109$SPC$オブジェクト数の定義
110$SPC$*/$NL$
111
112#define$TAB$TNUM_ALARM$TAB$$TAB$$LENGTH(ALARM.ID_LIST)$$NL$
113#define$TAB$TNUM_COUNTER$TAB$$LENGTH(COUNTER.ID_LIST)$$NL$
114#define$TAB$TNUM_ISR2$TAB$$TAB$$LENGTH(ISR2_LIST)$$NL$
115$IF EQ(OS.USERESSCHEDULER[0] , "TRUE")$
116 #define$TAB$TNUM_RESOURCE$TAB$$LENGTH(RESOURCE.ID_LIST) + 1$$NL$
117$ELSE$
118 #define$TAB$TNUM_RESOURCE$TAB$$LENGTH(RESOURCE.ID_LIST)$$NL$
119$END$
120#define$TAB$TNUM_TASK$TAB$$TAB$$LENGTH(TASK.ID_LIST)$$NL$
121#define$TAB$TNUM_EXTTASK$TAB$$LENGTH(EXTTSK_LIST)$$NL$
122
123$NL$
124
125const UINT8 tnum_alarm = TNUM_ALARM;$NL$
126const UINT8 tnum_counter = TNUM_COUNTER;$NL$
127const UINT8 tnum_isr2 = TNUM_ISR2;$NL$
128const UINT8 tnum_resource = TNUM_RESOURCE;$NL$
129const UINT8 tnum_task = TNUM_TASK;$NL$
130const UINT8 tnum_exttask = TNUM_EXTTASK;$NL$
131
132$NL$
133$NL$
134
135
136/****** Object OS ******/$NL$
137$NL$
138
139$ OSオブジェクトが複数定義されていないかのチェック
140
141$IF LENGTH(OS.ID_LIST) == 0$
142 $ERROR$ $FORMAT("OS Object not defined.")$ $END$
143$ELSE$
144$IF LENGTH(OS.ID_LIST) > 1$
145 $ERROR$ $FORMAT("OS Object can define once.")$ $END$
146$END$
147$END$
148
149$
150$ ATK1ではSTATUSはEXTENDEDしか使用できない
151$ (ヴィッツ製SGではエラーにしていないが,厳密にチェックをすることとした
152$
153
154$IF EQ(OS.STATUS[0] , "STANDARD")$
155 $ERROR$ $FORMAT("Object OS parameter STATUS must set EXTENDED.")$ $END$
156$END$
157
158/****** Object TASK ******/$NL$
159$NL$
160
161$
162$ リソース優先度の算出
163$
164$ タスクの実行時優先度を決定するために必要であるため,先に処理を行う.
165$ (リソースの実体の出力は後で行う)
166$
167$ タスクの優先度に異常があるとロジック上問題があるが,タスク生成部での
168$ エラーチェックでエラーとなるので問題ない.
169$
170
171$RESOURCE_PRIORITY = {}$
172$FOREACH resid RESOURCE.ID_LIST$
173 $PRIORITY_MAX = 0$
174
175 $IF !EQ(RESOURCE.RESOURCEPROPERTY , "LINKED")$
176 $FOREACH tskid TASK_LIST$
177 $IF (LENGTH(FIND(TASK.RESOURCE[tskid] , resid)))
178 && (TASK.PRIORITY[tskid] > PRIORITY_MAX)$
179 $PRIORITY_MAX =
180 VALUE(FORMAT("TPRI_MINTASK + %1%" , TASK.PRIORITY[tskid]) , TASK.PRIORITY[tskid])$
181 $END$
182 $END$
183
184 $FOREACH isrid ISR.ID_LIST$
185 $IF (LENGTH(FIND(ISR.RESOURCE[isrid] , resid)))
186 && ((ISR.PRIORITY[isrid] + TPRI_MINISR) > PRIORITY_MAX)$
187 $PRIORITY_MAX =
188 VALUE(FORMAT("TPRI_MINISR + %1%" , ISR.PRIORITY[isrid]) , ISR.PRIORITY[isrid] + TPRI_MINISR)$
189 $END$
190 $END$
191
192 $END$
193
194 $RESOURCE_PRIORITY[resid] = PRIORITY_MAX$
195$END$
196
197$ /// LINKEDはここでなめて参照を解決して算出
198
199$
200$ タスク管理情報生成部
201$
202
203$FOREACH tskid TASK.ID_LIST$
204
205$ タスク優先度のチェックはコンフィギュレータ側(実装部の整合性チェック)でチェック可能
206$ $IF TASK.PRIORITY[tskid] > TPRI_MAXTASK$
207$ $ERROR$
208$ $FORMAT("Task %1%'s PRIORITY over range[%2% - %3%]" , tskid , +TPRI_MINTASK , +TPRI_MAXTASK)$
209$ $END$
210$ $END$
211
212$ スタックサイズのチェック
213 $IF (TASK.STACKSIZE[tskid] == 0) || (TASK.STACKSIZE[tskid] > UINT32_MAX)$
214 $ERROR$
215 $FORMAT("TASK %1%'s STACKSIZE over range[%2% - %3%] or '0'." , tskid , 1 , UINT32_MAX)$
216 $END$
217 $END$
218
219$ 最大起動要求回数のチェック
220 $IF (LENGTH(TASK.EVENT[tskid]) != 0)
221 && (TASK.ACTIVATION[tskid] > 1)$
222$ 拡張タスクは'1'でならなければならない
223 $ERROR$
224 $FORMAT("Task %1%'s ACTIVATION is %2% , but because %1% is extended task , ACTIVATION must be 1." ,
225 tskid , +TASK.ACTIVATION[tskid])$
226 $END$
227 $ELSE$
228 $IF TASK.ACTIVATION[tskid] > UINT8_MAX$
229$ 基本タスクは1-UINT8_MAX
230 $ERROR$
231 $FORMAT("Task %1%'s ACTIVATION over %1% , you can set [1 - %2%]" , tskid , +UINT8_MAX)$
232 $END$
233 $END$
234 $END$
235
236$ 自動起動設定のチェックはコンフィギュレータ側(実装部の整合性チェック)でチェック可能
237
238$ イベント参照のチェックはコンフィギュレータ側(実装部の整合性チェック)でチェック可能
239
240$ リソースはコンフィギュレータ側(実装部の整合性チェック)でチェック可能
241
242$END$
243
244
245$
246$ タスク設定出力
247$
248
249
250$COUNT = 0$
251/* タスクIDの定義 */$NL$
252$FOREACH tskid TASK_LIST$
253 const TaskType $tskid$ = $COUNT$;$NL$
254 $COUNT = COUNT + 1$
255$END$
256
257$NL$
258
259/* タスクの外部宣言の定義 */$NL$
260$FOREACH tskid TASK_LIST$
261 extern void TASKNAME( $tskid$ )( void );$NL$
262$END$
263
264$NL$
265
266/* スタックを共有しないタスクのスタック領域の定義 */$NL$
267$FOREACH tskid TASK_LIST$
268 $IF EQ(TASK.SCHEDULE[tskid] , "FULL")
269 || LENGTH(TASK.EVENT[tskid])$
270 static __STK_UNIT _stack_$tskid$[__TCOUNT_STK_UNIT($TASK.STACKSIZE[tskid]$)];$NL$
271 $END$
272$END$
273
274$NL$
275
276/* スタックを共有するタスクのスタック領域の定義 */$NL$
277$ NONPRIかつ,イベントを持たない同一優先度のタスクがスタックを共有できる
278
279$ 設定できる優先度のリストを作成する
280$MAX_PRIORITY_RANGE = { 0,1, ... ,255 }$
281$PRIORITY_RANGE = {}$
282$STACKSIZE_PER_PRIORITY = {}$
283
284$FOREACH priority MAX_PRIORITY_RANGE$
285 $IF (+TPRI_MINTASK <= priority) && (priority <= +TPRI_MAXTASK)$
286 $PRIORITY_RANGE = APPEND(PRIORITY_RANGE , priority)$
287 $END$
288$END$
289
290$ 優先度順に最大値を算出
291$FOREACH priority PRIORITY_RANGE$
292 $STACKSIZE_PER_PRIORITY[priority] = 0$
293 $FOREACH tskid TASK_LIST$
294 $IF (TASK.PRIORITY[tskid] == priority)
295 && (EQ(TASK.SCHEDULE[tskid] , "NON") && !LENGTH(TASK.EVENT[tskid]))
296 && (TASK.STACKSIZE[tskid] > STACKSIZE_PER_PRIORITY[priority])$
297 $STACKSIZE_PER_PRIORITY[priority] = TASK.STACKSIZE[tskid]$
298 $END$
299 $END$
300$END$
301
302/* サイズが0でないものを出力 */
303$FOREACH priority PRIORITY_RANGE$
304 $IF STACKSIZE_PER_PRIORITY[priority] != 0$
305 static __STK_UNIT _stack_priority_$priority$[__TCOUNT_STK_UNIT( $STACKSIZE_PER_PRIORITY[priority]$)];$NL$
306 $END$
307$END$
308
309$NL$
310
311/* タスクの初期優先度 */$NL$
312const Priority tinib_inipri[TNUM_TASK] = $NL$
313{$NL$
314$JOINEACH tskid TASK_LIST " , \n"$
315 $TAB$TPRI_MINTASK + $TASK.PRIORITY[tskid]$$TAB$/* $tskid$ */
316$END$
317$NL$
318};
319
320$NL$
321$NL$
322
323/* タスクの実行優先度 */$NL$
324const Priority tinib_exepri[TNUM_TASK] = $NL$
325{$NL$
326
327$JOINEACH tskid TASK_LIST " , \n"$
328
329$TASK_EXEPRI = TPRI_MINTASK + TASK.PRIORITY[tskid]$
330$ NONプリエンプティブタスクは最大値を設定
331 $IF EQ(TASK.SCHEDULE[tskid] , "NON")$
332 $TASK_EXEPRI = TPRI_MINTASK + TPRI_MAXTASK$
333 $ELSE$
334$ INTERFALリソースを持っていれば,その中リソースの優先度を設定する.
335 $IF LENGTH(TASK.RESOURCE[tskid])$
336 $TASK_EXEPRI = TPRI_MINTASK + TASK.PRIORITY[tskid]$
337 $FOREACH tsk_resid TASK.RESOURCE[tskid]$
338 $IF EQ(RESOURCE.RESOURCEPROPERTY[tsk_resid] , "INTERNAL")$
339 $TASK_EXEPRI = RESOURCE_PRIORITY[tsk_resid]$
340 $END$
341 $END$
342 $END$
343 $END$
344 $TAB$TPRI_MINTASK + $TASK_EXEPRI$$TAB$/* $tskid$ */
345$END$
346$NL$
347};
348
349$NL$
350$NL$
351
352/* タスクの最大起動要求数 */$NL$
353const UINT8 tinib_maxact[TNUM_TASK] = $NL$
354{$NL$
355$JOINEACH tskid TASK_LIST " , \n"$
356 $TAB$(($+TASK.ACTIVATION[tskid]$) - 1)$TAB$/* $tskid$ */
357$END$
358$NL$
359};
360
361$NL$
362$NL$
363
364/* 自動起動属性 */
365const AppModeType tinib_autoact[TNUM_TASK] = $NL$
366{$NL$
367$JOINEACH tskid TASK_LIST " , \n"$
368 $IF EQ(TASK.AUTOSTART[tskid] , "TRUE")$
369 $TAB$(
370 $JOINEACH appmode TASK.AUTOSTART.TRUE.APPMODE[tskid] " | "$
371 $appmode$
372 $END$
373 )$TAB$/* $tskid$ */
374 $ELSE$
375 $TAB$0x00000000
376 $END$
377$END$
378$NL$
379};
380
381$NL$
382$NL$
383
384/* タスクの起動番地 */$NL$
385const FP tinib_task[TNUM_TASK] = $NL$
386{$NL$
387$JOINEACH tskid TASK_LIST " , \n"$
388 $TAB$TASKNAME( $tskid$ )$TAB$/* $tskid$ */
389$END$
390$NL$
391};
392
393$NL$
394$NL$
395
396/* タスクのスタック領域 */$NL$
397const __STK_UNIT tinib_stk[TNUM_TASK] = $NL$
398{$NL$
399$JOINEACH tskid TASK_LIST " , \n"$
400 $IF EQ(TASK.SCHEDULE[tskid] , "FULL") || LENGTH(TASK.EVENT[tskid])$
401 $TAB$(__STK_UNIT)_stack_$tskid$$TAB$/* $tskid$ */
402 $ELSE$
403 $TAB$(__STK_UNIT)_stack_priority_$TASK.PRIORITY[tskid]$$TAB$/* $tskid$ , priority : $TASK.PRIORITY[tskid]$ */
404 $END$
405$END$
406$NL$
407};
408
409$NL$
410$NL$
411
412/* タスクのスタックサイズ */$NL$
413const UINT16 tinib_stksz[TNUM_TASK] = $NL$
414{$NL$
415$JOINEACH tskid TASK_LIST " , \n"$
416 $IF EQ(TASK.SCHEDULE[tskid] , "FULL") || LENGTH(TASK.EVENT[tskid])$
417 $TAB$$+TASK.STACKSIZE[tskid]$$TAB$/* $tskid$ */
418 $ELSE$
419 $TAB$$+TASK.PRIORITY[tskid]$$TAB$/* $tskid$ */
420 $END$
421$END$
422$NL$
423};
424
425$NL$
426$NL$
427
428/* TCBの定義 */$NL$
429UINT8 tcb_tstat[TNUM_TASK];$NL$
430Priority tcb_curpri[TNUM_TASK];$NL$
431DEFINE_CTXB(TNUM_TASK);$NL$
432TaskType tcb_next[TNUM_TASK];$NL$
433EventMaskType tcb_curevt[TNUM_EXTTASK];$NL$
434EventMaskType tcb_waievt[TNUM_EXTTASK];$NL$
435UINT8 tcb_actcnt[TNUM_TASK];$NL$
436ResourceType tcb_lastres[TNUM_TASK];$NL$
437
438$NL$
439$NL$
440
441$
442$ カウンタ及びアラームのオブジェクト定義はコンフォーマンスクラスに依存しない
443$
444$INCLUDE "kernel.tf"$
445$FILE "kernel_cfg.c"$
446
447
448/****** Object RESOURCE ******/$NL$
449$ RESSCHEDULERの設定で始まりのIDが変わる
450$RESID_INCREMENT = 0$
451$IF EQ(OS.USERESSCHEDULER[0] , "TRUE")$
452 $RESID_INCREMENT = 1$
453$END$
454
455/* リソースIDの定義 */$NL$
456$NL$
457
458$FOREACH resid RESOURCE.ID_LIST$
459 const ResourceType $resid$ = $+resid + RESID_INCREMENT$;$NL$
460$END$
461
462$NL$
463
464const Priority resinib_ceilpri[TNUM_RESOURCE] =$NL$
465{$NL$
466
467$IF EQ(OS.USERESSCHEDULER[0] , "TRUE")$
468 $TAB$TPRI_SCHEDULER
469$END$
470
471$IF LENGTH(RESOURCE.ID_LIST)$
472 $SPC$,$SPC$$NL$
473 $JOINEACH resid RESOURCE.ID_LIST " , \n"$
474 $TAB$$RESOURCE_PRIORITY[resid]$$TAB$/* $resid$ */
475 $END$
476$END$
477
478$NL$};
479$NL$
480
481Priority rescb_prevpri[TNUM_RESOURCE];$NL$
482ResourceType rescb_prevres[TNUM_RESOURCE];$NL$
483
484$NL$
485$NL$
486
487/****** Object EVENT ******/$NL$
488$NL$
489
490$NUM_EVTMASK_AUTO = 0$
491$ASSIGNABLE_AUTO_EVTMASK = EVTMASK_BITS$
492
493$FOREACH evtid EVENT.ID_LIST$
494$ AUTOの場合
495 $IF EQ(EVENT.MASK[evtid] , "AUTO")$
496 $IF NUM_EVTMASK_AUTO < ASSIGNABLE_AUTO_EVTMASK$
497 const EventMaskType $evtid$ = (1U << $NUM_EVTMASK_AUTO$);$NL$
498 $NUM_EVTMASK_AUTO = NUM_EVTMASK_AUTO + 1$
499 $ELSE$
500 $ERROR$
501 $FORMAT("Total of AUTO EVENT is over. Auto assigned event can define until %1%." ,
502 ASSIGNABLE_AUTO_EVTMASK)$
503 $END$
504 $END$
505 $ELSE$
506$ AUTO以外
507 const EventMaskType $evtid$ = $FORMAT("0x%x" , +EVENT.MASK[evtid])$;$NL$
508 $IF +EVENT.MASK[evtid] == 0x00000000$
509 $WARNING$
510 $FORMAT("Event %1% is 0x00000000 , can't wait and set event." , evtid)$
511 $END$
512 $END$
513 $END$
514
515$ 参照されないイベントのチェック
516 $REFERED = 0$
517 $FOREACH ext_tskid EXTTSK_LIST$
518 $IF LENGTH(FIND(TASK.EVENT[ext_tskid] , evtid)) != 0$
519 $REFERED = 1$
520 $END$
521 $END$
522 $IF REFERED == 0$
523 $WARNING$
524 $FORMAT("Event %1% is no referenced from any task." , evtid)$
525 $END$
526 $END$
527$END$
528
529
530
531
532$NL$
533$NL$
534
535/****** Object ISR ******/$NL$
536$NL$
537
538$
539$ ISR定義情報生成部
540$
541
542$ エラーチェック部
543$USED_ENTRY = {}$
544$FOREACH isrid ISR.ID_LIST$
545$ 割込み範囲のチェック
546 $IF !LENGTH(FIND(ISR_PRIORITY_LIST , +ISR.PRIORITY[isrid]))$
547 $ERROR$
548 $FORMAT("ISR %1%'s PRIORITY(%2%) is no in range[%3% - %4%]." ,
549 isrid , ISR.PRIORITY[isrid] , AT(ISR_PRIORITY_LIST , 0) ,
550 AT(ISR_PRIORITY_LIST , (LENGTH(ISR_PRIORITY_LIST) - 1)))$
551 $END$
552 $END$
553$ 割込みエントリが範囲内にあるかチェック
554 $IF !LENGTH(FIND(ISR_ENTRY_LIST , +ISR.ENTRY[isrid]))$
555 $ERROR$
556 $FORMAT("ISR %1%'s ENTRY(%2%) is no in range[%3% - %4%]." ,
557 isrid , ISR.ENTRY[isrid] , AT(ISR_ENTRY_LIST , 0) ,
558 AT(ISR_ENTRY_LIST , (LENGTH(ISR_ENTRY_LIST) - 1)))$
559 $END$
560 $END$
561$ 割込みエントリが重複していないかのチェック
562 $IF LENGTH(FIND(USED_ENTRY , ISR.ENTRY[isrid]))$
563 $ERROR$
564 $FORMAT("ISR %1%'s ENTRY(%2%) is duplicated." , isrid , ISR.ENTRY[isrid])$
565 $END$
566 $END$
567
568$ 使用されている割込みエントリの追加
569 $USED_ENTRY = APPEND(USED_ENTRY , ISR.ENTRY[isrid])$
570$END$
571
572$ カテゴリ2 ISR割込み優先度の最大値がカテゴリ1割込み優先度の最大値を超えていないかチェック
573
574$ 値の算出
575$ISR1_MIN_PRIORITY = AT(ISR_PRIORITY_LIST , (LENGTH(ISR_PRIORITY_LIST) - 1))$
576$FOREACH isr1id ISR1_LIST$
577 $IF ISR.PRIORITY[isr1id] < ISR1_MIN_PRIORITY$
578 $ISR1_MIN_PRIORITY = ISR.PRIORITY[isr1id]$
579 $END$
580$END$
581
582$ISR2_MAX_PRIORITY = 0$
583$FOREACH isr2id ISR2_LIST$
584 $IF ISR.PRIORITY[isr2id] > ISR2_MAX_PRIORITY$
585 $ISR2_MAX_PRIORITY = ISR.PRIORITY[isr2id]$
586 $END$
587$END$
588
589$ 値の比較
590$IF ((LENGTH(ISR1_LIST) != 0)
591 && (LENGTH(ISR2_LIST) != 0)
592 && (ISR2_MAX_PRIORITY >= ISR1_MIN_PRIORITY))$
593 $ERROR$
594 $FORMAT("Max value of Category 2 ISR(%1%) is greater than min value of Category 1 ISR(%2%)." ,
595 ISR2_MAX_PRIORITY , ISR1_MIN_PRIORITY)$
596 $END$
597$END$
598
599
600$NL$
601
602#define IPL_MAXISR2$TAB$$ISR2_MAX_PRIORITY$$NL$
603const IPL ipl_maxisr2 = IPL_MAXISR2;$NL$
604$NL$
605
606const Priority isrinib_intpri[TNUM_ISR2] =$NL$
607{$NL$
608
609$JOINEACH isr2id ISR2_LIST " , \n"$
610 $TAB$(TPRI_MINISR + $ISR.PRIORITY[isr2id]$)$TAB$/* $isr2id$ */
611$END$
612$NL$};
613
614$NL$
615$NL$
616
617ResourceType isrcb_lastres[TNUM_ISR2];$NL$
618
619$NL$
620$NL$
621
622/****** Object APPMODE ******/$NL$
623/* 出力する情報はない */$NL$
624
625$NL$
626$NL$
627
628/* オブジェクト初期化関数の生成 */$NL$
629void object_initialize(void)$NL$
630{$NL$
631$IF LENGTH(ALARM.ID_LIST)$
632 $TAB$alarm_initialize();$NL$
633$END$
634
635$IF LENGTH(ISR.ID_LIST)$
636 $TAB$interrupt_initialize();$NL$
637$END$
638
639$IF LENGTH(RESOURCE.ID_LIST)$
640 $TAB$resource_initialize();$NL$
641$END$
642
643$IF LENGTH(TASK.ID_LIST)$
644 $TAB$task_initialize();$NL$
645$END$
646
647}$NL$
648
649
650$NL$
651
652
653$
654$ 依存部出力部
655$
656
657$INCLUDE "sys.tf"$
658$INCLUDE "cpu.tf"$
659
660$ EOF
661
Note: See TracBrowser for help on using the repository browser.