|
|
sys_manage.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: sys_manage.c,v 1.5 2006/03/21 09:01:57 honda Exp $ 00039 */ 00040 00045 #include "fdmp_kernel.h" 00046 #include "check.h" 00047 #include "task.h" 00048 00049 00053 #ifdef __rot_rdq 00054 00055 SYSCALL ER 00056 rot_rdq(PRI tskpri) 00057 { 00058 UINT pri; 00059 ER ercd; 00060 BOOL dspreq = FALSE; 00061 00062 LOG_ROT_RDQ_ENTER(tskpri); 00063 CHECK_TSKCTX_UNL(); 00064 CHECK_TPRI_SELF(tskpri); 00065 00066 retry: 00067 T_ACQUIRE_LOCK(runccb->tsk_lock); 00068 pri = (tskpri == TPRI_SELF) ? runtsk->priority : INT_PRIORITY(tskpri); 00069 dspreq = rotate_ready_queue(my_local_ccb, pri); 00070 ercd = E_OK; 00071 T_RELEASE_LOCK_AND_DISPATCH(runccb->tsk_lock, dspreq); 00072 00073 exit: 00074 LOG_ROT_RDQ_LEAVE(ercd); 00075 return(ercd); 00076 } 00077 00078 #endif /* __rot_rdq */ 00079 00083 #ifdef __irot_rdq 00084 00085 SYSCALL ER 00086 irot_rdq(PRI tskpri) 00087 { 00088 ER ercd; 00089 00090 LOG_IROT_RDQ_ENTER(tskpri); 00091 CHECK_INTCTX_UNL(); 00092 CHECK_TPRI(tskpri); 00093 00094 retry: 00095 I_ACQUIRE_LOCK(runccb->tsk_lock); 00096 if (rotate_ready_queue(my_local_ccb, INT_PRIORITY(tskpri))) { 00097 reqflg = TRUE; 00098 } 00099 ercd = E_OK; 00100 I_RELEASE_LOCK(runccb->tsk_lock) 00101 00102 exit: 00103 LOG_IROT_RDQ_LEAVE(ercd); 00104 return(ercd); 00105 } 00106 00107 #endif /* __irot_rdq */ 00108 00112 #ifdef __mrot_rdq 00113 00114 SYSCALL ER 00115 mrot_rdq(ID clsid, PRI tskpri) 00116 { 00117 UINT pri; 00118 CCB *ccb; 00119 BOOL dspreq = FALSE; 00120 ER ercd; 00121 00122 LOG_ROT_RDQ_ENTER(tskpri); 00123 CHECK_TSKCTX_UNL(); 00124 CHECK_TPRI(tskpri); 00125 CHECK_CLSID_SELF(clsid); 00126 ccb = t_get_ccb_self(clsid); 00127 00128 retry: 00129 T_ACQUIRE_LOCK(ccb->tsk_lock); 00130 pri = INT_PRIORITY(tskpri); 00131 if (rotate_ready_queue(ccb, pri)) { 00132 dspreq = dispatch_request(ccb->prcid); 00133 } 00134 T_RELEASE_LOCK_AND_DISPATCH(ccb->tsk_lock, dspreq); 00135 00136 exit: 00137 LOG_ROT_RDQ_LEAVE(ercd); 00138 return(E_OK); 00139 } 00140 00141 #endif /* __mrot_rdq */ 00142 00146 #ifdef __imrot_rdq 00147 00148 SYSCALL ER 00149 imrot_rdq(ID clsid, PRI tskpri) 00150 { 00151 CCB *ccb; 00152 ER ercd; 00153 00154 LOG_IROT_RDQ_ENTER(tskpri); 00155 CHECK_INTCTX_UNL(); 00156 CHECK_TPRI(tskpri); 00157 ccb = i_get_ccb_self(clsid); 00158 00159 retry: 00160 I_ACQUIRE_LOCK(ccb->tsk_lock); 00161 if (rotate_ready_queue(ccb, INT_PRIORITY(tskpri))) { 00162 reqflg = dispatch_request(ccb->prcid) ? TRUE : reqflg; 00163 } 00164 ercd = E_OK; 00165 I_RELEASE_LOCK(ccb->tsk_lock) 00166 00167 exit: 00168 LOG_IROT_RDQ_LEAVE(ercd); 00169 return(ercd); 00170 } 00171 00172 #endif /* __imrot_rdq */ 00173 00177 #ifdef __get_tid 00178 00179 SYSCALL ER 00180 get_tid(ID *p_tskid) 00181 { 00182 ER ercd; 00183 00184 LOG_GET_TID_ENTER(p_tskid); 00185 CHECK_TSKCTX_UNL(); 00186 00187 t_lock_cpu(); 00188 *p_tskid = TSKID(runtsk); 00189 ercd = E_OK; 00190 t_unlock_cpu(); 00191 00192 exit: 00193 LOG_GET_TID_LEAVE(ercd, *p_tskid); 00194 return(ercd); 00195 } 00196 00197 #endif /* __get_tid */ 00198 00202 #ifdef __iget_tid 00203 00204 SYSCALL ER 00205 iget_tid(ID *p_tskid) 00206 { 00207 ER ercd; 00208 00209 LOG_IGET_TID_ENTER(p_tskid); 00210 CHECK_INTCTX_UNL(); 00211 00212 i_lock_cpu(); 00213 *p_tskid = (runtsk == NULL) ? TSK_NONE : TSKID(runtsk); 00214 ercd = E_OK; 00215 i_unlock_cpu(); 00216 00217 exit: 00218 LOG_IGET_TID_LEAVE(ercd, *p_tskid); 00219 return(ercd); 00220 } 00221 00222 #endif /* __iget_tid */ 00223 00227 #ifdef __mget_tid 00228 00229 SYSCALL ER 00230 mget_tid(ID clsid, ID *p_tskid) 00231 { 00232 ER ercd; 00233 CCB *ccb; 00234 00235 CHECK_TSKCTX_UNL(); 00236 CHECK_CLSID_SELF(clsid); 00237 ccb = t_get_ccb_self(clsid); 00238 00239 t_lock_cpu(); 00240 *p_tskid = ((*ccb->p_runtsk) == NULL) ? TSK_NONE : MTSKID((ccb->tsk.cb_table), (*ccb->p_runtsk)); 00241 ercd = E_OK; 00242 t_unlock_cpu(); 00243 00244 exit: 00245 return(ercd); 00246 } 00247 00248 #endif /* __mget_tid */ 00249 00253 #ifdef __imget_tid 00254 00255 SYSCALL ER 00256 imget_tid(ID clsid, ID *p_tskid) 00257 { 00258 ER ercd; 00259 CCB *ccb; 00260 00261 CHECK_INTCTX_UNL(); 00262 00263 CHECK_CLSID_SELF(clsid); 00264 ccb = i_get_ccb_self(clsid); 00265 00266 i_lock_cpu(); 00267 *p_tskid = ((*ccb->p_runtsk) == NULL) ? TSK_NONE : MTSKID((ccb->tsk.cb_table), (*ccb->p_runtsk)); 00268 ercd = E_OK; 00269 i_unlock_cpu(); 00270 00271 exit: 00272 return(ercd); 00273 } 00274 00275 #endif /* __imget_tid */ 00276 00280 #ifdef __loc_cpu 00281 00282 SYSCALL ER 00283 loc_cpu(void) 00284 { 00285 ER ercd; 00286 00287 LOG_LOC_CPU_ENTER(); 00288 CHECK_TSKCTX(); 00289 00290 if (!(t_sense_lock())) { 00291 t_lock_cpu(); 00292 } 00293 ercd = E_OK; 00294 00295 exit: 00296 LOG_LOC_CPU_LEAVE(ercd); 00297 return(ercd); 00298 } 00299 00300 #endif /* __loc_cpu */ 00301 00305 #ifdef __iloc_cpu 00306 00307 SYSCALL ER 00308 iloc_cpu(void) 00309 { 00310 ER ercd; 00311 00312 LOG_ILOC_CPU_ENTER(); 00313 CHECK_INTCTX(); 00314 00315 if (!(i_sense_lock())) { 00316 i_lock_cpu(); 00317 } 00318 ercd = E_OK; 00319 00320 exit: 00321 LOG_ILOC_CPU_LEAVE(ercd); 00322 return(ercd); 00323 } 00324 00325 #endif /* __iloc_cpu */ 00326 00334 #ifdef __unl_cpu 00335 00336 SYSCALL ER 00337 unl_cpu(void) 00338 { 00339 ER ercd; 00340 00341 LOG_UNL_CPU_ENTER(); 00342 CHECK_TSKCTX(); 00343 00344 if (t_sense_lock()) { 00345 t_unlock_cpu(); 00346 } 00347 ercd = E_OK; 00348 00349 exit: 00350 LOG_UNL_CPU_LEAVE(ercd); 00351 return(ercd); 00352 } 00353 00354 #endif /* __unl_cpu */ 00355 00363 #ifdef __iunl_cpu 00364 00365 SYSCALL ER 00366 iunl_cpu(void) 00367 { 00368 ER ercd; 00369 00370 LOG_IUNL_CPU_ENTER(); 00371 CHECK_INTCTX(); 00372 00373 if (i_sense_lock()) { 00374 i_unlock_cpu(); 00375 } 00376 ercd = E_OK; 00377 00378 exit: 00379 LOG_IUNL_CPU_LEAVE(ercd); 00380 return(ercd); 00381 } 00382 00383 #endif /* __iunl_cpu */ 00384 00388 #ifdef __dis_dsp 00389 00390 SYSCALL ER 00391 dis_dsp(void) 00392 { 00393 ER ercd; 00394 00395 LOG_DIS_DSP_ENTER(); 00396 CHECK_TSKCTX_UNL(); 00397 00398 retry: 00399 T_ACQUIRE_LOCK_AND_CHECK_RUNNABLE(); 00400 enadsp = FALSE; 00401 ercd = E_OK; 00402 T_RELEASE_LOCK(runccb->tsk_lock); 00403 00404 exit: 00405 LOG_DIS_DSP_LEAVE(ercd); 00406 return(ercd); 00407 } 00408 00409 #endif /* __dis_dsp */ 00410 00414 #ifdef __ena_dsp 00415 00416 SYSCALL ER 00417 ena_dsp(void) 00418 { 00419 ER ercd; 00420 BOOL dspreq = FALSE; 00421 00422 LOG_ENA_DSP_ENTER(); 00423 CHECK_TSKCTX_UNL(); 00424 00425 retry: 00426 T_ACQUIRE_LOCK(runccb->tsk_lock); 00427 enadsp = TRUE; 00428 if (runtsk->terflg) { 00429 T_RELEASE_LOCK(runccb->tsk_lock); 00430 exit_and_dispatch(); 00431 } 00432 if (runtsk != schedtsk) { 00433 dspreq = TRUE; 00434 } 00435 T_RELEASE_LOCK_AND_DISPATCH(runccb->tsk_lock, dspreq); 00436 ercd = E_OK; 00437 00438 exit: 00439 LOG_ENA_DSP_LEAVE(ercd); 00440 return(ercd); 00441 } 00442 00443 #endif /* __ena_dsp */ 00444 00448 #ifdef __sns_ctx 00449 00450 SYSCALL BOOL 00451 sns_ctx(void) 00452 { 00453 BOOL state; 00454 00455 LOG_SNS_CTX_ENTER(); 00456 state = sense_context() ? TRUE : FALSE; 00457 LOG_SNS_CTX_LEAVE(state); 00458 return(state); 00459 } 00460 00461 #endif /* __sns_ctx */ 00462 00466 #ifdef __sns_loc 00467 00468 SYSCALL BOOL 00469 sns_loc(void) 00470 { 00471 BOOL state; 00472 00473 LOG_SNS_LOC_ENTER(); 00474 state = sense_lock() ? TRUE : FALSE; 00475 LOG_SNS_LOC_LEAVE(state); 00476 return(state); 00477 } 00478 00479 #endif /* __sns_loc */ 00480 00484 #ifdef __sns_dsp 00485 00486 SYSCALL BOOL 00487 sns_dsp(void) 00488 { 00489 BOOL state; 00490 00491 LOG_SNS_DSP_ENTER(); 00492 state = !(enadsp) ? TRUE : FALSE; 00493 LOG_SNS_DSP_LEAVE(state); 00494 return(state); 00495 } 00496 00497 #endif /* __sns_dsp */ 00498 00502 #ifdef __sns_dpn 00503 00504 SYSCALL BOOL 00505 sns_dpn(void) 00506 { 00507 BOOL state; 00508 00509 LOG_SNS_DPN_ENTER(); 00510 state = (sense_context() || sense_lock() || !(enadsp)) ? TRUE : FALSE; 00511 LOG_SNS_DPN_LEAVE(state); 00512 return(state); 00513 } 00514 00515 #endif /* __sns_dpn */ 00516 00520 #ifdef __vsns_ini 00521 00522 SYSCALL BOOL 00523 vsns_ini(void) 00524 { 00525 BOOL state; 00526 00527 LOG_VSNS_INI_ENTER(); 00528 state = !(iniflg) ? TRUE : FALSE; 00529 LOG_VSNS_INI_LEAVE(state); 00530 return(state); 00531 } 00532 00533 #endif /* __vsns_ini */ Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:13 2006 に Doxygen によって生成されました。 |