/* * TOPPERS ATK2 * Toyohashi Open Platform for Embedded Real-Time Systems * Automotive Kernel Version 2 * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2004-2015 by Center for Embedded Computing Systems * Graduate School of Information Science, Nagoya Univ., JAPAN * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN * Copyright (C) 2011-2013 by Spansion LLC, USA * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN * Copyright (C) 2004-2015 by Witz Corporation * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION * * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利 * 用する者に対して,AUTOSARパートナーになることを求めている. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * $Id: interrupt.c 425 2015-12-07 08:06:19Z witz-itoyo $ */ /* * 割込み制御モジュール */ #include "kernel_impl.h" #include "interrupt.h" #ifdef TOPPERS_interrupt_initialize /* * 実行中のC2ISR */ ISRCB *p_runisr; #ifdef NTC2ISR QUEUE isr_ready_queue; #endif /* NTC2ISR */ /* * 割込み管理機能内部で使用する変数の定義 */ /* * SuspendAllInterrupts のネスト回数 */ uint8 sus_all_cnt = 0U; /* * SuspendOSInterrupts のネスト回数 */ uint8 sus_os_cnt = 0U; /* * 割込み管理機能の初期化 */ #ifndef OMIT_INITIALIZE_INTERRUPT void interrupt_initialize(void) { ISRType i; InterruptNumberType j; ISRCB *p_isrcb; const INTINIB *p_intinib; p_runisr = NULL; sus_all_cnt = 0U; sus_os_cnt = 0U; for (i = 0U; i < tnum_isr2; i++) { p_isrcb = &(isrcb_table[i]); p_isrcb->p_isrinib = &(isrinib_table[i]); p_isrcb->p_lastrescb = NULL; p_isrcb->p_lastcntcb = NULL; #ifdef CFG_USE_PROTECTIONHOOK p_isrcb->calltfn = FALSE; #endif /* CFG_USE_PROTECTIONHOOK */ #ifdef NTC2ISR queue_initialize(&(p_isrcb->isr_queue)); #endif /* NTC2ISR */ } for (j = 0U; j < tnum_intno; j++) { p_intinib = &(intinib_table[j]); x_config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri); } #ifdef NTC2ISR queue_initialize(&isr_ready_queue); #endif /* NTC2ISR */ } #endif /* OMIT_INITIALIZE_INTERRUPT */ #endif /* TOPPERS_interrupt_initialize */ /* * 割込み禁止の解除 */ #ifdef TOPPERS_release_interrupts void release_interrupts(OSServiceIdType serviceId) { #ifdef CFG_USE_ERRORHOOK boolean call_error_hook = FALSE; #endif /* CFG_USE_ERRORHOOK */ if (sus_os_cnt > 0U) { sus_os_cnt = 0U; LEAVE_CALLEVEL(TSYS_SUSOSINT); x_nested_unlock_os_int(); #ifdef CFG_USE_ERRORHOOK call_error_hook = TRUE; #endif /* CFG_USE_ERRORHOOK */ } if (sus_all_cnt > 0U) { sus_all_cnt = 0U; LEAVE_CALLEVEL(TSYS_SUSALLINT); ASSERT((callevel_stat & TSYS_DISALLINT) == TSYS_NULL); x_unlock_all_int(); #ifdef CFG_USE_ERRORHOOK call_error_hook = TRUE; #endif /* CFG_USE_ERRORHOOK */ } /* C2ISRの場合のみDisAllを解除する */ if (serviceId == OSServiceId_ISRMissingEnd) { if ((callevel_stat & TSYS_DISALLINT) != TSYS_NULL) { LEAVE_CALLEVEL(TSYS_DISALLINT); x_unlock_all_int(); #ifdef CFG_USE_ERRORHOOK call_error_hook = TRUE; #endif /* CFG_USE_ERRORHOOK */ } } #ifdef CFG_USE_ERRORHOOK if ((serviceId != OSServiceId_Invalid) && (call_error_hook != FALSE)) { call_errorhook(E_OS_DISABLEDINT, serviceId); } #endif /* CFG_USE_ERRORHOOK */ } #endif /* TOPPERS_release_interrupts */ /* * C2ISR終了時のチェック関数 */ #ifdef TOPPERS_exit_isr2 /* * C2ISRの全リソース返却 */ LOCAL_INLINE void release_isrresources(ISRCB *p_isrcb) { /* OS割込み禁止状態以上で来るはず */ if (p_isrcb->p_lastrescb != NULL) { do { x_set_ipm(p_isrcb->p_lastrescb->prevpri); p_isrcb->p_lastrescb->lockflg = FALSE; p_isrcb->p_lastrescb = p_isrcb->p_lastrescb->p_prevrescb; } while (p_isrcb->p_lastrescb != NULL); #ifdef CFG_USE_ERRORHOOK call_errorhook(E_OS_RESOURCE, OSServiceId_ISRMissingEnd); #endif /* CFG_USE_ERRORHOOK */ } } /* * タスクのカウンタの状態をすべてCS_NULLに戻す */ void cancel_isrcounters(ISRCB *p_isrcb) { if (p_isrcb->p_lastcntcb != NULL) { /* OS割込み禁止状態以上で来る */ do { p_isrcb->p_lastcntcb->cstat = CS_NULL; p_isrcb->p_lastcntcb = p_isrcb->p_lastcntcb->p_prevcntcb; } while (p_isrcb->p_lastcntcb != NULL); } } void exit_isr2(void) { x_nested_lock_os_int(); release_interrupts(OSServiceId_ISRMissingEnd); release_isrresources(p_runisr); x_nested_unlock_os_int(); } #endif /* TOPPERS_exit_isr2 */ void force_term_osap_isr(OSAPCB *p_osapcb) { ISRType i; ISRCB *p_isrcb; const INTINIB *p_intinib; /* レディキューに繋がれているISRを強制終了 */ for (p_isrcb = (&isr_ready_queue)->p_next; p_isrcb != &isr_ready_queue; p_isrcb = p_isrcb->isr_queue.p_next) { if (p_isrcb->p_isrinib->p_osapcb == p_osapcb) { #ifdef CFG_USE_PROTECTIONHOOK p_isrcb->calltfn = FALSE; #endif /* CFG_USE_PROTECTIONHOOK */ /* リソース確保したままの場合,リソース解放 */ release_isrresources(p_isrcb); /* カウンタの状態を初期化する */ cancel_isrcounters(p_isrcb); /*レディキューから除外*/ queue_delete(p_isrcb); } } if (p_runisr != NULL && p_runisr->p_isrinib->p_osapcb == p_osapcb) { #ifdef CFG_USE_PROTECTIONHOOK p_runisr->calltfn = FALSE; #endif /* CFG_USE_PROTECTIONHOOK */ /* リソース確保したままの場合,リソース解放 */ release_isrresources(p_runisr); /* カウンタの状態を初期化する */ cancel_isrcounters(p_runisr); } for (i = 0U; i < tnum_isr2; i++) { p_isrcb = &(isrcb_table[i]); if (p_isrcb->p_isrinib->p_osapcb == p_osapcb) { p_intinib = &(intinib_table[i]); x_disable_int(p_intinib->intno); } } } /* * プロテクションフックの出口からここへ来る * ここに来るパスは以下のとおり * - ISR → プロテクションフック → PRO_TERMINATE_TASKISR */ void force_terminate_isr(ISRCB *p_isrcb) { /* * 割込み禁止を解除する * エラーフックを呼ばないため,引数にOSServiceId_Invalidをする */ release_interrupts(OSServiceId_Invalid); /* リソース確保したままの場合,リソース解放 */ release_isrresources(p_isrcb); /* カウンタの状態を初期化する */ cancel_isrcounters(p_isrcb); exit_and_dispatch_isr(); }