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.