Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/kernel/task_sync.c
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/kernel/task_sync.c
r321 r429 6 6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 7 7 * Toyohashi Univ. of Technology, JAPAN 8 * Copyright (C) 2005-201 5by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 118 118 119 119 /* 120 * 起床待ち 120 * 起床待ち[NGKI1252] 121 121 */ 122 122 #ifdef TOPPERS_slp_tsk … … 129 129 130 130 LOG_SLP_TSK_ENTER(); 131 CHECK_DISPATCH(); 131 CHECK_DISPATCH(); /*[NGKI1254]*/ 132 132 133 133 lock_cpu_dsp(); 134 134 if (p_runtsk->raster) { 135 ercd = E_RASTER; 135 ercd = E_RASTER; /*[NGKI3455]*/ 136 136 } 137 137 else if (p_runtsk->wupque) { 138 p_runtsk->wupque = false; 139 ercd = E_OK; 140 } 141 else { 142 p_runtsk->tstat = TS_WAITING_SLP; 143 make_wait(&winfo); 138 p_runtsk->wupque = false; /*[NGKI1259]*/ 139 ercd = E_OK; 140 } 141 else { 142 make_wait(TS_WAITING_SLP, &winfo); /*[NGKI1260]*/ 144 143 LOG_TSKSTAT(p_runtsk); 145 144 dispatch(); … … 156 155 157 156 /* 158 * 起床待ち(タイムアウトあり) 157 * 起床待ち(タイムアウトあり)[NGKI1253] 159 158 */ 160 159 #ifdef TOPPERS_tslp_tsk … … 168 167 169 168 LOG_TSLP_TSK_ENTER(tmout); 170 CHECK_DISPATCH(); 171 CHECK_PAR(VALID_TMOUT(tmout)); 169 CHECK_DISPATCH(); /*[NGKI1254]*/ 170 CHECK_PAR(VALID_TMOUT(tmout)); /*[NGKI1256]*/ 172 171 173 172 lock_cpu_dsp(); 174 173 if (p_runtsk->raster) { 175 ercd = E_RASTER; 174 ercd = E_RASTER; /*[NGKI3455]*/ 176 175 } 177 176 else if (p_runtsk->wupque) { 178 p_runtsk->wupque = false; 177 p_runtsk->wupque = false; /*[NGKI1259]*/ 179 178 ercd = E_OK; 180 179 } 181 180 else if (tmout == TMO_POL) { 182 ercd = E_TMOUT; 183 } 184 else { 185 p_runtsk->tstat = TS_WAITING_SLP; 186 make_wait_tmout(&winfo, &tmevtb, tmout); 181 ercd = E_TMOUT; /*[NGKI1257]*/ 182 } 183 else { /*[NGKI1260]*/ 184 make_wait_tmout(TS_WAITING_SLP, &winfo, &tmevtb, tmout); 187 185 LOG_TSKSTAT(p_runtsk); 188 186 dispatch(); … … 199 197 200 198 /* 201 * タスクの起床 199 * タスクの起床[NGKI3531] 202 200 */ 203 201 #ifdef TOPPERS_wup_tsk … … 210 208 211 209 LOG_WUP_TSK_ENTER(tskid); 212 CHECK_UNL(); 210 CHECK_UNL(); /*[NGKI1265]*/ 213 211 if (tskid == TSK_SELF && !sense_context()) { 214 p_tcb = p_runtsk; 215 } 216 else { 217 CHECK_ID(VALID_TSKID(tskid)); 212 p_tcb = p_runtsk; /*[NGKI1275]*/ 213 } 214 else { 215 CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1267]*/ 218 216 p_tcb = get_tcb(tskid); 219 217 } … … 221 219 lock_cpu(); 222 220 if (p_tcb->p_tinib->tskatr == TA_NOEXS) { 223 ercd = E_NOEXS; 221 ercd = E_NOEXS; /*[NGKI1268]*/ 224 222 } 225 223 else if (TSTAT_DORMANT(p_tcb->tstat)) { 226 ercd = E_OBJ; 224 ercd = E_OBJ; /*[NGKI1270]*/ 227 225 } 228 226 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) { 229 wait_complete(p_tcb); 227 wait_complete(p_tcb); /*[NGKI1271]*/ 230 228 if (p_runtsk != p_schedtsk) { 231 229 if (!sense_context()) { … … 233 231 } 234 232 else { 235 request_dispatch ();233 request_dispatch_retint(); 236 234 } 237 235 } … … 239 237 } 240 238 else if (!(p_tcb->wupque)) { 241 p_tcb->wupque = true; 242 ercd = E_OK; 243 } 244 else { 245 ercd = E_QOVR; 239 p_tcb->wupque = true; /*[NGKI1273]*/ 240 ercd = E_OK; 241 } 242 else { 243 ercd = E_QOVR; /*[NGKI1274]*/ 246 244 } 247 245 unlock_cpu(); … … 255 253 256 254 /* 257 * タスク起床要求のキャンセル 255 * タスク起床要求のキャンセル[NGKI1276] 258 256 */ 259 257 #ifdef TOPPERS_can_wup … … 266 264 267 265 LOG_CAN_WUP_ENTER(tskid); 268 CHECK_TSKCTX_UNL(); 266 CHECK_TSKCTX_UNL(); /*[NGKI1277][NGKI1278]*/ 269 267 if (tskid == TSK_SELF) { 270 p_tcb = p_runtsk; 271 } 272 else { 273 CHECK_ID(VALID_TSKID(tskid)); 268 p_tcb = p_runtsk; /*[NGKI1285]*/ 269 } 270 else { 271 CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1280]*/ 274 272 p_tcb = get_tcb(tskid); 275 273 } … … 277 275 lock_cpu(); 278 276 if (p_tcb->p_tinib->tskatr == TA_NOEXS) { 279 ercd = E_NOEXS; 277 ercd = E_NOEXS; /*[NGKI1281]*/ 280 278 } 281 279 else if (TSTAT_DORMANT(p_tcb->tstat)) { 282 ercd = E_OBJ; 283 } 284 else { 285 ercd = p_tcb->wupque ? 1 : 0; 286 p_tcb->wupque = false; 280 ercd = E_OBJ; /*[NGKI1283]*/ 281 } 282 else { 283 ercd = p_tcb->wupque ? 1 : 0; /*[NGKI1284]*/ 284 p_tcb->wupque = false; /*[NGKI1284]*/ 287 285 } 288 286 unlock_cpu(); … … 296 294 297 295 /* 298 * 待ち状態の強制解除 296 * 待ち状態の強制解除[NGKI3532] 299 297 */ 300 298 #ifdef TOPPERS_rel_wai … … 307 305 308 306 LOG_REL_WAI_ENTER(tskid); 309 CHECK_UNL(); 310 CHECK_ID(VALID_TSKID(tskid)); 307 CHECK_UNL(); /*[NGKI1290]*/ 308 CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1292]*/ 311 309 p_tcb = get_tcb(tskid); 312 310 313 311 lock_cpu(); 314 312 if (p_tcb->p_tinib->tskatr == TA_NOEXS) { 315 ercd = E_NOEXS; 313 ercd = E_NOEXS; /*[NGKI1293]*/ 316 314 } 317 315 else if (!TSTAT_WAITING(p_tcb->tstat)) { 318 ercd = E_OBJ; 319 } 320 else { 321 wait_dequeue_wobj(p_tcb); 316 ercd = E_OBJ; /*[NGKI1295]*/ 317 } 318 else { 319 wait_dequeue_wobj(p_tcb); /*[NGKI1296]*/ 322 320 wait_dequeue_tmevtb(p_tcb); 323 p_tcb->p_winfo->wercd = E_RLWAI; 321 p_tcb->p_winfo->wercd = E_RLWAI; /*[NGKI1297]*/ 324 322 make_non_wait(p_tcb); 325 323 if (p_runtsk != p_schedtsk) { … … 328 326 } 329 327 else { 330 request_dispatch ();328 request_dispatch_retint(); 331 329 } 332 330 } … … 409 407 410 408 /* 411 * 強制待ち状態からの再開 409 * 強制待ち状態からの再開[NGKI1312] 412 410 */ 413 411 #ifdef TOPPERS_rsm_tsk … … 420 418 421 419 LOG_RSM_TSK_ENTER(tskid); 422 CHECK_TSKCTX_UNL(); 423 CHECK_ID(VALID_TSKID(tskid)); 420 CHECK_TSKCTX_UNL(); /*[NGKI1313][NGKI1314]*/ 421 CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1316]*/ 424 422 p_tcb = get_tcb(tskid); 425 423 426 424 lock_cpu(); 427 425 if (p_tcb->p_tinib->tskatr == TA_NOEXS) { 428 ercd = E_NOEXS; 426 ercd = E_NOEXS; /*[NGKI1317]*/ 429 427 } 430 428 else if (!TSTAT_SUSPENDED(p_tcb->tstat)) { 431 ercd = E_OBJ; 432 } 433 else if (!TSTAT_WAITING(p_tcb->tstat)){429 ercd = E_OBJ; /*[NGKI1319]*/ 430 } 431 else { 434 432 /* 435 * 強制待ち 状態から実行できる状態への遷移433 * 強制待ちからの再開[NGKI1320] 436 434 */ 437 p_tcb->tstat = TS_RUNNABLE; 438 LOG_TSKSTAT(p_tcb); 439 make_runnable(p_tcb); 440 if (p_runtsk != p_schedtsk) { 441 dispatch(); 435 if (!TSTAT_WAITING(p_tcb->tstat)) { 436 p_tcb->tstat = TS_RUNNABLE; 437 LOG_TSKSTAT(p_tcb); 438 make_runnable(p_tcb); 439 if (p_runtsk != p_schedtsk) { 440 dispatch(); 441 } 442 442 } 443 ercd = E_OK; 444 } 445 else { 446 /* 447 * 二重待ち状態から待ち状態への遷移 448 */ 449 p_tcb->tstat &= ~TS_SUSPENDED; 450 LOG_TSKSTAT(p_tcb); 443 else { 444 p_tcb->tstat &= ~TS_SUSPENDED; 445 LOG_TSKSTAT(p_tcb); 446 } 451 447 ercd = E_OK; 452 448 } … … 461 457 462 458 /* 463 * 自タスクの遅延 459 * 自タスクの遅延[NGKI1348] 464 460 */ 465 461 #ifdef TOPPERS_dly_tsk … … 473 469 474 470 LOG_DLY_TSK_ENTER(dlytim); 475 CHECK_DISPATCH(); 476 CHECK_PAR(VALID_RELTIM(dlytim)); 471 CHECK_DISPATCH(); /*[NGKI1349]*/ 472 CHECK_PAR(VALID_RELTIM(dlytim)); /*[NGKI1351]*/ 477 473 478 474 lock_cpu_dsp(); 479 475 if (p_runtsk->raster) { 480 ercd = E_RASTER; 481 } 482 else { 483 p_runtsk->tstat = TS_WAITING_DLY; 476 ercd = E_RASTER; /*[NGKI3456]*/ 477 } 478 else { 479 p_runtsk->tstat = TS_WAITING_DLY; /*[NGKI1353]*/ 484 480 make_non_runnable(p_runtsk); 485 481 p_runtsk->p_winfo = &winfo; … … 487 483 tmevtb.callback = (CBACK) wait_tmout_ok; 488 484 tmevtb.arg = (void *) p_runtsk; 489 tmevtb_enqueue (&tmevtb, dlytim);485 tmevtb_enqueue_reltim(&tmevtb, dlytim); 490 486 LOG_TSKSTAT(p_runtsk); 491 487 dispatch();
Note:
See TracChangeset
for help on using the changeset viewer.