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 によって生成されました。