示例#1
0
/*!
 * システムコールの処理(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変換テーブルのクリア */
}
示例#2
0
/*!
 * システムコール処理(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;
  }
}
示例#3
0
文件: mutex.c 项目: lifangbo/embos
/*!
* システムコール処理(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;
  }
}