/* * 自タスクの終了とタスクの起動 */ StatusType ChainTask(TaskType tskid) { /* * ここでの ercd の初期化は本来は不要であるが,コンパイラの警 * 告メッセージを避けるために初期化している. */ StatusType ercd = E_OK; LOG_CHNTSK_ENTER(tskid); CHECK_CALLEVEL(TCL_TASK); CHECK_RESOURCE(tcb_lastres[runtsk] == RESID_NULL); CHECK_TSKID(tskid); lock_cpu(); if (tskid == runtsk) { // tcb_tstat[runtsk] = TS_DORMANT; search_schedtsk(); (void)make_active(runtsk); } else { /* * エラー時に副作用が残らないように,エラーチェックは * タスク終了処理の前に行う必要がある. */ if ((tcb_tstat[tskid] != TS_DORMANT) && (tcb_actcnt[tskid] >= tinib_maxact[tskid])) { ercd = E_OS_LIMIT; goto d_error_exit; } tcb_tstat[runtsk] = TS_DORMANT; search_schedtsk(); if (tcb_actcnt[runtsk] > 0) { tcb_actcnt[runtsk] -= 1; (void)make_active(runtsk); } if (tcb_tstat[tskid] == TS_DORMANT) { (void)make_active(tskid); } else { tcb_actcnt[tskid] += 1; } } exit_and_dispatch(); /* ここには戻ってこない */ error_exit: lock_cpu(); d_error_exit: _errorhook_par1.tskid = tskid; call_errorhook(ercd, OSServiceId_ChainTask); unlock_cpu(); LOG_CHNTSK_LEAVE(ercd); return(ercd); }
/* * 自タスクの終了 */ StatusType TerminateTask(void) { StatusType ercd = E_OK; LOG_TERTSK_ENTER(); CHECK_CALLEVEL(TCL_TASK); CHECK_RESOURCE(tcb_lastres[runtsk] == RESID_NULL); lock_cpu(); /* * 内部リソースの解放は優先度を下げるだけなので,ここでは * 何もしなくてよい. */ tcb_tstat[runtsk] = TS_DORMANT; search_schedtsk(); if (tcb_actcnt[runtsk] > 0) { tcb_actcnt[runtsk] -= 1; (void)make_active(runtsk); } exit_and_dispatch(); /* ここには戻ってこない */ error_exit: lock_cpu(); call_errorhook(ercd, OSServiceId_TerminateTask); unlock_cpu(); LOG_TERTSK_LEAVE(ercd); return(ercd); }
/* * イベント待ち */ StatusType WaitEvent(EventMaskType mask) { StatusType ercd = E_OK; LOG_WAIEVT_ENTER(mask); CHECK_CALLEVEL(TCL_TASK); CHECK_ACCESS(runtsk < tnum_exttask); CHECK_RESOURCE(tcb_lastres[runtsk] == RESID_NULL); lock_cpu(); if ((tcb_curevt[runtsk] & mask) == EVTMASK_NONE) { tcb_curpri[runtsk] = tinib_inipri[runtsk]; tcb_tstat[runtsk] = TS_WAITING; tcb_waievt[runtsk] = mask; search_schedtsk(); dispatch(); tcb_curpri[runtsk] = tinib_exepri[runtsk]; } exit: unlock_cpu(); LOG_WAIEVT_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); _errorhook_par1.mask = mask; call_errorhook(ercd, OSServiceId_WaitEvent); goto exit; }