/*! * システムコールの処理(exd_tsk():自タスクの終了と排除) * TCBが排除されるので返却値はなしにする */ void exd_tsk_isr(void) { TCB *tmpcurrent; /* * カーネルオブジェクトを取得しているかチェック. * release_objectの後のコールスタックでg_currentが書き換えられる場合があるので, * 呼び出したタスク(自タスク)を一時退避させておく */ if (g_current->get_info.flags != TASK_NOT_GET_OBJECT) { tmpcurrent = g_current; g_current = tmpcurrent; } /* 本来ならスタックも解放して再利用できるようにすべきだが省略. */ KERNEL_OUTMSG(g_current->init.name); KERNEL_OUTMSG(" EXIT.\n"); memset(g_current, -1, sizeof(*g_current)); /* ノードの初期化 */ /* タスクalocリストから抜き取りfreeリストへ挿入 */ get_aloclist(g_current); /* alocリストから抜き取り */ /* freeリスト先頭へ挿入 */ g_current->free_next = g_tsk_info.freehead; g_current->free_prev = g_tsk_info.freehead->free_prev; /* NULLが入る */ g_tsk_info.freehead = g_current->free_next->free_prev = g_current->free_prev->free_next = g_current; g_tsk_info.id_table[g_current->init.tskid] = NULL; /* ID変換テーブルのクリア */ }
/*! * システムコール処理(del_tsk():タスクの排除) * 休止状態にあるタスクを未登録状態にする(自タスクの排除は認めない) * *tcb : 排除するタスクコントロールブロックへのポインタ * (返却値)E_OK : 正常終了 * (返却値)E_OBJ : エラー終了(タスクがその他の状態) */ ER del_tsk_isr(TCB *tcb) { /* 本来ならスタックも解放して再利用できるようにすべきだが省略.*/ /* 休止状態の場合(排除) */ if (tcb->state == TASK_DORMANT) { memset(tcb, -1, sizeof(*tcb)); /* ノードを初期化 */ /* タスクalocリストから抜き取りfreeリストへ挿入 */ get_aloclist(tcb); /* alocリストから抜き取り */ /* freeリスト先頭へ挿入 */ tcb->free_next = g_tsk_info.freehead; tcb->free_prev = g_tsk_info.freehead->free_prev; g_tsk_info.freehead = tcb->free_next->free_prev = tcb->free_prev->free_next = tcb; DEBUG_LEVEL1_OUTMSG(" delete task contorol block : del_tsk_isr()\n"); return E_OK; } /* その他の状態 */ else { DEBUG_LEVEL1_OUTMSG(" not delete task contorol block : del_tsk_isr().\n"); return E_OBJ; } }
/*! * システムコール処理(del_mtx():mutexコントロールブロックの排除) * *mcb : mutexコントロールブロックへのポインタ * (返却値)EV_NDL : セマフォ取得中は排除できない * (返却値)E_OK : 正常終了(排除完了) */ ER del_mtx_isr(MTXCB *mcb) { /*セマフォ取得中は排除できない*/ if ((mcb->mtxvalue) || (mcb->locks)) { DEBUG_OUTMSG("not delete busy mutexID for interrput handler\n"); return EV_NDL; /*排除エラー終了*/ } /*セマフォ排除操作*/ else { memset(mcb, -1, sizeof(*mcb)); /* ノードを初期化 */ /* 動的型の場合,alocリストから抜き取りfreeリストへ挿入 */ if (mcb->mtx_type &= DYNAMIC_MUTEX) { get_aloclist(mcb); /* alocリストから抜き取り */ /* freeリスト先頭へ挿入 */ mcb->next = mg_mtx_info.freehead; mcb->prev = mg_mtx_info.freehead->prev; mg_mtx_info.freehead = mcb->next->prev = mcb->prev->next = mcb; } DEBUG_OUTMSG("delete mutex contorol block for interrput handler\n"); return E_OK; } }