|
|
task_except.c説明を見る。00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2006 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00012 * によって公表されている GNU General Public License の Version 2 に記 00013 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00014 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00015 * 利用と呼ぶ)することを無償で許諾する. 00016 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00017 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00018 * スコード中に含まれていること. 00019 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00020 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00021 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00022 * の無保証規定を掲載すること. 00023 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00024 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00025 * と. 00026 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00027 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00028 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00029 * 報告すること. 00030 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00031 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00032 * 00033 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00034 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00035 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00036 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00037 * 00038 * @(#) $Id: task_except.c,v 1.3 2006/03/14 04:37:54 honda Exp $ 00039 */ 00040 00045 #include "fdmp_kernel.h" 00046 #include "check.h" 00047 #include "task.h" 00048 00052 #ifdef __ras_tex 00053 00054 SYSCALL ER 00055 ras_tex(ID tskid, TEXPTN rasptn) 00056 { 00057 TCB *tcb; 00058 ER ercd; 00059 CCB *ccb; 00060 00061 LOG_RAS_TEX_ENTER(tskid, rasptn); 00062 CHECK_TSKCTX_UNL(); 00063 ccb = T_CHECK_CLSID_CCB(tskid); 00064 tskid = remove_clsid(tskid); 00065 CHECK_TSKID_SELF(ccb, tskid); 00066 CHECK_PAR(rasptn != 0); 00067 tcb = get_tcb_self(ccb, tskid); 00068 00069 retry: 00070 T_ACQUIRE_LOCK(ccb->tsk_lock); 00071 if (TSTAT_DORMANT(tcb->tstat) || tcb->tinib->texrtn == NULL 00072 || (tcb == runtsk && tcb->terflg)) { 00073 ercd = E_OBJ; 00074 } 00075 else { 00076 tcb->texptn |= rasptn; 00077 if (dispatch_request(ccb->prcid)){ 00078 /* 自プロセッサの場合 */ 00079 if (tcb == runtsk && runtsk->enatex) { 00080 call_texrtn(); 00081 } 00082 } 00083 ercd = E_OK; 00084 } 00085 T_RELEASE_LOCK(ccb->tsk_lock); 00086 00087 exit: 00088 LOG_RAS_TEX_LEAVE(ercd); 00089 return(ercd); 00090 } 00091 00092 #endif /* __ras_tex */ 00093 00097 #ifdef __iras_tex 00098 00099 SYSCALL ER 00100 iras_tex(ID tskid, TEXPTN rasptn) 00101 { 00102 TCB *tcb; 00103 ER ercd; 00104 CCB *ccb; 00105 00106 LOG_IRAS_TEX_ENTER(tskid, rasptn); 00107 CHECK_INTCTX_UNL(); 00108 ccb = I_CHECK_CLSID_CCB(tskid); 00109 tskid = remove_clsid(tskid); 00110 CHECK_TSKID_SELF(ccb, tskid); 00111 CHECK_PAR(rasptn != 0); 00112 tcb = get_tcb(ccb, tskid); 00113 00114 retry: 00115 I_ACQUIRE_LOCK(ccb->tsk_lock); 00116 if (TSTAT_DORMANT(tcb->tstat) || tcb->tinib->texrtn == NULL) { 00117 ercd = E_OBJ; 00118 } 00119 else { 00120 tcb->texptn |= rasptn; 00121 if (dispatch_request(ccb->prcid)){ 00122 /* 自プロセッサの場合 */ 00123 if (tcb == runtsk && runtsk->enatex) { 00124 reqflg = TRUE; 00125 } 00126 } 00127 ercd = E_OK; 00128 } 00129 I_RELEASE_LOCK(ccb->tsk_lock); 00130 00131 exit: 00132 LOG_IRAS_TEX_LEAVE(ercd); 00133 return(ercd); 00134 } 00135 00136 #endif /* __iras_tex */ 00137 00141 #ifdef __dis_tex 00142 00143 SYSCALL ER 00144 dis_tex() 00145 { 00146 ER ercd; 00147 00148 LOG_DIS_TEX_ENTER(); 00149 CHECK_TSKCTX_UNL(); 00150 00151 retry: 00152 T_ACQUIRE_LOCK(runccb->tsk_lock); 00153 if (runtsk->tinib->texrtn == NULL || runtsk->terflg) { 00154 ercd = E_OBJ; 00155 } 00156 else { 00157 runtsk->enatex = FALSE; 00158 ercd = E_OK; 00159 } 00160 T_RELEASE_LOCK(runccb->tsk_lock); 00161 00162 exit: 00163 LOG_DIS_TEX_LEAVE(ercd); 00164 return(ercd); 00165 } 00166 00167 #endif /* __dis_tex */ 00168 00172 #ifdef __ena_tex 00173 00174 SYSCALL ER 00175 ena_tex() 00176 { 00177 ER ercd; 00178 00179 LOG_ENA_TEX_ENTER(); 00180 CHECK_TSKCTX_UNL(); 00181 00182 retry: 00183 T_ACQUIRE_LOCK_AND_CHECK_RUNNABLE(); 00184 if (runtsk->tinib->texrtn == NULL || runtsk->terflg) { 00185 ercd = E_OBJ; 00186 } 00187 else { 00188 runtsk->enatex = TRUE; 00189 if (runtsk->texptn != 0) { 00190 call_texrtn(); 00191 } 00192 ercd = E_OK; 00193 } 00194 T_RELEASE_LOCK(runccb->tsk_lock); 00195 00196 exit: 00197 LOG_ENA_TEX_LEAVE(ercd); 00198 return(ercd); 00199 } 00200 00201 #endif /* __ena_tex */ 00202 00206 #ifdef __sns_tex 00207 00208 SYSCALL BOOL 00209 sns_tex() 00210 { 00211 BOOL state; 00212 00213 LOG_SNS_TEX_ENTER(); 00214 state = (runtsk != NULL && runtsk->enatex) ? FALSE : TRUE; 00215 LOG_SNS_TEX_LEAVE(state); 00216 return(state); 00217 } 00218 00219 #endif /* __sns_tex */ Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:13 2006 に Doxygen によって生成されました。 |