source: asp3_wo_tecs/trunk/extension/dcre/kernel/interrupt.tf@ 302

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

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

File size: 17.0 KB
Line 
1$
2$ TOPPERS/ASP Kernel
3$ Toyohashi Open Platform for Embedded Real-Time Systems/
4$ Advanced Standard Profile Kernel
5$
6$ Copyright (C) 2007 by TAKAGI Nobuhisa
7$ Copyright (C) 2007-2015 by Embedded and Real-Time Systems Laboratory
8$ Graduate School of Information Science, Nagoya Univ., JAPAN
9$
10$ 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13$ 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17$ スコード中に含まれていること.
18$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19$ 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22$ 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24$ の無保証規定を掲載すること.
25$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26$ 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28$ と.
29$ (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
33$ (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36$ 報告すること.
37$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38$ 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42$ 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44$ å…
45è²¬ã™ã‚‹ã“と.
46$
47$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52$ の責任を負わない.
53$
54$ $Id: interrupt.tf 480 2016-01-03 07:37:12Z ertl-hiro $
55$
56
57$
58$ 割込み管理機能のテンプレートファイル
59$
60
61$
62$ AID_ISRの処理
63$
64$num_aisrid = 0$
65$FOREACH i AISR.ORDER_LIST$
66$ // noisrが負の場合(E_PAR)
67 $IF AISR.NOISR[i] < 0$
68 $ERROR AISR.TEXT_LINE[i]$E_PAR:$SPC$
69 $FORMAT(_("illegal %1% `%2%\' in %3%"),
70 "noisr", AISR.NOISR[i], "AID_ISR")$
71 $END$
72 $END$
73 $num_aisrid = num_aisrid + AISR.NOISR[i]$
74$END$
75$num_isrid = LENGTH(ISR.ID_LIST) + num_aisrid$
76
77$
78$ kernel_cfg.hの生成
79$
80$FILE "kernel_cfg.h.new"$
81
82#define TNUM_ISRID $num_isrid$$NL$
83$FOREACH id ISR.ID_LIST$
84 #define $id$ $+id$$NL$
85$END$
86
87$
88$ kernel_cfg.cの生成
89$
90$FILE "kernel_cfg.c"$
91
92/*$NL$
93$SPC$* Interrupt Management Functions$NL$
94$SPC$*/$NL$
95$NL$
96
97$
98$ CRE_ISRで使用できる割込み番号とそれに対応する割込みハンドラ番号のデフォ
99$ ルト定義
100$
101$IF !LENGTH(INTNO_CREISR_VALID)$
102 $INTNO_CREISR_VALID = INTNO_VALID$
103$END$
104$IF !LENGTH(INHNO_CREISR_VALID)$
105 $INHNO_CREISR_VALID = INHNO_VALID$
106$END$
107
108$
109$ CFG_INTで使用できる割込み優å…
110ˆåº¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå®šç¾©
111$
112$IF !LENGTH(INTPRI_CFGINT_VALID)$
113 $INTPRI_CFGINT_VALID = RANGE(TMIN_INTPRI, TMAX_INTPRI)$
114$END$
115
116$
117$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
118$
119$IF LENGTH(INTNO_CREISR_VALID) != LENGTH(INHNO_CREISR_VALID)$
120 $ERROR$length of `INTNO_CREISR_VALID' is different from length of `INHNO_CREISR_VALID'$END$
121$END$
122$i = 0$
123$FOREACH intno INTNO_CREISR_VALID$
124 $inhno = AT(INHNO_CREISR_VALID, i)$
125 $INHNO[intno] = inhno$
126 $INTNO[inhno] = intno$
127 $i = i + 1$
128$END$
129
130$
131$ 割込み要求ラインに関するエラーチェック
132$
133$ INTNO_LIST:処理済みの割込み番号のリスト(ここでのみ使用)
134$
135$FOREACH intno INT.ORDER_LIST$
136$ // intnoが割込み番号として正しくない場合(E_PAR)[NGKI2972]
137 $IF !LENGTH(FIND(INTNO_VALID, INT.INTNO[intno]))$
138 $ERROR INT.TEXT_LINE[intno]$E_PAR:$SPC$
139 $FORMAT(_("illegal %1% `%2%\' in %3%"),
140 "intno", INT.INTNO[intno], "CFG_INT")$
141 $END$
142 $END$
143
144$ // intnoがCFG_INTによって設定済みの場合(E_OBJ)[NGKI2976]
145 $IF LENGTH(FIND(INTNO_LIST, INT.INTNO[intno]))$
146 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
147 $FORMAT(_("%1% `%2%\' in %3% is duplicated"),
148 "intno", INT.INTNO[intno], "CFG_INT")$
149 $END$
150 $END$
151
152$ // intatrが無効の場合(E_RSATR)[NGKI2969]
153$ //(TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合)
154 $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
155 $ERROR INT.TEXT_LINE[intno]$E_RSATR:$SPC$
156 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
157 "intatr", INT.INTATR[intno], "intno",
158 INT.INTNO[intno], "CFG_INT")$
159 $END$
160 $END$
161
162$ // intpriがCFG_INTに対する割込み優å…
163ˆåº¦ã¨ã—て正しくない場合(E_PAR)
164$ // ï¼»NGKI2973ï¼½
165 $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
166 $ERROR INT.TEXT_LINE[intno]$E_PAR:$SPC$
167 $FORMAT(_("illegal %1% `%2%\' in %3%"),
168 "intpri", INT.INTPRI[intno], "CFG_INT")$
169 $END$
170 $END$
171
172$ // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
173$ // よりも小さい値が指定されなかった場合(E_OBJ)[NGKI2983]
174 $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
175 $IF INT.INTPRI[intno] >= TMIN_INTPRI$
176 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
177 $FORMAT(_("%1% `%2%\' must have higher priority than %3%"),
178 "intno", INT.INTNO[intno], "TMIN_INTPRI")$
179 $END$
180 $END$
181 $END$
182
183$ // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
184$ // よりも小さい値が指定された場合(E_OBJ)[NGKI2984]
185 $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
186 $IF INT.INTPRI[intno] < TMIN_INTPRI$
187 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
188 $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"),
189 "intno", INT.INTNO[intno], "TMIN_INTPRI")$
190 $END$
191 $END$
192 $END$
193
194 $INTNO_LIST = APPEND(INTNO_LIST, INT.INTNO[intno])$
195$END$
196
197$
198$ 割込みハンドラに関するエラーチェック
199$
200$ INHNO_LIST:処理済みの割込みハンドラ番号のリスト(ここでのみ使用)
201$
202$FOREACH inhno INH.ORDER_LIST$
203$ // inhnoが割込みハンドラ番号として正しくない場合(E_PAR)[NGKI3055]
204 $IF !LENGTH(FIND(INHNO_VALID, INH.INHNO[inhno]))$
205 $ERROR INH.TEXT_LINE[inhno]$E_PAR:$SPC$
206 $FORMAT(_("illegal %1% `%2%\' in %3%"),
207 "inhno", INH.INHNO[inhno], "DEF_INH")$
208 $END$
209 $END$
210
211$ // inhnoがDEF_INHによって設定済みの場合(E_OBJ)[NGKI3063]
212 $IF LENGTH(FIND(INHNO_LIST, INH.INHNO[inhno]))$
213 $ERROR INH.TEXT_LINE[inhno]$E_OBJ:$SPC$
214 $FORMAT(_("%1% `%2%\' in %3% is duplicated"),
215 "inhno", INH.INHNO[inhno], "DEF_INH")$
216 $END$
217 $END$
218
219$ // inhatrが無効の場合(E_RSATR)[NGKI3052]
220$ //(TARGET_INHATR以外のビットがセットされている場合)
221 $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
222 $ERROR INH.TEXT_LINE[inhno]$E_RSATR:$SPC$
223 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
224 "inhatr", INH.INHATR[inhno], "inhno",
225 INH.INHNO[inhno], "DEF_INH")$
226 $END$
227 $END$
228
229$ // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
230$ // が指定されていない場合(E_RSATR)[NGKI3067]
231 $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
232 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
233 $ERROR INH.TEXT_LINE[inhno]$E_RSATR:$SPC$
234 $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"),
235 "inhno", INH.INHNO[inhno])$
236 $END$
237 $END$
238 $END$
239
240$ // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
241$ // が指定されている場合(E_RSATR)[NGKI3068]
242 $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
243 $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
244 $ERROR INH.TEXT_LINE[inhno]$E_RSATR:$SPC$
245 $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"),
246 "inhno", INH.INHNO[inhno])$
247 $END$
248 $END$
249 $END$
250
251 $IF LENGTH(INTNO[INH.INHNO[inhno]])$
252 $intno = INTNO[INH.INHNO[inhno]]$
253$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)[NGKI3062]
254 $IF !LENGTH(INT.INTNO[intno])$
255 $ERROR INH.TEXT_LINE[inhno]$E_OBJ:$SPC$
256 $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"),
257 "intno", intno, "inhno", INH.INHNO[inhno], "CFG_INT")$
258 $END$
259 $ELSE$
260 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
261$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
262$ // するintnoに対してCFG_INTで設定された割込み優å…
263ˆåº¦ãŒ
264$ // TMIN_INTPRIよりも小さい場合(E_OBJ)[NGKI3065]
265 $IF INT.INTPRI[intno] < TMIN_INTPRI$
266 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
267 $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"),
268 "intpri", INT.INTPRI[intno], "inhno",
269 INH.INHNO[inhno], "TMIN_INTPRI")$
270 $END$
271 $END$
272 $ELSE$
273$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
274$ // するintnoに対してCFG_INTで設定された割込み優å…
275ˆåº¦ãŒ
276$ // TMIN_INTPRI以上である場合(E_OBJ)[NGKI3066]
277 $IF INT.INTPRI[intno] >= TMIN_INTPRI$
278 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
279 $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"),
280 "intpri", INT.INTPRI[intno], "inhno",
281 INH.INHNO[inhno], "TMIN_INTPRI")$
282 $END$
283 $END$
284 $END$
285 $END$
286 $END$
287
288 $INHNO_LIST = APPEND(INHNO_LIST, INH.INHNO[inhno])$
289$END$
290
291$
292$ 割込みサービスルーチン(ISR)に関するエラーチェック
293$
294$FOREACH id ISR.ID_LIST$
295$ // isratrが無効の場合(E_RSATR)[NGKI2998]
296$ //(TARGET_ISRATR以外のビットがセットされている場合)
297 $IF (ISR.ISRATR[id] & ~TARGET_ISRATR) != 0$
298 $ERROR ISR.TEXT_LINE[id]$E_RSATR:$SPC$
299 $FORMAT(_("illegal %1% `%2%\' in %3%"),
300 "isratr", ISR.ISRATR[id], "CRE_ISR")$
301 $END$
302 $END$
303
304$ // intnoがCRE_ISRに対する割込み番号として正しくない場合(E_PAR)
305$ // ï¼»NGKI3003ï¼½
306 $IF !LENGTH(FIND(INTNO_CREISR_VALID, ISR.INTNO[id]))$
307 $ERROR ISR.TEXT_LINE[id]$E_PAR:$SPC$
308 $FORMAT(_("illegal %1% `%2%\' in %3%"),
309 "intno", ISR.INTNO[id], "CRE_ISR")$
310 $END$
311 $END$
312
313$ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
314$ // ï¼»NGKI3005ï¼½
315 $IF !(TMIN_ISRPRI <= ISR.ISRPRI[id] && ISR.ISRPRI[id] <= TMAX_ISRPRI)$
316 $ERROR ISR.TEXT_LINE[id]$E_PAR:$SPC$
317 $FORMAT(_("illegal %1% `%2%\' in %3%"),
318 "isrpri", ISR.ISRPRI[id], "CRE_ISR")$
319 $END$
320 $END$
321$END$
322
323$FOREACH intno INTNO_CREISR_VALID$
324 $inhno = INHNO[intno]$
325
326$ // 割込み番号intnoに対して登録されたISRのリストの作成
327 $isrid_list = {}$
328 $FOREACH id ISR.ID_LIST$
329 $IF ISR.INTNO[id] == intno$
330 $isrid_list = APPEND(isrid_list, id)$
331 $id_for_error = id$
332 $END$
333 $END$
334
335$ // 割込み番号intnoに対して登録されたISRが存在する場合
336 $IF LENGTH(isrid_list) > 0$
337$ // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
338 $IF LENGTH(INH.INHNO[inhno])$
339 $ERROR ISR.TEXT_LINE[id_for_error]$E_OBJ:$SPC$
340 $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"),
341 "intno", ISR.INTNO[id_for_error],
342 "CRE_ISR", "inhno", INH.INHNO[inhno])$
343 $END$
344 $END$
345
346$ // intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
347 $IF !LENGTH(INT.INTNO[intno])$
348 $ERROR ISR.TEXT_LINE[id_for_error]$E_OBJ:$SPC$
349 $FORMAT(_("%1% `%2%\' is not configured with %3%"),
350 "intno", ISR.INTNO[id_for_error], "CFG_INT")$
351 $END$
352 $ELSE$
353$ // intnoに対してCFG_INTで設定された割込み優å…
354ˆåº¦ãŒTMIN_INTPRI
355$ // よりも小さい場合(E_OBJ)[NGKI3014]
356 $IF INT.INTPRI[intno] < TMIN_INTPRI$
357 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
358 $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"),
359 "intpri", INT.INTPRI[intno], "intno",
360 ISR.INTNO[id_for_error], "TMIN_INTPRI")$
361 $END$
362 $END$
363 $END$
364 $END$
365$END$
366
367$
368$ 割込みサービスルーチン(ISR)管理のデータ構造
369$
370$intno_isr_list = {}$
371$FOREACH intno INTNO_CREISR_VALID$
372 $inhno = INHNO[intno]$
373 $IF LENGTH(INT.INTNO[intno]) && !LENGTH(INH.INHNO[inhno])$
374 $intno_isr_list = APPEND(intno_isr_list, intno)$
375 $END$
376$END$
377
378$INTNO_ISR = {}$
379$i = 0$
380$FOREACH intno SORT(intno_isr_list, "INT.INTNO")$
381 $INTNO_ISR = APPEND(INTNO_ISR, intno)$
382 $ISR_QUEUE_HEADER[intno] = FORMAT("&(_kernel_isr_queue_table[%d])", i)$
383 $i = i + 1$
384$END$
385
386const uint_t _kernel_tnum_isr_queue = $LENGTH(INTNO_ISR)$;$NL$
387$NL$
388
389$IF LENGTH(INTNO_ISR)$
390 const ISR_ENTRY _kernel_isr_queue_list[$LENGTH(INTNO_ISR)$] = {$NL$
391 $JOINEACH intno INTNO_ISR ",\n"$
392 $TAB${ $intno$, $ISR_QUEUE_HEADER[intno]$ }
393 $END$$NL$
394 };$NL$
395$ELSE$
396 TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
397$END$$NL$
398
399$IF LENGTH(INTNO_ISR)$
400 QUEUE _kernel_isr_queue_table[$LENGTH(INTNO_ISR)$];$NL$
401$ELSE$
402 TOPPERS_EMPTY_LABEL(QUEUE, _kernel_isr_queue_table);$NL$
403$END$$NL$
404
405$
406$ 割込みサービスルーチン(ISR)呼出しのための割込みハンドラ
407$
408$FOREACH intno INTNO_ISR$
409 $inhno = INHNO[intno]$
410
411$ // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
412 $INH.INHNO[inhno] = inhno$
413 $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
414 $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
415 $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
416
417$ // ISR用の割込みハンドラ
418 void$NL$
419 _kernel_inthdr_$intno$(void)$NL$
420 {$NL$
421 $TAB$_kernel_call_isr($ISR_QUEUE_HEADER[intno]$);$NL$
422 }$NL$
423 $NL$
424$END$
425
426$
427$ 静的に生成された割込みサービスルーチンの数
428$
429#define TNUM_SISRID $LENGTH(ISR.ID_LIST)$$NL$
430$NL$
431
432$
433$ 割込みサービスルーチンID番号の最大値
434$
435const ID _kernel_tmax_isrid = (TMIN_ISRID + TNUM_ISRID - 1);$NL$
436const ID _kernel_tmax_sisrid = (TMIN_ISRID + TNUM_SISRID - 1);$NL$
437$NL$
438
439$
440$ 割込みサービスルーチン初期化ブロックの生成
441$
442$IF LENGTH(ISR.ID_LIST)$
443 const ISRINIB _kernel_isrinib_table[TNUM_SISRID] = {$NL$
444 $JOINEACH id ISR.ID_LIST ",\n"$
445 $TAB${$SPC$
446 ($ISR.ISRATR[id]$), ($ISR.EXINF[id]$),$SPC$
447 ($ISR_QUEUE_HEADER[ISR.INTNO[id]]$),$SPC$
448 (ISR)($ISR.ISR[id]$), ($ISR.ISRPRI[id]$)$SPC$
449 }$END$$NL$
450 };$NL$
451$ELSE$
452 TOPPERS_EMPTY_LABEL(const ISRINIB, _kernel_isrinib_table);$NL$
453$END$
454$NL$
455
456$
457$ 動的生成割込みサービスルーチン用の割込みサービスルーチン初期化ブロック
458$
459$IF num_aisrid > 0$
460 ISRINIB _kernel_aisrinib_table[$num_aisrid$];$NL$
461$ELSE$
462 TOPPERS_EMPTY_LABEL(ISRINIB, _kernel_aisrinib_table);$NL$
463$END$
464$NL$
465
466$
467$ 割込みサービスルーチン管理ブロック
468$
469$IF num_isrid > 0$
470 ISRCB _kernel_isrcb_table[TNUM_ISRID];$NL$
471$ELSE$
472 TOPPERS_EMPTY_LABEL(ISRCB, _kernel_isrcb_table);$NL$
473$END$
474$NL$
475
476$
477$ 割込みハンドラのための標準的な初期化情
478報の生成
479$
480$IF !OMIT_INITIALIZE_INTERRUPT || USE_INHINIB_TABLE$
481
482$
483$ 定義する割込みハンドラの数
484$
485#define TNUM_DEF_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
486const uint_t _kernel_tnum_def_inhno = TNUM_DEF_INHNO;$NL$
487$NL$
488
489$
490$ 割込みハンドラのエントリ
491$
492$FOREACH inhno INH.ORDER_LIST$
493 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
494 INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$,$SPC$
495 $INH.INTHDR[inhno]$)$NL$
496 $END$
497$END$$NL$
498
499$
500$ 割込みハンドラ初期化ブロック
501$
502$IF LENGTH(INH.ORDER_LIST)$
503 const INHINIB _kernel_inhinib_table[TNUM_DEF_INHNO] = {$NL$
504 $JOINEACH inhno INH.ORDER_LIST ",\n"$
505 $TAB${$SPC$
506 ($INH.INHNO[inhno]$),$SPC$
507 ($INH.INHATR[inhno]$),$SPC$
508 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
509 (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$))
510 $ELSE$
511 (FP)($INH.INTHDR[inhno]$)
512 $END$$SPC$
513 }$END$$NL$
514 };$NL$
515$ELSE$
516 TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
517$END$$NL$
518$END$
519
520$
521$ 割込み要求ラインのための標準的な初期化情
522報の生成
523$
524$IF !OMIT_INITIALIZE_INTERRUPT || USE_INTINIB_TABLE$
525
526$
527$ 設定する割込み要求ラインの数
528$
529#define TNUM_CFG_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
530const uint_t _kernel_tnum_cfg_intno = TNUM_CFG_INTNO;$NL$
531$NL$
532
533$
534$ 割込み要求ライン初期化ブロック
535$
536$IF LENGTH(INT.ORDER_LIST)$
537 const INTINIB _kernel_intinib_table[TNUM_CFG_INTNO] = {$NL$
538 $JOINEACH intno INT.ORDER_LIST ",\n"$
539 $TAB${$SPC$
540 ($INT.INTNO[intno]$),$SPC$
541 ($INT.INTATR[intno]$),$SPC$
542 ($INT.INTPRI[intno]$)$SPC$
543 }$END$$NL$
544 };$NL$
545$ELSE$
546 TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
547$END$$NL$
548$END$
549
550$
551$ 割込み管理機能初期化関数
552$
553$initfuncs = APPEND(initfuncs, "_kernel_initialize_interrupt();")$
554$IF num_isrid > 0$
555 $initfuncs = APPEND(initfuncs, "_kernel_initialize_isr();")$
556$END$
Note: See TracBrowser for help on using the repository browser.