source: asp3_wo_tecs/trunk/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: 14.8 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$ kernel_cfg.hの生成
63$
64$FILE "kernel_cfg.h.new"$
65
66#define TNUM_ISRID $LENGTH(ISR.ID_LIST)$$NL$
67$FOREACH id ISR.ID_LIST$
68 #define $id$ $+id$$NL$
69$END$
70
71$
72$ kernel_cfg.cの生成
73$
74$FILE "kernel_cfg.c"$
75
76/*$NL$
77$SPC$* Interrupt Management Functions$NL$
78$SPC$*/$NL$
79$NL$
80
81$
82$ トレースログマクロのデフォルト定義
83$
84#ifndef LOG_ISR_ENTER$NL$
85#define LOG_ISR_ENTER(isrid)$NL$
86#endif /* LOG_ISR_ENTER */$NL$
87$NL$
88#ifndef LOG_ISR_LEAVE$NL$
89#define LOG_ISR_LEAVE(isrid)$NL$
90#endif /* LOG_ISR_LEAVE */$NL$
91$NL$
92
93$
94$ CRE_ISRで使用できる割込み番号とそれに対応する割込みハンドラ番号のデフォ
95$ ルト定義
96$
97$IF !LENGTH(INTNO_CREISR_VALID)$
98 $INTNO_CREISR_VALID = INTNO_VALID$
99$END$
100$IF !LENGTH(INHNO_CREISR_VALID)$
101 $INHNO_CREISR_VALID = INHNO_VALID$
102$END$
103
104$
105$ CFG_INTで使用できる割込み優å…
106ˆåº¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå®šç¾©
107$
108$IF !LENGTH(INTPRI_CFGINT_VALID)$
109 $INTPRI_CFGINT_VALID = RANGE(TMIN_INTPRI, TMAX_INTPRI)$
110$END$
111
112$
113$ 割込み番号と割込みハンドラ番号の変換テーブルの作成
114$
115$IF LENGTH(INTNO_CREISR_VALID) != LENGTH(INHNO_CREISR_VALID)$
116 $ERROR$length of `INTNO_CREISR_VALID' is different from length of `INHNO_CREISR_VALID'$END$
117$END$
118$i = 0$
119$FOREACH intno INTNO_CREISR_VALID$
120 $inhno = AT(INHNO_CREISR_VALID, i)$
121 $INHNO[intno] = inhno$
122 $INTNO[inhno] = intno$
123 $i = i + 1$
124$END$
125
126$
127$ 割込み要求ラインに関するエラーチェック
128$
129$ INTNO_LIST:処理済みの割込み番号のリスト(ここでのみ使用)
130$
131$FOREACH intno INT.ORDER_LIST$
132$ // intnoが割込み番号として正しくない場合(E_PAR)[NGKI2972]
133 $IF !LENGTH(FIND(INTNO_VALID, INT.INTNO[intno]))$
134 $ERROR INT.TEXT_LINE[intno]$E_PAR:$SPC$
135 $FORMAT(_("illegal %1% `%2%\' in %3%"),
136 "intno", INT.INTNO[intno], "CFG_INT")$
137 $END$
138 $END$
139
140$ // intnoがCFG_INTによって設定済みの場合(E_OBJ)[NGKI2976]
141 $IF LENGTH(FIND(INTNO_LIST, INT.INTNO[intno]))$
142 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
143 $FORMAT(_("%1% `%2%\' in %3% is duplicated"),
144 "intno", INT.INTNO[intno], "CFG_INT")$
145 $END$
146 $END$
147
148$ // intatrが無効の場合(E_RSATR)[NGKI2969]
149$ //(TA_ENAINT,TA_EDGE,TARGET_INTATR以外のビットがセットされている場合)
150 $IF (INT.INTATR[intno] & ~(TA_ENAINT|TA_EDGE|TARGET_INTATR)) != 0$
151 $ERROR INT.TEXT_LINE[intno]$E_RSATR:$SPC$
152 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
153 "intatr", INT.INTATR[intno], "intno",
154 INT.INTNO[intno], "CFG_INT")$
155 $END$
156 $END$
157
158$ // intpriがCFG_INTに対する割込み優å…
159ˆåº¦ã¨ã—て正しくない場合(E_PAR)
160$ // ï¼»NGKI2973ï¼½
161 $IF !LENGTH(FIND(INTPRI_CFGINT_VALID, INT.INTPRI[intno]))$
162 $ERROR INT.TEXT_LINE[intno]$E_PAR:$SPC$
163 $FORMAT(_("illegal %1% `%2%\' in %3%"),
164 "intpri", INT.INTPRI[intno], "CFG_INT")$
165 $END$
166 $END$
167
168$ // カーネル管理外に固定されているintnoに対して,intpriにTMIN_INTPRI
169$ // よりも小さい値が指定されなかった場合(E_OBJ)[NGKI2983]
170 $IF LENGTH(FIND(INTNO_FIX_NONKERNEL, intno))$
171 $IF INT.INTPRI[intno] >= TMIN_INTPRI$
172 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
173 $FORMAT(_("%1% `%2%\' must have higher priority than %3%"),
174 "intno", INT.INTNO[intno], "TMIN_INTPRI")$
175 $END$
176 $END$
177 $END$
178
179$ // カーネル管理に固定されているintnoに対して,intpriにTMIN_INTPRI
180$ // よりも小さい値が指定された場合(E_OBJ)[NGKI2984]
181 $IF LENGTH(FIND(INTNO_FIX_KERNEL, intno))$
182 $IF INT.INTPRI[intno] < TMIN_INTPRI$
183 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
184 $FORMAT(_("%1% `%2%\' must not have higher priority than %3%"),
185 "intno", INT.INTNO[intno], "TMIN_INTPRI")$
186 $END$
187 $END$
188 $END$
189
190 $INTNO_LIST = APPEND(INTNO_LIST, INT.INTNO[intno])$
191$END$
192
193$
194$ 割込みハンドラに関するエラーチェック
195$
196$ INHNO_LIST:処理済みの割込みハンドラ番号のリスト(ここでのみ使用)
197$
198$FOREACH inhno INH.ORDER_LIST$
199$ // inhnoが割込みハンドラ番号として正しくない場合(E_PAR)[NGKI3055]
200 $IF !LENGTH(FIND(INHNO_VALID, INH.INHNO[inhno]))$
201 $ERROR INH.TEXT_LINE[inhno]$E_PAR:$SPC$
202 $FORMAT(_("illegal %1% `%2%\' in %3%"),
203 "inhno", INH.INHNO[inhno], "DEF_INH")$
204 $END$
205 $END$
206
207$ // inhnoがDEF_INHによって設定済みの場合(E_OBJ)[NGKI3063]
208 $IF LENGTH(FIND(INHNO_LIST, INH.INHNO[inhno]))$
209 $ERROR INH.TEXT_LINE[inhno]$E_OBJ:$SPC$
210 $FORMAT(_("%1% `%2%\' in %3% is duplicated"),
211 "inhno", INH.INHNO[inhno], "DEF_INH")$
212 $END$
213 $END$
214
215$ // inhatrが無効の場合(E_RSATR)[NGKI3052]
216$ //(TARGET_INHATR以外のビットがセットされている場合)
217 $IF (INH.INHATR[inhno] & ~TARGET_INHATR) != 0$
218 $ERROR INH.TEXT_LINE[inhno]$E_RSATR:$SPC$
219 $FORMAT(_("illegal %1% `%2%\' of %3% `%4%\' in %5%"),
220 "inhatr", INH.INHATR[inhno], "inhno",
221 INH.INHNO[inhno], "DEF_INH")$
222 $END$
223 $END$
224
225$ // カーネル管理外に固定されているinhnoに対して,inhatrにTA_NONKERNEL
226$ // が指定されていない場合(E_RSATR)[NGKI3067]
227 $IF LENGTH(FIND(INHNO_FIX_NONKERNEL, inhno))$
228 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
229 $ERROR INH.TEXT_LINE[inhno]$E_RSATR:$SPC$
230 $FORMAT(_("%1% `%2%\' must be non-kernel interrupt"),
231 "inhno", INH.INHNO[inhno])$
232 $END$
233 $END$
234 $END$
235
236$ // カーネル管理に固定されているinhnoに対して,inhatrにTA_NONKERNEL
237$ // が指定されている場合(E_RSATR)[NGKI3068]
238 $IF LENGTH(FIND(INHNO_FIX_KERNEL, inhno))$
239 $IF (INH.INHATR[inhno] & TA_NONKERNEL) != 0$
240 $ERROR INH.TEXT_LINE[inhno]$E_RSATR:$SPC$
241 $FORMAT(_("%1% `%2%\' must not be non-kernel interrupt"),
242 "inhno", INH.INHNO[inhno])$
243 $END$
244 $END$
245 $END$
246
247 $IF LENGTH(INTNO[INH.INHNO[inhno]])$
248 $intno = INTNO[INH.INHNO[inhno]]$
249$ // inhnoに対応するintnoに対するCFG_INTがない場合(E_OBJ)[NGKI3062]
250 $IF !LENGTH(INT.INTNO[intno])$
251 $ERROR INH.TEXT_LINE[inhno]$E_OBJ:$SPC$
252 $FORMAT(_("%1% `%2%\' corresponding to %3% `%4%\' is not configured with %5%"),
253 "intno", intno, "inhno", INH.INHNO[inhno], "CFG_INT")$
254 $END$
255 $ELSE$
256 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
257$ // inhatrにTA_NONKERNELが指定されておらず,inhnoに対応
258$ // するintnoに対してCFG_INTで設定された割込み優å…
259ˆåº¦ãŒ
260$ // TMIN_INTPRIよりも小さい場合(E_OBJ)[NGKI3065]
261 $IF INT.INTPRI[intno] < TMIN_INTPRI$
262 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
263 $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"),
264 "intpri", INT.INTPRI[intno], "inhno",
265 INH.INHNO[inhno], "TMIN_INTPRI")$
266 $END$
267 $END$
268 $ELSE$
269$ // inhatrにTA_NONKERNELが指定されており,inhnoに対応
270$ // するintnoに対してCFG_INTで設定された割込み優å…
271ˆåº¦ãŒ
272$ // TMIN_INTPRI以上である場合(E_OBJ)[NGKI3066]
273 $IF INT.INTPRI[intno] >= TMIN_INTPRI$
274 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
275 $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is lower than or equal to %5%"),
276 "intpri", INT.INTPRI[intno], "inhno",
277 INH.INHNO[inhno], "TMIN_INTPRI")$
278 $END$
279 $END$
280 $END$
281 $END$
282 $END$
283
284 $INHNO_LIST = APPEND(INHNO_LIST, INH.INHNO[inhno])$
285$END$
286
287$
288$ 割込みサービスルーチン(ISR)に関するエラーチェックと割込みハンドラの生成
289$
290$FOREACH id ISR.ID_LIST$
291$ // isratrが無効の場合(E_RSATR)[NGKI2998]
292$ //(TARGET_ISRATR以外のビットがセットされている場合)
293 $IF (ISR.ISRATR[id] & ~TARGET_ISRATR) != 0$
294 $ERROR ISR.TEXT_LINE[id]$E_RSATR:$SPC$
295 $FORMAT(_("illegal %1% `%2%\' in %3%"),
296 "isratr", ISR.ISRATR[id], "CRE_ISR")$
297 $END$
298 $END$
299
300$ // intnoがCRE_ISRに対する割込み番号として正しくない場合(E_PAR)
301$ // ï¼»NGKI3003ï¼½
302 $IF !LENGTH(FIND(INTNO_CREISR_VALID, ISR.INTNO[id]))$
303 $ERROR ISR.TEXT_LINE[id]$E_PAR:$SPC$
304 $FORMAT(_("illegal %1% `%2%\' in %3%"),
305 "intno", ISR.INTNO[id], "CRE_ISR")$
306 $END$
307 $END$
308
309$ // (TMIN_ISRPRI <= isrpri && isrpri <= TMAX_ISRPRI)でない場合(E_PAR)
310$ // ï¼»NGKI3005ï¼½
311 $IF !(TMIN_ISRPRI <= ISR.ISRPRI[id] && ISR.ISRPRI[id] <= TMAX_ISRPRI)$
312 $ERROR ISR.TEXT_LINE[id]$E_PAR:$SPC$
313 $FORMAT(_("illegal %1% `%2%\' in %3%"),
314 "isrpri", ISR.ISRPRI[id], "CRE_ISR")$
315 $END$
316 $END$
317$END$
318
319$FOREACH intno INTNO_CREISR_VALID$
320 $inhno = INHNO[intno]$
321
322$ // 割込み番号intnoに対して登録されたISRのリストの作成
323 $isrid_list = {}$
324 $FOREACH id ISR.ID_LIST$
325 $IF ISR.INTNO[id] == intno$
326 $isrid_list = APPEND(isrid_list, id)$
327 $id_for_error = id$
328 $END$
329 $END$
330
331$ // 割込み番号intnoに対して登録されたISRが存在する場合
332 $IF LENGTH(isrid_list) > 0$
333$ // intnoに対応するinhnoに対してDEF_INHがある場合(E_OBJ)[NGKI3013]
334 $IF LENGTH(INH.INHNO[inhno])$
335 $ERROR ISR.TEXT_LINE[id_for_error]$E_OBJ:$SPC$
336 $FORMAT(_("%1% `%2%\' in %3% is duplicated with %4% `%5%\'"),
337 "intno", ISR.INTNO[id_for_error],
338 "CRE_ISR", "inhno", INH.INHNO[inhno])$
339 $END$
340 $END$
341
342$ // intnoに対するCFG_INTがない場合(E_OBJ)[NGKI3012]
343 $IF !LENGTH(INT.INTNO[intno])$
344 $ERROR ISR.TEXT_LINE[id_for_error]$E_OBJ:$SPC$
345 $FORMAT(_("%1% `%2%\' is not configured with %3%"),
346 "intno", ISR.INTNO[id_for_error], "CFG_INT")$
347 $END$
348 $ELSE$
349$ // intnoに対してCFG_INTで設定された割込み優å…
350ˆåº¦ãŒTMIN_INTPRI
351$ // よりも小さい場合(E_OBJ)[NGKI3014]
352 $IF INT.INTPRI[intno] < TMIN_INTPRI$
353 $ERROR INT.TEXT_LINE[intno]$E_OBJ:$SPC$
354 $FORMAT(_("%1% `%2%\' configured for %3% `%4%\' is higher than %5%"),
355 "intpri", INT.INTPRI[intno], "intno",
356 ISR.INTNO[id_for_error], "TMIN_INTPRI")$
357 $END$
358 $END$
359 $END$
360
361$ // DEF_INH(inhno, { TA_NULL, _kernel_inthdr_<intno> } );
362 $INH.INHNO[inhno] = inhno$
363 $INH.INHATR[inhno] = VALUE("TA_NULL", 0)$
364 $INH.INTHDR[inhno] = CONCAT("_kernel_inthdr_", intno)$
365 $INH.ORDER_LIST = APPEND(INH.ORDER_LIST, inhno)$
366
367$ // ISR用の割込みハンドラ
368 void$NL$
369 _kernel_inthdr_$intno$(void)$NL$
370 {$NL$
371$ // ISRを優å…
372ˆåº¦é †ã«å‘¼ã³å‡ºã™
373 $JOINEACH id SORT(isrid_list, "ISR.ISRPRI") "\n\tif (sense_lock()) {\n\t\tunlock_cpu();\n\t}\n\n"$
374 $TAB$LOG_ISR_ENTER($ISR.ISRID[id]$);$NL$
375 $TAB$((ISR)($ISR.ISR[id]$))((intptr_t)($ISR.EXINF[id]$));$NL$
376 $TAB$LOG_ISR_LEAVE($ISR.ISRID[id]$);$NL$
377 $END$
378 }$NL$
379 $END$
380$END$
381$NL$
382
383$
384$ 割込みハンドラのための標準的な初期化情
385報の生成
386$
387$IF !OMIT_INITIALIZE_INTERRUPT || USE_INHINIB_TABLE$
388
389$
390$ 定義する割込みハンドラの数
391$
392#define TNUM_DEF_INHNO $LENGTH(INH.ORDER_LIST)$$NL$
393const uint_t _kernel_tnum_def_inhno = TNUM_DEF_INHNO;$NL$
394$NL$
395
396$
397$ 割込みハンドラのエントリ
398$
399$FOREACH inhno INH.ORDER_LIST$
400 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
401 INTHDR_ENTRY($INH.INHNO[inhno]$, $+INH.INHNO[inhno]$,$SPC$
402 $INH.INTHDR[inhno]$)$NL$
403 $END$
404$END$$NL$
405
406$
407$ 割込みハンドラ初期化ブロック
408$
409$IF LENGTH(INH.ORDER_LIST)$
410 const INHINIB _kernel_inhinib_table[TNUM_DEF_INHNO] = {$NL$
411 $JOINEACH inhno INH.ORDER_LIST ",\n"$
412 $TAB${$SPC$
413 ($INH.INHNO[inhno]$),$SPC$
414 ($INH.INHATR[inhno]$),$SPC$
415 $IF (INH.INHATR[inhno] & TA_NONKERNEL) == 0$
416 (FP)(INT_ENTRY($INH.INHNO[inhno]$, $INH.INTHDR[inhno]$))
417 $ELSE$
418 (FP)($INH.INTHDR[inhno]$)
419 $END$$SPC$
420 }$END$$NL$
421 };$NL$
422$ELSE$
423 TOPPERS_EMPTY_LABEL(const INHINIB, _kernel_inhinib_table);$NL$
424$END$$NL$
425$END$
426
427$
428$ 割込み要求ラインのための標準的な初期化情
429報の生成
430$
431$IF !OMIT_INITIALIZE_INTERRUPT || USE_INTINIB_TABLE$
432
433$
434$ 設定する割込み要求ラインの数
435$
436#define TNUM_CFG_INTNO $LENGTH(INT.ORDER_LIST)$$NL$
437const uint_t _kernel_tnum_cfg_intno = TNUM_CFG_INTNO;$NL$
438$NL$
439
440$
441$ 割込み要求ライン初期化ブロック
442$
443$IF LENGTH(INT.ORDER_LIST)$
444 const INTINIB _kernel_intinib_table[TNUM_CFG_INTNO] = {$NL$
445 $JOINEACH intno INT.ORDER_LIST ",\n"$
446 $TAB${$SPC$
447 ($INT.INTNO[intno]$),$SPC$
448 ($INT.INTATR[intno]$),$SPC$
449 ($INT.INTPRI[intno]$)$SPC$
450 }$END$$NL$
451 };$NL$
452$ELSE$
453 TOPPERS_EMPTY_LABEL(const INTINIB, _kernel_intinib_table);$NL$
454$END$$NL$
455$END$
456
457$
458$ 割込み管理機能初期化関数
459$
460$initfuncs = APPEND(initfuncs, "_kernel_initialize_interrupt();")$
Note: See TracBrowser for help on using the repository browser.