00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id: interrupt.c 878 2008-04-11 10:37:46Z hiro $ 00041 */ 00042 00043 /* 00044 * 割込み管理機能 00045 */ 00046 00047 #include "kernel_impl.h" 00048 #include "check.h" 00049 #include "task.h" 00050 #include "interrupt.h" 00051 00052 /* 00053 * トレースログマクロのデフォルト定義 00054 */ 00055 #ifndef LOG_DIS_INT_ENTER 00056 #define LOG_DIS_INT_ENTER(intno) 00057 #endif /* LOG_DIS_INT_ENTER */ 00058 00059 #ifndef LOG_DIS_INT_LEAVE 00060 #define LOG_DIS_INT_LEAVE(ercd) 00061 #endif /* LOG_DIS_INT_LEAVE */ 00062 00063 #ifndef LOG_ENA_INT_ENTER 00064 #define LOG_ENA_INT_ENTER(intno) 00065 #endif /* LOG_ENA_INT_ENTER */ 00066 00067 #ifndef LOG_ENA_INT_LEAVE 00068 #define LOG_ENA_INT_LEAVE(ercd) 00069 #endif /* LOG_ENA_INT_LEAVE */ 00070 00071 #ifndef LOG_CHG_IPM_ENTER 00072 #define LOG_CHG_IPM_ENTER(intpri) 00073 #endif /* LOG_CHG_IPM_ENTER */ 00074 00075 #ifndef LOG_CHG_IPM_LEAVE 00076 #define LOG_CHG_IPM_LEAVE(ercd) 00077 #endif /* LOG_CHG_IPM_LEAVE */ 00078 00079 #ifndef LOG_GET_IPM_ENTER 00080 #define LOG_GET_IPM_ENTER(p_intpri) 00081 #endif /* LOG_GET_IPM_ENTER */ 00082 00083 #ifndef LOG_GET_IPM_LEAVE 00084 #define LOG_GET_IPM_LEAVE(ercd, intpri) 00085 #endif /* LOG_GET_IPM_LEAVE */ 00086 00087 /* 00088 * 割込み管理機能の初期化 00089 */ 00090 #ifdef TOPPERS_intini 00091 #ifndef OMIT_INITIALIZE_INTERRUPT 00092 00093 void 00094 initialize_interrupt(void) 00095 { 00096 uint_t i; 00097 const INHINIB *p_inhinib; 00098 const INTINIB *p_intinib; 00099 00100 for (p_inhinib = inhinib_table, i = 0; i < tnum_inhno; p_inhinib++, i++) { 00101 x_define_inh(p_inhinib->inhno, p_inhinib->int_entry); 00102 } 00103 for (p_intinib = intinib_table, i = 0; i < tnum_intno; p_intinib++, i++) { 00104 x_config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri); 00105 } 00106 } 00107 00108 #endif /* OMIT_INITIALIZE_INTERRUPT */ 00109 #endif /* TOPPERS_intini */ 00110 00111 /* 00112 * 割込みの禁止 00113 */ 00114 #ifdef TOPPERS_dis_int 00115 #ifdef TOPPERS_SUPPORT_DIS_INT 00116 00117 ER 00118 dis_int(INTNO intno) 00119 { 00120 bool_t locked; 00121 ER ercd; 00122 00123 LOG_DIS_INT_ENTER(intno); 00124 CHECK_TSKCTX(); 00125 CHECK_INTNO_DISINT(intno); 00126 00127 locked = t_sense_lock(); 00128 if (!locked) { 00129 t_lock_cpu(); 00130 } 00131 if (t_disable_int(intno)) { 00132 ercd = E_OK; 00133 } 00134 else { 00135 ercd = E_OBJ; 00136 } 00137 if (!locked) { 00138 t_unlock_cpu(); 00139 } 00140 00141 error_exit: 00142 LOG_DIS_INT_LEAVE(ercd); 00143 return(ercd); 00144 } 00145 00146 #endif /* TOPPERS_SUPPORT_DIS_INT */ 00147 #endif /* TOPPERS_dis_int */ 00148 00149 /* 00150 * 割込みの許可 00151 */ 00152 #ifdef TOPPERS_ena_int 00153 #ifdef TOPPERS_SUPPORT_ENA_INT 00154 00155 ER 00156 ena_int(INTNO intno) 00157 { 00158 bool_t locked; 00159 ER ercd; 00160 00161 LOG_ENA_INT_ENTER(intno); 00162 CHECK_TSKCTX(); 00163 CHECK_INTNO_DISINT(intno); 00164 00165 locked = t_sense_lock(); 00166 if (!locked) { 00167 t_lock_cpu(); 00168 } 00169 if (t_enable_int(intno)) { 00170 ercd = E_OK; 00171 } 00172 else { 00173 ercd = E_OBJ; 00174 } 00175 if (!locked) { 00176 t_unlock_cpu(); 00177 } 00178 00179 error_exit: 00180 LOG_ENA_INT_LEAVE(ercd); 00181 return(ercd); 00182 } 00183 00184 #endif /* TOPPERS_SUPPORT_ENA_INT */ 00185 #endif /* TOPPERS_ena_int */ 00186 00187 /* 00188 * 割込み優先度マスクの変更 00189 */ 00190 #ifdef TOPPERS_chg_ipm 00191 00192 ER 00193 chg_ipm(PRI intpri) 00194 { 00195 bool_t locked; 00196 ER ercd; 00197 00198 LOG_CHG_IPM_ENTER(intpri); 00199 CHECK_TSKCTX(); 00200 CHECK_INTPRI_CHGIPM(intpri); 00201 00202 locked = t_sense_lock(); 00203 if (!locked) { 00204 t_lock_cpu(); 00205 } 00206 t_set_ipm(intpri); 00207 if (intpri != TIPM_ENAALL) { 00208 dspflg = false; 00209 } 00210 else if (!disdsp) { 00211 dspflg = true; 00212 if (p_runtsk != p_schedtsk) { 00213 dispatch(); 00214 } 00215 } 00216 ercd = E_OK; 00217 if (!locked) { 00218 t_unlock_cpu(); 00219 } 00220 00221 error_exit: 00222 LOG_CHG_IPM_LEAVE(ercd); 00223 return(ercd); 00224 } 00225 00226 #endif /* TOPPERS_chg_ipm */ 00227 00228 /* 00229 * 割込み優先度マスクの参照 00230 */ 00231 #ifdef TOPPERS_get_ipm 00232 00233 ER 00234 get_ipm(PRI *p_intpri) 00235 { 00236 bool_t locked; 00237 ER ercd; 00238 00239 LOG_GET_IPM_ENTER(p_intpri); 00240 CHECK_TSKCTX(); 00241 00242 locked = t_sense_lock(); 00243 if (!locked) { 00244 t_lock_cpu(); 00245 } 00246 *p_intpri = t_get_ipm(); 00247 ercd = E_OK; 00248 if (!locked) { 00249 t_unlock_cpu(); 00250 } 00251 00252 error_exit: 00253 LOG_GET_IPM_LEAVE(ercd, *p_intpri); 00254 return(ercd); 00255 } 00256 00257 #endif /* TOPPERS_get_ipm */
Copyright © 2008 by Kijineko Inc.