sys_manage.c

説明を見る。
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: sys_manage.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_ROT_RDQ_ENTER
00055 #define LOG_ROT_RDQ_ENTER(tskpri)
00056 #endif /* LOG_ROT_RDQ_ENTER */
00057 
00058 #ifndef LOG_ROT_RDQ_LEAVE
00059 #define LOG_ROT_RDQ_LEAVE(ercd)
00060 #endif /* LOG_ROT_RDQ_LEAVE */
00061 
00062 #ifndef LOG_IROT_RDQ_ENTER
00063 #define LOG_IROT_RDQ_ENTER(tskpri)
00064 #endif /* LOG_IROT_RDQ_ENTER */
00065 
00066 #ifndef LOG_IROT_RDQ_LEAVE
00067 #define LOG_IROT_RDQ_LEAVE(ercd)
00068 #endif /* LOG_IROT_RDQ_LEAVE */
00069 
00070 #ifndef LOG_GET_TID_ENTER
00071 #define LOG_GET_TID_ENTER(p_tskid)
00072 #endif /* LOG_GET_TID_ENTER */
00073 
00074 #ifndef LOG_GET_TID_LEAVE
00075 #define LOG_GET_TID_LEAVE(ercd, tskid)
00076 #endif /* LOG_GET_TID_LEAVE */
00077 
00078 #ifndef LOG_IGET_TID_ENTER
00079 #define LOG_IGET_TID_ENTER(p_tskid)
00080 #endif /* LOG_IGET_TID_ENTER */
00081 
00082 #ifndef LOG_IGET_TID_LEAVE
00083 #define LOG_IGET_TID_LEAVE(ercd, tskid)
00084 #endif /* LOG_IGET_TID_LEAVE */
00085 
00086 #ifndef LOG_LOC_CPU_ENTER
00087 #define LOG_LOC_CPU_ENTER()
00088 #endif /* LOG_LOC_CPU_ENTER */
00089 
00090 #ifndef LOG_LOC_CPU_LEAVE
00091 #define LOG_LOC_CPU_LEAVE(ercd)
00092 #endif /* LOG_LOC_CPU_LEAVE */
00093 
00094 #ifndef LOG_ILOC_CPU_ENTER
00095 #define LOG_ILOC_CPU_ENTER()
00096 #endif /* LOG_ILOC_CPU_ENTER */
00097 
00098 #ifndef LOG_ILOC_CPU_LEAVE
00099 #define LOG_ILOC_CPU_LEAVE(ercd)
00100 #endif /* LOG_ILOC_CPU_LEAVE */
00101 
00102 #ifndef LOG_UNL_CPU_ENTER
00103 #define LOG_UNL_CPU_ENTER()
00104 #endif /* LOG_UNL_CPU_ENTER */
00105 
00106 #ifndef LOG_UNL_CPU_LEAVE
00107 #define LOG_UNL_CPU_LEAVE(ercd)
00108 #endif /* LOG_UNL_CPU_LEAVE */
00109 
00110 #ifndef LOG_IUNL_CPU_ENTER
00111 #define LOG_IUNL_CPU_ENTER()
00112 #endif /* LOG_IUNL_CPU_ENTER */
00113 
00114 #ifndef LOG_IUNL_CPU_LEAVE
00115 #define LOG_IUNL_CPU_LEAVE(ercd)
00116 #endif /* LOG_IUNL_CPU_LEAVE */
00117 
00118 #ifndef LOG_DIS_DSP_ENTER
00119 #define LOG_DIS_DSP_ENTER()
00120 #endif /* LOG_DIS_DSP_ENTER */
00121 
00122 #ifndef LOG_DIS_DSP_LEAVE
00123 #define LOG_DIS_DSP_LEAVE(ercd)
00124 #endif /* LOG_DIS_DSP_LEAVE */
00125 
00126 #ifndef LOG_ENA_DSP_ENTER
00127 #define LOG_ENA_DSP_ENTER()
00128 #endif /* LOG_ENA_DSP_ENTER */
00129 
00130 #ifndef LOG_ENA_DSP_LEAVE
00131 #define LOG_ENA_DSP_LEAVE(ercd)
00132 #endif /* LOG_ENA_DSP_LEAVE */
00133 
00134 #ifndef LOG_SNS_CTX_ENTER
00135 #define LOG_SNS_CTX_ENTER()
00136 #endif /* LOG_SNS_CTX_ENTER */
00137 
00138 #ifndef LOG_SNS_CTX_LEAVE
00139 #define LOG_SNS_CTX_LEAVE(state)
00140 #endif /* LOG_SNS_CTX_LEAVE */
00141 
00142 #ifndef LOG_SNS_LOC_ENTER
00143 #define LOG_SNS_LOC_ENTER()
00144 #endif /* LOG_SNS_LOC_ENTER */
00145 
00146 #ifndef LOG_SNS_LOC_LEAVE
00147 #define LOG_SNS_LOC_LEAVE(state)
00148 #endif /* LOG_SNS_LOC_LEAVE */
00149 
00150 #ifndef LOG_SNS_DSP_ENTER
00151 #define LOG_SNS_DSP_ENTER()
00152 #endif /* LOG_SNS_DSP_ENTER */
00153 
00154 #ifndef LOG_SNS_DSP_LEAVE
00155 #define LOG_SNS_DSP_LEAVE(state)
00156 #endif /* LOG_SNS_DSP_LEAVE */
00157 
00158 #ifndef LOG_SNS_DPN_ENTER
00159 #define LOG_SNS_DPN_ENTER()
00160 #endif /* LOG_SNS_DPN_ENTER */
00161 
00162 #ifndef LOG_SNS_DPN_LEAVE
00163 #define LOG_SNS_DPN_LEAVE(state)
00164 #endif /* LOG_SNS_DPN_LEAVE */
00165 
00166 #ifndef LOG_SNS_KER_ENTER
00167 #define LOG_SNS_KER_ENTER()
00168 #endif /* LOG_SNS_KER_ENTER */
00169 
00170 #ifndef LOG_SNS_KER_LEAVE
00171 #define LOG_SNS_KER_LEAVE(state)
00172 #endif /* LOG_SNS_KER_LEAVE */
00173 
00174 /*
00175  *  タスクの優先順位の回転
00176  */
00177 #ifdef TOPPERS_rot_rdq
00178 
00179 ER
00180 rot_rdq(PRI tskpri)
00181 {
00182     uint_t  pri;
00183     ER      ercd;
00184 
00185     LOG_ROT_RDQ_ENTER(tskpri);
00186     CHECK_TSKCTX_UNL();
00187     CHECK_TPRI_SELF(tskpri);
00188 
00189     t_lock_cpu();
00190     pri = (tskpri == TPRI_SELF) ? p_runtsk->priority : INT_PRIORITY(tskpri);
00191     if (rotate_ready_queue(pri)) {
00192         dispatch();
00193     }
00194     ercd = E_OK;
00195     t_unlock_cpu();
00196 
00197   error_exit:
00198     LOG_ROT_RDQ_LEAVE(ercd);
00199     return(ercd);
00200 }
00201 
00202 #endif /* TOPPERS_rot_rdq */
00203 
00204 /*
00205  *  タスクの優先順位の回転(非タスクコンテキスト用)
00206  */
00207 #ifdef TOPPERS_irot_rdq
00208 
00209 ER
00210 irot_rdq(PRI tskpri)
00211 {
00212     ER      ercd;
00213 
00214     LOG_IROT_RDQ_ENTER(tskpri);
00215     CHECK_INTCTX_UNL();
00216     CHECK_TPRI(tskpri);
00217 
00218     i_lock_cpu();
00219     if (rotate_ready_queue(INT_PRIORITY(tskpri))) {
00220         reqflg = true;
00221     }
00222     ercd = E_OK;
00223     i_unlock_cpu();
00224 
00225   error_exit:
00226     LOG_IROT_RDQ_LEAVE(ercd);
00227     return(ercd);
00228 }
00229 
00230 #endif /* TOPPERS_irot_rdq */
00231 
00232 /*
00233  *  実行状態のタスクIDの参照
00234  */
00235 #ifdef TOPPERS_get_tid
00236 
00237 ER
00238 get_tid(ID *p_tskid)
00239 {
00240     ER      ercd;
00241 
00242     LOG_GET_TID_ENTER(p_tskid);
00243     CHECK_TSKCTX_UNL();
00244 
00245     t_lock_cpu();
00246     *p_tskid = TSKID(p_runtsk);
00247     ercd = E_OK;
00248     t_unlock_cpu();
00249 
00250   error_exit:
00251     LOG_GET_TID_LEAVE(ercd, *p_tskid);
00252     return(ercd);
00253 }
00254 
00255 #endif /* TOPPERS_get_tid */
00256 
00257 /*
00258  *  実行状態のタスクIDの参照(非タスクコンテキスト用)
00259  */
00260 #ifdef TOPPERS_iget_tid
00261 
00262 ER
00263 iget_tid(ID *p_tskid)
00264 {
00265     ER      ercd;
00266 
00267     LOG_IGET_TID_ENTER(p_tskid);
00268     CHECK_INTCTX_UNL();
00269 
00270     i_lock_cpu();
00271     *p_tskid = (p_runtsk == NULL) ? TSK_NONE : TSKID(p_runtsk);
00272     ercd = E_OK;
00273     i_unlock_cpu();
00274 
00275   error_exit:
00276     LOG_IGET_TID_LEAVE(ercd, *p_tskid);
00277     return(ercd);
00278 }
00279 
00280 #endif /* TOPPERS_iget_tid */
00281 
00282 /*
00283  *  CPUロック状態への移行
00284  */
00285 #ifdef TOPPERS_loc_cpu
00286 
00287 ER
00288 loc_cpu(void)
00289 {
00290     ER      ercd;
00291 
00292     LOG_LOC_CPU_ENTER();
00293     CHECK_TSKCTX();
00294 
00295     if (!t_sense_lock()) {
00296         t_lock_cpu();
00297     }
00298     ercd = E_OK;
00299 
00300   error_exit:
00301     LOG_LOC_CPU_LEAVE(ercd);
00302     return(ercd);
00303 }
00304 
00305 #endif /* TOPPERS_loc_cpu */
00306 
00307 /*
00308  *  CPUロック状態への移行(非タスクコンテキスト用)
00309  */
00310 #ifdef TOPPERS_iloc_cpu
00311 
00312 ER
00313 iloc_cpu(void)
00314 {
00315     ER      ercd;
00316 
00317     LOG_ILOC_CPU_ENTER();
00318     CHECK_INTCTX();
00319 
00320     if (!i_sense_lock()) {
00321         i_lock_cpu();
00322     }
00323     ercd = E_OK;
00324 
00325   error_exit:
00326     LOG_ILOC_CPU_LEAVE(ercd);
00327     return(ercd);
00328 }
00329 
00330 #endif /* TOPPERS_iloc_cpu */
00331 
00332 /*
00333  *  CPUロック状態の解除
00334  *
00335  *  CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
00336  *  とはできないため,CPUロック状態の解除時にディスパッチャを起動する
00337  *  必要はない.
00338  */
00339 #ifdef TOPPERS_unl_cpu
00340 
00341 ER
00342 unl_cpu(void)
00343 {
00344     ER      ercd;
00345 
00346     LOG_UNL_CPU_ENTER();
00347     CHECK_TSKCTX();
00348 
00349     if (t_sense_lock()) {
00350         t_unlock_cpu();
00351     }
00352     ercd = E_OK;
00353 
00354   error_exit:
00355     LOG_UNL_CPU_LEAVE(ercd);
00356     return(ercd);
00357 }
00358 
00359 #endif /* TOPPERS_unl_cpu */
00360 
00361 /*
00362  *  CPUロック状態の解除(非タスクコンテキスト用)
00363  *
00364  *  CPUロック中は,ディスパッチが必要となるサービスコールを呼び出すこ
00365  *  とはできないため,CPUロック状態の解除時にディスパッチャの起動を要
00366  *  求する必要はない.
00367  */
00368 #ifdef TOPPERS_iunl_cpu
00369 
00370 ER
00371 iunl_cpu(void)
00372 {
00373     ER      ercd;
00374 
00375     LOG_IUNL_CPU_ENTER();
00376     CHECK_INTCTX();
00377 
00378     if (i_sense_lock()) {
00379         i_unlock_cpu();
00380     }
00381     ercd = E_OK;
00382 
00383   error_exit:
00384     LOG_IUNL_CPU_LEAVE(ercd);
00385     return(ercd);
00386 }
00387 
00388 #endif /* TOPPERS_iunl_cpu */
00389 
00390 /*
00391  *  ディスパッチの禁止
00392  */
00393 #ifdef TOPPERS_dis_dsp
00394 
00395 ER
00396 dis_dsp(void)
00397 {
00398     ER      ercd;
00399 
00400     LOG_DIS_DSP_ENTER();
00401     CHECK_TSKCTX_UNL();
00402 
00403     t_lock_cpu();
00404     disdsp = true;
00405     dspflg = false;
00406     ercd = E_OK;
00407     t_unlock_cpu();
00408 
00409   error_exit:
00410     LOG_DIS_DSP_LEAVE(ercd);
00411     return(ercd);
00412 }
00413 
00414 #endif /* TOPPERS_dis_dsp */
00415 
00416 /*
00417  *  ディスパッチの許可
00418  */
00419 #ifdef TOPPERS_ena_dsp
00420 
00421 ER
00422 ena_dsp(void)
00423 {
00424     ER      ercd;
00425 
00426     LOG_ENA_DSP_ENTER();
00427     CHECK_TSKCTX_UNL();
00428 
00429     t_lock_cpu();
00430     disdsp = false;
00431     if (t_get_ipm() == TIPM_ENAALL) {
00432         dspflg = true;
00433         if (p_runtsk != p_schedtsk) {
00434             dispatch();
00435         }
00436     }
00437     ercd = E_OK;
00438     t_unlock_cpu();
00439 
00440   error_exit:
00441     LOG_ENA_DSP_LEAVE(ercd);
00442     return(ercd);
00443 }
00444 
00445 #endif /* TOPPERS_ena_dsp */
00446 
00447 /*
00448  *  コンテキストの参照
00449  */
00450 #ifdef TOPPERS_sns_ctx
00451 
00452 bool_t
00453 sns_ctx(void)
00454 {
00455     bool_t  state;
00456 
00457     LOG_SNS_CTX_ENTER();
00458     state = sense_context() ? true : false;
00459     LOG_SNS_CTX_LEAVE(state);
00460     return(state);
00461 }
00462 
00463 #endif /* TOPPERS_sns_ctx */
00464 
00465 /*
00466  *  CPUロック状態の参照
00467  */
00468 #ifdef TOPPERS_sns_loc
00469 
00470 bool_t
00471 sns_loc(void)
00472 {
00473     bool_t  state;
00474 
00475     LOG_SNS_LOC_ENTER();
00476     state = x_sense_lock() ? true : false;
00477     LOG_SNS_LOC_LEAVE(state);
00478     return(state);
00479 }
00480 
00481 #endif /* TOPPERS_sns_loc */
00482 
00483 /*
00484  *  ディスパッチ禁止状態の参照
00485  */
00486 #ifdef TOPPERS_sns_dsp
00487 
00488 bool_t
00489 sns_dsp(void)
00490 {
00491     bool_t  state;
00492 
00493     LOG_SNS_DSP_ENTER();
00494     state = disdsp;
00495     LOG_SNS_DSP_LEAVE(state);
00496     return(state);
00497 }
00498 
00499 #endif /* TOPPERS_sns_dsp */
00500 
00501 /*
00502  *  ディスパッチ保留状態の参照
00503  */
00504 #ifdef TOPPERS_sns_dpn
00505 
00506 bool_t
00507 sns_dpn(void)
00508 {
00509     bool_t  state;
00510 
00511     LOG_SNS_DPN_ENTER();
00512     state = (sense_context() || t_sense_lock() || !dspflg) ? true : false;
00513     LOG_SNS_DPN_LEAVE(state);
00514     return(state);
00515 }
00516 
00517 #endif /* TOPPERS_sns_dpn */
00518 
00519 /*
00520  *  カーネル非動作状態の参照
00521  */
00522 #ifdef TOPPERS_sns_ker
00523 
00524 bool_t
00525 sns_ker(void)
00526 {
00527     bool_t  state;
00528 
00529     LOG_SNS_KER_ENTER();
00530     state = kerflg ? false : true;
00531     LOG_SNS_KER_LEAVE(state);
00532     return(state);
00533 }
00534 
00535 #endif /* TOPPERS_sns_ker */

Copyright © 2008 by Kijineko Inc.

ホームページ制作