source: atk2-sc3-1.4.0-ntisr/kernel/interrupt_manage.c

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

File size: 12.6 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2004-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
22 *
23 * 上記著作権者
24は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
25 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
26 * 変・再é…
27å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
28 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
29 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
30 * スコード中に含まれていること.
31 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
32 * 用できる形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
35 * 者
36マニュアルなど)に,上記の著作権表示,この利用条件および下記
37 * の無保証規定を掲載すること.
38 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
39 * 用できない形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
41 * と.
42 * (a) 再é…
43å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
44マニュアルなど)に,上記の著
45 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
46 * (b) 再é…
47å¸ƒã®å½¢æ…
48‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
49 * 報告すること.
50 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
51 * 害からも,上記著作権者
52およびTOPPERSプロジェクトをå…
53è²¬ã™ã‚‹ã“と.
54 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
55 * 由に基づく請求からも,上記著作権者
56およびTOPPERSプロジェクトを
57 * å…
58è²¬ã™ã‚‹ã“と.
59 *
60 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
61 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
62 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
63 * 用する者
64に対して,AUTOSARパートナーになることを求めている.
65 *
66 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
67お
68 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
69 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
70 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
71 * の責任を負わない.
72 *
73 * $Id: interrupt_manage.c 434 2015-12-09 12:24:27Z witz-itoyo $
74 */
75
76/*
77 * 割込み管理モジュール
78 */
79
80#include "kernel_impl.h"
81#include "check.h"
82#include "interrupt.h"
83
84/*
85 * トレースログマクロのデフォルト定義
86 */
87#ifndef LOG_DISINT_ENTER
88#define LOG_DISINT_ENTER()
89#endif /* LOG_DISINT_ENTER */
90
91#ifndef LOG_DISINT_LEAVE
92#define LOG_DISINT_LEAVE()
93#endif /* LOG_DISINT_LEAVE */
94
95#ifndef LOG_ENAINT_ENTER
96#define LOG_ENAINT_ENTER()
97#endif /* LOG_ENAINT_ENTER */
98
99#ifndef LOG_ENAINT_LEAVE
100#define LOG_ENAINT_LEAVE()
101#endif /* LOG_ENAINT_LEAVE */
102
103#ifndef LOG_SUSALL_ENTER
104#define LOG_SUSALL_ENTER()
105#endif /* LOG_SUSALL_ENTER */
106
107#ifndef LOG_SUSALL_LEAVE
108#define LOG_SUSALL_LEAVE()
109#endif /* LOG_SUSALL_LEAVE */
110
111#ifndef LOG_RSMALL_ENTER
112#define LOG_RSMALL_ENTER()
113#endif /* LOG_RSMALL_ENTER */
114
115#ifndef LOG_RSMALL_LEAVE
116#define LOG_RSMALL_LEAVE()
117#endif /* LOG_RSMALL_LEAVE */
118
119#ifndef LOG_SUSOSI_ENTER
120#define LOG_SUSOSI_ENTER()
121#endif /* LOG_SUSOSI_ENTER */
122
123#ifndef LOG_SUSOSI_LEAVE
124#define LOG_SUSOSI_LEAVE()
125#endif /* LOG_SUSOSI_LEAVE */
126
127#ifndef LOG_RSMOSI_ENTER
128#define LOG_RSMOSI_ENTER()
129#endif /* LOG_RSMOSI_ENTER */
130
131#ifndef LOG_RSMOSI_LEAVE
132#define LOG_RSMOSI_LEAVE()
133#endif /* LOG_RSMOSI_LEAVE */
134
135#ifndef LOG_GETISRID_ENTER
136#define LOG_GETISRID_ENTER()
137#endif /* LOG_GETISRID_ENTER */
138
139#ifndef LOG_GETISRID_LEAVE
140#define LOG_GETISRID_LEAVE(ercd)
141#endif /* LOG_GETISRID_LEAVE */
142
143#ifndef LOG_DISINTSRC_ENTER
144#define LOG_DISINTSRC_ENTER(isrid)
145#endif /* LOG_DISINTSRC_ENTER */
146
147#ifndef LOG_DISINTSRC_LEAVE
148#define LOG_DISINTSRC_LEAVE(ercd)
149#endif /* LOG_DISINTSRC_LEAVE */
150
151#ifndef LOG_ENAINTSRC_ENTER
152#define LOG_ENAINTSRC_ENTER(isrid)
153#endif /* LOG_ENAINTSRC_ENTER */
154
155#ifndef LOG_ENAINTSRC_LEAVE
156#define LOG_ENAINTSRC_LEAVE(ercd)
157#endif /* LOG_ENAINTSRC_LEAVE */
158
159/*
160 * すべての割込みの禁止(高速簡易版)
161 * å…
162¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
163‹ã¸ç§»è¡Œ
164 */
165#ifdef TOPPERS_DisableAllInterrupts
166
167#ifndef OMIT_STANDARD_DISALLINT
168
169void
170DisableAllInterrupts(void)
171{
172 LOG_DISINT_ENTER();
173 if ((callevel_stat & (TSYS_DISALLINT | TSYS_SUSALLINT | TSYS_SUSOSINT)) == TSYS_NULL) {
174 x_lock_all_int();
175 ENTER_CALLEVEL(TSYS_DISALLINT);
176 }
177 LOG_DISINT_LEAVE();
178}
179
180#endif /* OMIT_STANDARD_DISALLINT */
181
182#endif /* TOPPERS_DisableAllInterrupts */
183
184/*
185 * すべての割込みの許可(高速簡易版)
186 * å…
187¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
188‹ã‚’解除する
189 */
190#ifdef TOPPERS_EnableAllInterrupts
191
192#ifndef OMIT_STANDARD_DISALLINT
193
194void
195EnableAllInterrupts(void)
196{
197 LOG_ENAINT_ENTER();
198 if ((callevel_stat & (TSYS_SUSALLINT | TSYS_SUSOSINT)) == TSYS_NULL) {
199 if ((callevel_stat & TSYS_DISALLINT) != TSYS_NULL) {
200 LEAVE_CALLEVEL(TSYS_DISALLINT);
201 x_unlock_all_int();
202 }
203 }
204 LOG_ENAINT_LEAVE();
205}
206
207#endif /* OMIT_STANDARD_DISALLINT */
208
209#endif /* TOPPERS_EnableAllInterrupts */
210
211/*
212 * å…
213¨å‰²è¾¼ã¿ç¦æ­¢
214 * CPUå…
215¨ã¦ã®å‰²è¾¼ã¿ãŒå¯¾è±¡ã®å‰²è¾¼ã¿ç¦æ­¢(ネストカウント有り)
216 */
217#ifdef TOPPERS_SuspendAllInterrupts
218
219void
220SuspendAllInterrupts(void)
221{
222#ifdef CFG_USE_ERRORHOOK
223 StatusType ercd;
224#endif /* CFG_USE_ERRORHOOK */
225
226 LOG_SUSALL_ENTER();
227 S_N_CHECK_DISALLINT();
228 S_N_CHECK_ERROR((run_trusted != FALSE), E_OS_ACCESS);
229 /* ネスト回数の上限値超
230過 */
231 S_N_CHECK_LIMIT(sus_all_cnt != UINT8_INVALID);
232
233 if (sus_all_cnt == 0U) {
234 x_lock_all_int();
235 ENTER_CALLEVEL(TSYS_SUSALLINT);
236 }
237
238 sus_all_cnt++;
239
240 exit_no_errorhook:
241 LOG_SUSALL_LEAVE();
242 return;
243
244#ifdef CFG_USE_ERRORHOOK
245 exit_errorhook:
246 if (kerflg != FALSE) {
247 x_nested_lock_os_int();
248 call_errorhook(ercd, OSServiceId_SuspendAllInterrupts);
249 x_nested_unlock_os_int();
250 goto exit_no_errorhook;
251 }
252#endif /* CFG_USE_ERRORHOOK */
253}
254
255#endif /* TOPPERS_SuspendAllInterrupts */
256
257/*
258 * å…
259¨å‰²è¾¼ã¿ç¦æ­¢è§£é™¤
260 * CPUå…
261¨ã¦ã®å‰²è¾¼ã¿ãŒå¯¾è±¡ã®å‰²è¾¼ã¿è¨±å¯(ネストカウント有り)
262 */
263#ifdef TOPPERS_ResumeAllInterrupts
264
265void
266ResumeAllInterrupts(void)
267{
268#ifdef CFG_USE_ERRORHOOK
269 StatusType ercd;
270#endif /* CFG_USE_ERRORHOOK */
271
272 LOG_RSMALL_ENTER();
273 S_N_CHECK_DISALLINT();
274 S_N_CHECK_STATE(sus_all_cnt != 0U);
275
276 sus_all_cnt--;
277
278 if (sus_all_cnt == 0U) {
279 LEAVE_CALLEVEL(TSYS_SUSALLINT);
280 x_unlock_all_int();
281 }
282
283 exit_no_errorhook:
284 LOG_RSMALL_LEAVE();
285 return;
286
287#ifdef CFG_USE_ERRORHOOK
288 exit_errorhook:
289 if (kerflg != FALSE) {
290 x_nested_lock_os_int();
291 call_errorhook(ercd, OSServiceId_ResumeAllInterrupts);
292 x_nested_unlock_os_int();
293 goto exit_no_errorhook;
294 }
295#endif /* CFG_USE_ERRORHOOK */
296}
297
298#endif /* TOPPERS_ResumeAllInterrupts */
299
300/*
301 * OS割込みの禁止
302 * C2ISRが対象の割込み禁止(ネストカウント有り)
303 */
304#ifdef TOPPERS_SuspendOSInterrupts
305
306void
307SuspendOSInterrupts(void)
308{
309#ifdef CFG_USE_ERRORHOOK
310 StatusType ercd;
311#endif /* CFG_USE_ERRORHOOK */
312
313 LOG_SUSOSI_ENTER();
314 S_N_CHECK_DISALLINT();
315 /* ネスト回数の上限値超
316過 */
317 S_N_CHECK_LIMIT(sus_os_cnt != UINT8_INVALID);
318
319 if (sus_os_cnt == 0U) {
320 x_suspend_lock_os_int();
321 ENTER_CALLEVEL(TSYS_SUSOSINT);
322 }
323
324 sus_os_cnt++;
325
326 exit_no_errorhook:
327 LOG_SUSOSI_LEAVE();
328 return;
329
330#ifdef CFG_USE_ERRORHOOK
331 exit_errorhook:
332 x_nested_lock_os_int();
333 call_errorhook(ercd, OSServiceId_SuspendOSInterrupts);
334 x_nested_unlock_os_int();
335 goto exit_no_errorhook;
336#endif /* CFG_USE_ERRORHOOK */
337}
338
339#endif /* TOPPERS_SuspendOSInterrupts */
340
341/*
342 * OS割込み禁止解除
343 * C2ISRが対象の割込み許可(ネストカウント有り)
344 */
345#ifdef TOPPERS_ResumeOSInterrupts
346
347void
348ResumeOSInterrupts(void)
349{
350#ifdef CFG_USE_ERRORHOOK
351 StatusType ercd;
352#endif /* CFG_USE_ERRORHOOK */
353
354 LOG_RSMOSI_ENTER();
355 S_N_CHECK_DISALLINT();
356 S_N_CHECK_STATE(sus_os_cnt != 0U);
357
358 sus_os_cnt--;
359
360 if (sus_os_cnt == 0U) {
361 LEAVE_CALLEVEL(TSYS_SUSOSINT);
362 x_resume_unlock_os_int();
363 }
364
365 exit_no_errorhook:
366 LOG_RSMOSI_LEAVE();
367 return;
368
369#ifdef CFG_USE_ERRORHOOK
370 exit_errorhook:
371 x_nested_lock_os_int();
372 call_errorhook(ercd, OSServiceId_ResumeOSInterrupts);
373 x_nested_unlock_os_int();
374 goto exit_no_errorhook;
375#endif /* CFG_USE_ERRORHOOK */
376}
377
378#endif /* TOPPERS_ResumeOSInterrupts */
379
380/*
381 * C2ISR IDの取得
382 */
383#ifdef TOPPERS_GetISRID
384
385ISRType
386GetISRID(void)
387{
388 ISRType isrid;
389 StatusType ercd;
390
391 LOG_GETISRID_ENTER();
392 CHECK_CALLEVEL(CALLEVEL_GETISRID);
393
394 isrid = (p_runisr == NULL) ? INVALID_ISR : ISR2ID(p_runisr);
395
396 exit_finish:
397 LOG_GETISRID_LEAVE(isrid);
398 return(isrid);
399
400#ifdef CFG_USE_ERRORHOOK
401 exit_errorhook:
402 x_nested_lock_os_int();
403 /*
404 * エラー発生時はINVALID_ISRIDが返るが,エラーが発生したのか実行中の
405 * C2ISRが存在しないのか区別するため,エラーフックを呼ぶ
406 */
407 call_errorhook(ercd, OSServiceId_GetISRID);
408 x_nested_unlock_os_int();
409#endif /* CFG_USE_ERRORHOOK */
410
411 exit_no_errorhook:
412 isrid = INVALID_ISR;
413 goto exit_finish;
414}
415
416#endif /* TOPPERS_GetISRID */
417
418/*
419 * 割込みの禁止
420 */
421#ifdef TOPPERS_DisableInterruptSource
422
423StatusType
424DisableInterruptSource(ISRType DisableISR)
425{
426 ISRCB *p_isrcb;
427 StatusType ercd;
428
429 LOG_DISINTSRC_ENTER(DisableISR);
430 CHECK_CALLEVEL(CALLEVEL_DISABLEINTERRUPTSOURCE);
431 CHECK_ID(DisableISR < tnum_isr2);
432 p_isrcb = get_isrcb(DisableISR);
433 CHECK_RIGHT(p_isrcb->p_isrinib->acsbtmp);
434 CHECK_NOFUNC(target_is_int_controllable(p_isrcb->p_isrinib->p_intinib->intno) != FALSE);
435
436 x_nested_lock_os_int();
437 D_CHECK_ACCESS((p_isrcb->p_isrinib->p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
438 (p_isrcb->p_isrinib->p_osapcb == p_runosap));
439 x_disable_int(GET_INTNO(p_isrcb));
440 ercd = E_OK;
441 d_exit_no_errorhook:
442 x_nested_unlock_os_int();
443
444 exit_no_errorhook:
445 LOG_DISINTSRC_LEAVE(ercd);
446 return(ercd);
447
448#ifdef CFG_USE_ERRORHOOK
449 exit_errorhook:
450 x_nested_lock_os_int();
451 d_exit_errorhook:
452#ifdef CFG_USE_PARAMETERACCESS
453 _errorhook_par1.isrid = DisableISR;
454#endif /* CFG_USE_PARAMETERACCESS */
455 call_errorhook(ercd, OSServiceId_DisableInterruptSource);
456 x_nested_unlock_os_int();
457 goto exit_no_errorhook;
458#endif /* CFG_USE_ERRORHOOK */
459}
460
461#endif /* TOPPERS_DisableInterruptSource */
462
463/*
464 * 割込みの許可
465 */
466#ifdef TOPPERS_EnableInterruptSource
467
468StatusType
469EnableInterruptSource(ISRType EnableISR)
470{
471 ISRCB *p_isrcb;
472 StatusType ercd;
473
474 LOG_ENAINTSRC_ENTER(EnableISR);
475 CHECK_CALLEVEL(CALLEVEL_ENABLEINTERRUPTSOURCE);
476 CHECK_ID(EnableISR < tnum_isr2);
477 p_isrcb = get_isrcb(EnableISR);
478 CHECK_RIGHT(p_isrcb->p_isrinib->acsbtmp);
479 CHECK_NOFUNC(target_is_int_controllable(p_isrcb->p_isrinib->p_intinib->intno) != FALSE);
480
481 x_nested_lock_os_int();
482 D_CHECK_ACCESS((p_isrcb->p_isrinib->p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
483 (p_isrcb->p_isrinib->p_osapcb == p_runosap));
484 x_enable_int(GET_INTNO(p_isrcb));
485 ercd = E_OK;
486 d_exit_no_errorhook:
487 x_nested_unlock_os_int();
488
489 exit_no_errorhook:
490 LOG_ENAINTSRC_LEAVE(ercd);
491 return(ercd);
492
493#ifdef CFG_USE_ERRORHOOK
494 exit_errorhook:
495 x_nested_lock_os_int();
496 d_exit_errorhook:
497#ifdef CFG_USE_PARAMETERACCESS
498 _errorhook_par1.isrid = EnableISR;
499#endif /* CFG_USE_PARAMETERACCESS */
500 call_errorhook(ercd, OSServiceId_EnableInterruptSource);
501 x_nested_unlock_os_int();
502 goto exit_no_errorhook;
503#endif /* CFG_USE_ERRORHOOK */
504}
505
506#endif /* TOPPERS_EnableInterruptSource */
Note: See TracBrowser for help on using the repository browser.