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: task_except.c 748 2008-03-07 17:18:06Z hiro $ 00041 */ 00042 00043 /* 00044 * タスク例外処理機能 00045 */ 00046 00047 #include "kernel_impl.h" 00048 #include "check.h" 00049 #include "task.h" 00050 00051 /* 00052 * トレースログマクロのデフォルト定義 00053 */ 00054 #ifndef LOG_RAS_TEX_ENTER 00055 #define LOG_RAS_TEX_ENTER(tskid, rasptn) 00056 #endif /* LOG_RAS_TEX_ENTER */ 00057 00058 #ifndef LOG_RAS_TEX_LEAVE 00059 #define LOG_RAS_TEX_LEAVE(ercd) 00060 #endif /* LOG_RAS_TEX_LEAVE */ 00061 00062 #ifndef LOG_IRAS_TEX_ENTER 00063 #define LOG_IRAS_TEX_ENTER(tskid, rasptn) 00064 #endif /* LOG_IRAS_TEX_ENTER */ 00065 00066 #ifndef LOG_IRAS_TEX_LEAVE 00067 #define LOG_IRAS_TEX_LEAVE(ercd) 00068 #endif /* LOG_IRAS_TEX_LEAVE */ 00069 00070 #ifndef LOG_DIS_TEX_ENTER 00071 #define LOG_DIS_TEX_ENTER() 00072 #endif /* LOG_DIS_TEX_ENTER */ 00073 00074 #ifndef LOG_DIS_TEX_LEAVE 00075 #define LOG_DIS_TEX_LEAVE(ercd) 00076 #endif /* LOG_DIS_TEX_LEAVE */ 00077 00078 #ifndef LOG_ENA_TEX_ENTER 00079 #define LOG_ENA_TEX_ENTER() 00080 #endif /* LOG_ENA_TEX_ENTER */ 00081 00082 #ifndef LOG_ENA_TEX_LEAVE 00083 #define LOG_ENA_TEX_LEAVE(ercd) 00084 #endif /* LOG_ENA_TEX_LEAVE */ 00085 00086 #ifndef LOG_SNS_TEX_ENTER 00087 #define LOG_SNS_TEX_ENTER() 00088 #endif /* LOG_SNS_TEX_ENTER */ 00089 00090 #ifndef LOG_SNS_TEX_LEAVE 00091 #define LOG_SNS_TEX_LEAVE(state) 00092 #endif /* LOG_SNS_TEX_LEAVE */ 00093 00094 #ifndef LOG_REF_TEX_ENTER 00095 #define LOG_REF_TEX_ENTER(tskid, pk_rtex) 00096 #endif /* LOG_REF_TEX_ENTER */ 00097 00098 #ifndef LOG_REF_TEX_LEAVE 00099 #define LOG_REF_TEX_LEAVE(ercd, pk_rtex) 00100 #endif /* LOG_REF_TEX_LEAVE */ 00101 00102 /* 00103 * タスク例外処理の要求 00104 */ 00105 #ifdef TOPPERS_ras_tex 00106 00107 ER 00108 ras_tex(ID tskid, TEXPTN rasptn) 00109 { 00110 TCB *p_tcb; 00111 ER ercd; 00112 00113 LOG_RAS_TEX_ENTER(tskid, rasptn); 00114 CHECK_TSKCTX_UNL(); 00115 CHECK_TSKID_SELF(tskid); 00116 CHECK_PAR(rasptn != 0U); 00117 p_tcb = get_tcb_self(tskid); 00118 00119 t_lock_cpu(); 00120 if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) { 00121 ercd = E_OBJ; 00122 } 00123 else { 00124 p_tcb->texptn |= rasptn; 00125 if (p_tcb == p_runtsk && p_runtsk->enatex) { 00126 call_texrtn(); 00127 } 00128 ercd = E_OK; 00129 } 00130 t_unlock_cpu(); 00131 00132 error_exit: 00133 LOG_RAS_TEX_LEAVE(ercd); 00134 return(ercd); 00135 } 00136 00137 #endif /* TOPPERS_ras_tex */ 00138 00139 /* 00140 * タスク例外処理の要求(非タスクコンテキスト用) 00141 */ 00142 #ifdef TOPPERS_iras_tex 00143 00144 ER 00145 iras_tex(ID tskid, TEXPTN rasptn) 00146 { 00147 TCB *p_tcb; 00148 ER ercd; 00149 00150 LOG_IRAS_TEX_ENTER(tskid, rasptn); 00151 CHECK_INTCTX_UNL(); 00152 CHECK_TSKID(tskid); 00153 CHECK_PAR(rasptn != 0U); 00154 p_tcb = get_tcb(tskid); 00155 00156 i_lock_cpu(); 00157 if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) { 00158 ercd = E_OBJ; 00159 } 00160 else { 00161 p_tcb->texptn |= rasptn; 00162 if (p_tcb == p_runtsk && p_runtsk->enatex) { 00163 reqflg = true; 00164 } 00165 ercd = E_OK; 00166 } 00167 i_unlock_cpu(); 00168 00169 error_exit: 00170 LOG_IRAS_TEX_LEAVE(ercd); 00171 return(ercd); 00172 } 00173 00174 #endif /* TOPPERS_iras_tex */ 00175 00176 /* 00177 * タスク例外処理の禁止 00178 */ 00179 #ifdef TOPPERS_dis_tex 00180 00181 ER 00182 dis_tex(void) 00183 { 00184 ER ercd; 00185 00186 LOG_DIS_TEX_ENTER(); 00187 CHECK_TSKCTX_UNL(); 00188 00189 t_lock_cpu(); 00190 if (p_runtsk->p_tinib->texrtn == NULL) { 00191 ercd = E_OBJ; 00192 } 00193 else { 00194 p_runtsk->enatex = false; 00195 ercd = E_OK; 00196 } 00197 t_unlock_cpu(); 00198 00199 error_exit: 00200 LOG_DIS_TEX_LEAVE(ercd); 00201 return(ercd); 00202 } 00203 00204 #endif /* TOPPERS_dis_tex */ 00205 00206 /* 00207 * タスク例外処理の許可 00208 */ 00209 #ifdef TOPPERS_ena_tex 00210 00211 ER 00212 ena_tex(void) 00213 { 00214 ER ercd; 00215 00216 LOG_ENA_TEX_ENTER(); 00217 CHECK_TSKCTX_UNL(); 00218 00219 t_lock_cpu(); 00220 if (p_runtsk->p_tinib->texrtn == NULL) { 00221 ercd = E_OBJ; 00222 } 00223 else { 00224 p_runtsk->enatex = true; 00225 if (p_runtsk->texptn != 0U) { 00226 call_texrtn(); 00227 } 00228 ercd = E_OK; 00229 } 00230 t_unlock_cpu(); 00231 00232 error_exit: 00233 LOG_ENA_TEX_LEAVE(ercd); 00234 return(ercd); 00235 } 00236 00237 #endif /* TOPPERS_ena_tex */ 00238 00239 /* 00240 * タスク例外処理禁止状態の参照 00241 */ 00242 #ifdef TOPPERS_sns_tex 00243 00244 bool_t 00245 sns_tex(void) 00246 { 00247 bool_t state; 00248 00249 LOG_SNS_TEX_ENTER(); 00250 state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true; 00251 LOG_SNS_TEX_LEAVE(state); 00252 return(state); 00253 } 00254 00255 #endif /* TOPPERS_sns_tex */ 00256 00257 /* 00258 * タスク例外処理の状態参照 00259 */ 00260 #ifdef TOPPERS_ref_tex 00261 00262 ER 00263 ref_tex(ID tskid, T_RTEX *pk_rtex) 00264 { 00265 TCB *p_tcb; 00266 ER ercd; 00267 00268 LOG_REF_TEX_ENTER(tskid, pk_rtex); 00269 CHECK_TSKCTX_UNL(); 00270 CHECK_TSKID_SELF(tskid); 00271 p_tcb = get_tcb_self(tskid); 00272 00273 t_lock_cpu(); 00274 if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) { 00275 ercd = E_OBJ; 00276 } 00277 else { 00278 pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS; 00279 pk_rtex->pndptn = p_tcb->texptn; 00280 ercd = E_OK; 00281 } 00282 t_unlock_cpu(); 00283 00284 error_exit: 00285 LOG_REF_TEX_LEAVE(ercd, pk_rtex); 00286 return(ercd); 00287 } 00288 00289 #endif /* TOPPERS_ref_tex */
Copyright © 2008 by Kijineko Inc.