source: atk2-sc3_fl850f1l/kernel/interrupt_manage.c@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 10.9 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 *
22 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
25 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 * スコード中に含まれていること.
28 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
30 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
34 * と.
35 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 * 免責すること.
44 *
45 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
46 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
47 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
48 * 用する者に対して,AUTOSARパートナーになることを求めている.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
52 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
53 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
54 * の責任を負わない.
55 *
56 * $Id: interrupt_manage.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * 割込み管理モジュール
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "interrupt.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_DISINT_ENTER
71#define LOG_DISINT_ENTER()
72#endif /* LOG_DISINT_ENTER */
73
74#ifndef LOG_DISINT_LEAVE
75#define LOG_DISINT_LEAVE()
76#endif /* LOG_DISINT_LEAVE */
77
78#ifndef LOG_ENAINT_ENTER
79#define LOG_ENAINT_ENTER()
80#endif /* LOG_ENAINT_ENTER */
81
82#ifndef LOG_ENAINT_LEAVE
83#define LOG_ENAINT_LEAVE()
84#endif /* LOG_ENAINT_LEAVE */
85
86#ifndef LOG_SUSALL_ENTER
87#define LOG_SUSALL_ENTER()
88#endif /* LOG_SUSALL_ENTER */
89
90#ifndef LOG_SUSALL_LEAVE
91#define LOG_SUSALL_LEAVE()
92#endif /* LOG_SUSALL_LEAVE */
93
94#ifndef LOG_RSMALL_ENTER
95#define LOG_RSMALL_ENTER()
96#endif /* LOG_RSMALL_ENTER */
97
98#ifndef LOG_RSMALL_LEAVE
99#define LOG_RSMALL_LEAVE()
100#endif /* LOG_RSMALL_LEAVE */
101
102#ifndef LOG_SUSOSI_ENTER
103#define LOG_SUSOSI_ENTER()
104#endif /* LOG_SUSOSI_ENTER */
105
106#ifndef LOG_SUSOSI_LEAVE
107#define LOG_SUSOSI_LEAVE()
108#endif /* LOG_SUSOSI_LEAVE */
109
110#ifndef LOG_RSMOSI_ENTER
111#define LOG_RSMOSI_ENTER()
112#endif /* LOG_RSMOSI_ENTER */
113
114#ifndef LOG_RSMOSI_LEAVE
115#define LOG_RSMOSI_LEAVE()
116#endif /* LOG_RSMOSI_LEAVE */
117
118#ifndef LOG_GETISRID_ENTER
119#define LOG_GETISRID_ENTER()
120#endif /* LOG_GETISRID_ENTER */
121
122#ifndef LOG_GETISRID_LEAVE
123#define LOG_GETISRID_LEAVE(ercd)
124#endif /* LOG_GETISRID_LEAVE */
125
126#ifndef LOG_DISINTSRC_ENTER
127#define LOG_DISINTSRC_ENTER(isrid)
128#endif /* LOG_DISINTSRC_ENTER */
129
130#ifndef LOG_DISINTSRC_LEAVE
131#define LOG_DISINTSRC_LEAVE(ercd)
132#endif /* LOG_DISINTSRC_LEAVE */
133
134#ifndef LOG_ENAINTSRC_ENTER
135#define LOG_ENAINTSRC_ENTER(isrid)
136#endif /* LOG_ENAINTSRC_ENTER */
137
138#ifndef LOG_ENAINTSRC_LEAVE
139#define LOG_ENAINTSRC_LEAVE(ercd)
140#endif /* LOG_ENAINTSRC_LEAVE */
141
142/*
143 * すべての割込みの禁止(高速簡易版)
144 * 全割込み禁止状態へ移行
145 */
146#ifdef TOPPERS_DisableAllInterrupts
147
148#ifndef OMIT_STANDARD_DISALLINT
149
150void
151DisableAllInterrupts(void)
152{
153 LOG_DISINT_ENTER();
154 if ((callevel_stat & (TSYS_DISALLINT | TSYS_SUSALLINT | TSYS_SUSOSINT)) == TSYS_NULL) {
155 x_lock_all_int();
156 ENTER_CALLEVEL(TSYS_DISALLINT);
157 }
158 LOG_DISINT_LEAVE();
159}
160
161#endif /* OMIT_STANDARD_DISALLINT */
162
163#endif /* TOPPERS_DisableAllInterrupts */
164
165/*
166 * すべての割込みの許可(高速簡易版)
167 * 全割込み禁止状態を解除する
168 */
169#ifdef TOPPERS_EnableAllInterrupts
170
171#ifndef OMIT_STANDARD_DISALLINT
172
173void
174EnableAllInterrupts(void)
175{
176 LOG_ENAINT_ENTER();
177 if ((callevel_stat & (TSYS_SUSALLINT | TSYS_SUSOSINT)) == TSYS_NULL) {
178 if ((callevel_stat & TSYS_DISALLINT) != TSYS_NULL) {
179 LEAVE_CALLEVEL(TSYS_DISALLINT);
180 x_unlock_all_int();
181 }
182 }
183 LOG_ENAINT_LEAVE();
184}
185
186#endif /* OMIT_STANDARD_DISALLINT */
187
188#endif /* TOPPERS_EnableAllInterrupts */
189
190/*
191 * 全割込み禁止
192 * CPU全ての割込みが対象の割込み禁止(ネストカウント有り)
193 */
194#ifdef TOPPERS_SuspendAllInterrupts
195
196void
197SuspendAllInterrupts(void)
198{
199#ifdef CFG_USE_ERRORHOOK
200 StatusType ercd;
201#endif /* CFG_USE_ERRORHOOK */
202
203 LOG_SUSALL_ENTER();
204 S_N_CHECK_DISALLINT();
205 /* ネスト回数の上限値超過 */
206 S_N_CHECK_LIMIT(sus_all_cnt != UINT8_INVALID);
207
208 if (sus_all_cnt == 0U) {
209 x_lock_all_int();
210 ENTER_CALLEVEL(TSYS_SUSALLINT);
211 }
212
213 sus_all_cnt++;
214 sus_all_cnt_ctx++;
215
216 exit_no_errorhook:
217 LOG_SUSALL_LEAVE();
218 return;
219
220#ifdef CFG_USE_ERRORHOOK
221 exit_errorhook:
222 if (kerflg != FALSE) {
223 x_nested_lock_os_int();
224 call_errorhook(ercd, OSServiceId_SuspendAllInterrupts);
225 x_nested_unlock_os_int();
226 goto exit_no_errorhook;
227 }
228#endif /* CFG_USE_ERRORHOOK */
229}
230
231#endif /* TOPPERS_SuspendAllInterrupts */
232
233/*
234 * 全割込み禁止解除
235 * CPU全ての割込みが対象の割込み許可(ネストカウント有り)
236 */
237#ifdef TOPPERS_ResumeAllInterrupts
238
239void
240ResumeAllInterrupts(void)
241{
242#ifdef CFG_USE_ERRORHOOK
243 StatusType ercd;
244#endif /* CFG_USE_ERRORHOOK */
245
246 LOG_RSMALL_ENTER();
247 S_N_CHECK_DISALLINT();
248 S_N_CHECK_STATE(sus_all_cnt_ctx != 0U);
249
250 sus_all_cnt--;
251 sus_all_cnt_ctx--;
252
253 if (sus_all_cnt == 0U) {
254 LEAVE_CALLEVEL(TSYS_SUSALLINT);
255 x_unlock_all_int();
256 }
257
258 exit_no_errorhook:
259 LOG_RSMALL_LEAVE();
260 return;
261
262#ifdef CFG_USE_ERRORHOOK
263 exit_errorhook:
264 if (kerflg != FALSE) {
265 x_nested_lock_os_int();
266 call_errorhook(ercd, OSServiceId_ResumeAllInterrupts);
267 x_nested_unlock_os_int();
268 goto exit_no_errorhook;
269 }
270#endif /* CFG_USE_ERRORHOOK */
271}
272
273#endif /* TOPPERS_ResumeAllInterrupts */
274
275/*
276 * OS割込みの禁止
277 * C2ISRが対象の割込み禁止(ネストカウント有り)
278 */
279#ifdef TOPPERS_SuspendOSInterrupts
280
281void
282SuspendOSInterrupts(void)
283{
284#ifdef CFG_USE_ERRORHOOK
285 StatusType ercd;
286#endif /* CFG_USE_ERRORHOOK */
287
288 LOG_SUSOSI_ENTER();
289 S_N_CHECK_DISALLINT();
290 /* ネスト回数の上限値超過 */
291 S_N_CHECK_LIMIT(sus_os_cnt != UINT8_INVALID);
292
293 if (sus_os_cnt == 0U) {
294 x_suspend_lock_os_int();
295 ENTER_CALLEVEL(TSYS_SUSOSINT);
296 }
297
298 sus_os_cnt++;
299 sus_os_cnt_ctx++;
300
301 exit_no_errorhook:
302 LOG_SUSOSI_LEAVE();
303 return;
304
305#ifdef CFG_USE_ERRORHOOK
306 exit_errorhook:
307 x_nested_lock_os_int();
308 call_errorhook(ercd, OSServiceId_SuspendOSInterrupts);
309 x_nested_unlock_os_int();
310 goto exit_no_errorhook;
311#endif /* CFG_USE_ERRORHOOK */
312}
313
314#endif /* TOPPERS_SuspendOSInterrupts */
315
316/*
317 * OS割込み禁止解除
318 * C2ISRが対象の割込み許可(ネストカウント有り)
319 */
320#ifdef TOPPERS_ResumeOSInterrupts
321
322void
323ResumeOSInterrupts(void)
324{
325#ifdef CFG_USE_ERRORHOOK
326 StatusType ercd;
327#endif /* CFG_USE_ERRORHOOK */
328
329 LOG_RSMOSI_ENTER();
330 S_N_CHECK_DISALLINT();
331 S_N_CHECK_STATE(sus_os_cnt_ctx != 0U);
332
333 sus_os_cnt--;
334 sus_os_cnt_ctx--;
335
336 if (sus_os_cnt == 0U) {
337 LEAVE_CALLEVEL(TSYS_SUSOSINT);
338 x_resume_unlock_os_int();
339 }
340
341 exit_no_errorhook:
342 LOG_RSMOSI_LEAVE();
343 return;
344
345#ifdef CFG_USE_ERRORHOOK
346 exit_errorhook:
347 x_nested_lock_os_int();
348 call_errorhook(ercd, OSServiceId_ResumeOSInterrupts);
349 x_nested_unlock_os_int();
350 goto exit_no_errorhook;
351#endif /* CFG_USE_ERRORHOOK */
352}
353
354#endif /* TOPPERS_ResumeOSInterrupts */
355
356/*
357 * C2ISR IDの取得
358 */
359#ifdef TOPPERS_GetISRID
360
361ISRType
362GetISRID(void)
363{
364 ISRType isrid;
365 StatusType ercd;
366
367 LOG_GETISRID_ENTER();
368 CHECK_CALLEVEL(CALLEVEL_GETISRID);
369
370 isrid = (p_runisr == NULL) ? INVALID_ISR : ISR2ID(p_runisr);
371
372 exit_finish:
373 LOG_GETISRID_LEAVE(isrid);
374 return(isrid);
375
376#ifdef CFG_USE_ERRORHOOK
377 exit_errorhook:
378 x_nested_lock_os_int();
379 /*
380 * エラー発生時はINVALID_ISRIDが返るが,エラーが発生したのか実行中の
381 * C2ISRが存在しないのか区別するため,エラーフックを呼ぶ
382 */
383 call_errorhook(ercd, OSServiceId_GetISRID);
384 x_nested_unlock_os_int();
385#endif /* CFG_USE_ERRORHOOK */
386
387 exit_no_errorhook:
388 isrid = INVALID_ISR;
389 goto exit_finish;
390}
391
392#endif /* TOPPERS_GetISRID */
393
394/*
395 * 割込みの禁止
396 */
397#ifdef TOPPERS_DisableInterruptSource
398
399StatusType
400DisableInterruptSource(ISRType DisableISR)
401{
402 ISRCB *p_isrcb;
403 StatusType ercd;
404
405 LOG_DISINTSRC_ENTER(DisableISR);
406 CHECK_CALLEVEL(CALLEVEL_DISABLEINTERRUPTSOURCE);
407 CHECK_ID(DisableISR < tnum_isr2);
408 p_isrcb = get_isrcb(DisableISR);
409 CHECK_RIGHT(p_isrcb->p_isrinib->acsbtmp);
410
411 x_disable_int(GET_INTNO(p_isrcb));
412 ercd = E_OK;
413
414 exit_no_errorhook:
415 LOG_DISINTSRC_LEAVE(ercd);
416 return(ercd);
417
418#ifdef CFG_USE_ERRORHOOK
419 exit_errorhook:
420 x_nested_lock_os_int();
421#ifdef CFG_USE_PARAMETERACCESS
422 _errorhook_par1.isrid = DisableISR;
423#endif /* CFG_USE_PARAMETERACCESS */
424 call_errorhook(ercd, OSServiceId_DisableInterruptSource);
425 x_nested_unlock_os_int();
426 goto exit_no_errorhook;
427#endif /* CFG_USE_ERRORHOOK */
428}
429
430#endif /* TOPPERS_DisableInterruptSource */
431
432/*
433 * 割込みの許可
434 */
435#ifdef TOPPERS_EnableInterruptSource
436
437StatusType
438EnableInterruptSource(ISRType EnableISR)
439{
440 ISRCB *p_isrcb;
441 StatusType ercd;
442
443 LOG_ENAINTSRC_ENTER(EnableISR);
444 CHECK_CALLEVEL(CALLEVEL_ENABLEINTERRUPTSOURCE);
445 CHECK_ID(EnableISR < tnum_isr2);
446 p_isrcb = get_isrcb(EnableISR);
447 CHECK_RIGHT(p_isrcb->p_isrinib->acsbtmp);
448
449 x_enable_int(GET_INTNO(p_isrcb));
450 ercd = E_OK;
451
452 exit_no_errorhook:
453 LOG_ENAINTSRC_LEAVE(ercd);
454 return(ercd);
455
456#ifdef CFG_USE_ERRORHOOK
457 exit_errorhook:
458 x_nested_lock_os_int();
459#ifdef CFG_USE_PARAMETERACCESS
460 _errorhook_par1.isrid = EnableISR;
461#endif /* CFG_USE_PARAMETERACCESS */
462 call_errorhook(ercd, OSServiceId_EnableInterruptSource);
463 x_nested_unlock_os_int();
464 goto exit_no_errorhook;
465#endif /* CFG_USE_ERRORHOOK */
466}
467
468#endif /* TOPPERS_EnableInterruptSource */
Note: See TracBrowser for help on using the repository browser.