Changeset 318 for asp3_gr_sakura/trunk/kernel/task_term.c
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_gr_sakura/trunk/kernel/task_term.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=UTF-8
r317 r318 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ä¸è¨èä½æ¨©è 12 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 13 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 14 * å¤ã»åé 15 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 16 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 17 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 18 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 19 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 20 * ç¨ã§ããå½¢ã§åé 21 å¸ããå ´åã«ã¯ï¼åé 22 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 23 * è 24 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 25 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 26 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 27 * ç¨ã§ããªãå½¢ã§åé 28 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 29 * ã¨ï¼ 30 * (a) åé 31 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 32 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 33 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 34 * (b) åé 35 å¸ã®å½¢æ 36 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 37 * å ±åãããã¨ï¼ 38 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 39 * 害ãããï¼ä¸è¨èä½æ¨©è 40 ããã³TOPPERSããã¸ã§ã¯ããå 41 責ãããã¨ï¼ 42 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 43 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 44 ããã³TOPPERSããã¸ã§ã¯ãã 45 * å 46 責ãããã¨ï¼ 11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 16 * スコード中に含まれていること. 17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 20 * の無保証規定を掲載すること. 21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 23 * と. 24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 25 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 27 * 報告すること. 28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 32 * 免責すること. 47 33 * 48 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 49 ã 50 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 51 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 52 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 53 * ã®è²¬ä»»ãè² ããªãï¼ 34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 54 39 * 55 40 * $Id$ … … 57 42 58 43 /* 59 * ã¿ã¹ã¯çµäºæ©è½44 * タスク終了機能 60 45 */ 61 46 … … 67 52 68 53 /* 69 * ãã¬ã¼ã¹ãã°ãã¯ãã®ããã©ã«ãå®ç¾©54 * トレースログマクロのデフォルト定義 70 55 */ 71 56 #ifndef LOG_EXT_TSK_ENTER … … 118 103 119 104 /* 120 * èªã¿ã¹ã¯ã®çµäºï¼»NGKI1162ï¼½105 * 自タスクの終了[NGKI1162] 121 106 */ 122 107 #ifdef TOPPERS_ext_tsk … … 129 114 130 115 LOG_EXT_TSK_ENTER(); 131 CHECK_TSKCTX(); /* ï¼»NGKI1164ï¼½*/116 CHECK_TSKCTX(); /*[NGKI1164]*/ 132 117 133 118 if (sense_lock()) { 134 119 /* 135 * CPUããã¯ç¶æ 136 ã§ext_tskãå¼ã°ããå ´åã¯ï¼CPUããã¯ã解é¤ã 137 * ã¦ããã¿ã¹ã¯ãçµäºããï¼å®è£ 138 ä¸ã¯ï¼ãµã¼ãã¹ã³ã¼ã«å 139 ã§ã®CPU 140 * ããã¯ãçç¥ããã°ããã ãï¼ï¼»NGKI1168ï¼½ 120 * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し 121 * てからタスクを終了する.実装上は,サービスコール内でのCPU 122 * ロックを省略すればよいだけ.[NGKI1168] 141 123 */ 142 124 } … … 149 131 if (!enadsp) { 150 132 /* 151 * ãã£ã¹ãããç¦æ¢ç¶æ 152 ã§ext_tskãå¼ã°ããå ´åã¯ï¼ãã£ã¹ãã 153 * ã許å¯ç¶æ 154 ã«ãã¦ããã¿ã¹ã¯ãçµäºããï¼ï¼»NGKI1168ï¼½ 133 * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ 134 * チ許可状態にしてからタスクを終了する.[NGKI1168] 155 135 */ 156 136 enadsp = true; … … 158 138 if (intpri != TIPM_ENAALL) { 159 139 /* 160 * å²è¾¼ã¿åªå 161 度ãã¹ã¯ï¼IPMï¼ãTIPM_ENAALL以å¤ã®ç¶æ 162 㧠163 * ext_tskãå¼ã°ããå ´åã¯ï¼IPMãTIPM_ENAALLã«ãã¦ããã¿ã¹ 164 * ã¯ãçµäºããï¼ï¼»NGKI1168ï¼½ 140 * 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態で 141 * ext_tskが呼ばれた場合は,IPMをTIPM_ENAALLにしてからタス 142 * クを終了する.[NGKI1168] 165 143 */ 166 144 t_set_ipm(TIPM_ENAALL); … … 176 154 } 177 155 #endif /* TOPPERS_SUPPORT_OVRHDR */ 178 task_terminate(p_runtsk); /* ï¼»NGKI3449ï¼½*/179 exit_and_dispatch(); /* ï¼»NGKI1169ï¼½*/180 ercd = E_SYS; /* ï¼»NGKI1163ï¼½*/156 task_terminate(p_runtsk); /* [NGKI3449]*/ 157 exit_and_dispatch(); /* [NGKI1169]*/ 158 ercd = E_SYS; /* [NGKI1163]*/ 181 159 182 160 error_exit: … … 188 166 189 167 /* 190 * ã¿ã¹ã¯ã®çµäºè¦æ±ï¼»NGKI3469ï¼½168 * タスクの終了要求[NGKI3469] 191 169 */ 192 170 #ifdef TOPPERS_ras_ter … … 199 177 200 178 LOG_RAS_TER_ENTER(tskid); 201 CHECK_TSKCTX_UNL(); /* ï¼»NGKI3470][NGKI3471ï¼½*/202 CHECK_ID(VALID_TSKID(tskid)); /* ï¼»NGKI3472ï¼½*/179 CHECK_TSKCTX_UNL(); /*[NGKI3470][NGKI3471]*/ 180 CHECK_ID(VALID_TSKID(tskid)); /*[NGKI3472]*/ 203 181 p_tcb = get_tcb(tskid); 204 CHECK_ILUSE(p_tcb != p_runtsk); /* ï¼»NGKI3475ï¼½*/182 CHECK_ILUSE(p_tcb != p_runtsk); /*[NGKI3475]*/ 205 183 206 184 lock_cpu(); 207 185 if (p_tcb->p_tinib->tskatr == TA_NOEXS) { 208 ercd = E_NOEXS; /* ï¼»NGKI3473ï¼½*/186 ercd = E_NOEXS; /*[NGKI3473]*/ 209 187 } 210 188 else if (TSTAT_DORMANT(p_tcb->tstat)) { 211 ercd = E_OBJ; /* ï¼»NGKI3476ï¼½*/189 ercd = E_OBJ; /*[NGKI3476]*/ 212 190 } 213 191 else if (p_tcb->enater) { 214 task_terminate(p_tcb); /* ï¼»NGKI3477ï¼½*/192 task_terminate(p_tcb); /*[NGKI3477]*/ 215 193 if (p_runtsk != p_schedtsk) { 216 194 dispatch(); … … 219 197 } 220 198 else { 221 p_tcb->raster = true; /* ï¼»NGKI3478ï¼½*/199 p_tcb->raster = true; /*[NGKI3478]*/ 222 200 if (!TSTAT_RUNNABLE(p_tcb->tstat)) { 223 201 if (TSTAT_WAITING(p_tcb->tstat)) { 224 wait_dequeue_wobj(p_tcb); /* ï¼»NGKI3479ï¼½*/202 wait_dequeue_wobj(p_tcb); /*[NGKI3479]*/ 225 203 wait_dequeue_tmevtb(p_tcb); 226 p_tcb->p_winfo->wercd = E_RASTER; /* ï¼»NGKI3480ï¼½*/204 p_tcb->p_winfo->wercd = E_RASTER; /*[NGKI3480]*/ 227 205 } 228 p_tcb->tstat = TS_RUNNABLE; /* ï¼»NGKI3606ï¼½*/206 p_tcb->tstat = TS_RUNNABLE; /*[NGKI3606]*/ 229 207 LOG_TSKSTAT(p_tcb); 230 208 make_runnable(p_tcb); … … 245 223 246 224 /* 247 * ã¿ã¹ã¯çµäºã®ç¦æ¢ï¼»NGKI3482ï¼½225 * タスク終了の禁止[NGKI3482] 248 226 */ 249 227 #ifdef TOPPERS_dis_ter … … 255 233 256 234 LOG_DIS_TER_ENTER(); 257 CHECK_TSKCTX_UNL(); /* ï¼»NGKI3483][NGKI3484ï¼½*/235 CHECK_TSKCTX_UNL(); /*[NGKI3483][NGKI3484]*/ 258 236 259 237 lock_cpu(); 260 p_runtsk->enater = false; /* ï¼»NGKI3486ï¼½*/238 p_runtsk->enater = false; /*[NGKI3486]*/ 261 239 ercd = E_OK; 262 240 unlock_cpu(); … … 270 248 271 249 /* 272 * ã¿ã¹ã¯çµäºã®è¨±å¯ï¼»NGKI3487ï¼½250 * タスク終了の許可[NGKI3487] 273 251 */ 274 252 #ifdef TOPPERS_ena_ter … … 280 258 281 259 LOG_ENA_TER_ENTER(); 282 CHECK_TSKCTX_UNL(); /* ï¼»NGKI3488][NGKI3489ï¼½*/260 CHECK_TSKCTX_UNL(); /*[NGKI3488][NGKI3489]*/ 283 261 284 262 lock_cpu(); … … 295 273 } 296 274 else { 297 p_runtsk->enater = true; /* ï¼»NGKI3491ï¼½*/275 p_runtsk->enater = true; /*[NGKI3491]*/ 298 276 ercd = E_OK; 299 277 } … … 308 286 309 287 /* 310 * ã¿ã¹ã¯çµäºç¦æ¢ç¶æ 311 ã®åç 312 §ï¼»NGKI3494ï¼½ 288 * タスク終了禁止状態の参照[NGKI3494] 313 289 */ 314 290 #ifdef TOPPERS_sns_ter … … 321 297 LOG_SNS_TER_ENTER(); 322 298 /* 323 * enater ãå¤æ´ã§ããã®ã¯èªã¿ã¹ã¯ã®ã¿ã§ããããï¼æä»å¶å¾¡ããã«èª324 * ãã§ãåé¡ãªãï¼299 * enaterを変更できるのは自タスクのみであるため,排他制御せずに読 300 * んでも問題ない. 325 301 */ 326 302 state = (p_runtsk != NULL && p_runtsk->enater) ? false : true; 327 /* ï¼»NGKI3495][NGKI3496ï¼½*/303 /*[NGKI3495][NGKI3496]*/ 328 304 LOG_SNS_TER_LEAVE(state); 329 305 return(state); … … 333 309 334 310 /* 335 * ã¿ã¹ã¯ã®å¼·å¶çµäºï¼»NGKI1170ï¼½311 * タスクの強制終了[NGKI1170] 336 312 */ 337 313 #ifdef TOPPERS_ter_tsk … … 344 320 345 321 LOG_TER_TSK_ENTER(tskid); 346 CHECK_TSKCTX_UNL(); /* ï¼»NGKI1171][NGKI1172ï¼½*/347 CHECK_ID(VALID_TSKID(tskid)); /* ï¼»NGKI1173ï¼½*/322 CHECK_TSKCTX_UNL(); /*[NGKI1171][NGKI1172]*/ 323 CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1173]*/ 348 324 p_tcb = get_tcb(tskid); 349 CHECK_ILUSE(p_tcb != p_runtsk); /* ï¼»NGKI1176ï¼½*/325 CHECK_ILUSE(p_tcb != p_runtsk); /*[NGKI1176]*/ 350 326 351 327 lock_cpu(); 352 328 if (p_tcb->p_tinib->tskatr == TA_NOEXS) { 353 ercd = E_NOEXS; /* ï¼»NGKI1174ï¼½*/329 ercd = E_NOEXS; /*[NGKI1174]*/ 354 330 } 355 331 else if (TSTAT_DORMANT(p_tcb->tstat)) { 356 ercd = E_OBJ; /* ï¼»NGKI1177ï¼½*/332 ercd = E_OBJ; /*[NGKI1177]*/ 357 333 } 358 334 else { 359 task_terminate(p_tcb); /* ï¼»NGKI3450ï¼½*/335 task_terminate(p_tcb); /*[NGKI3450]*/ 360 336 if (p_runtsk != p_schedtsk) { 361 337 dispatch();
Note:
See TracChangeset
for help on using the changeset viewer.