Example #1
0
/*
 *  イベント待ち
 */
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;
}
Example #2
0
/*
 *  cancle the alarm
 *
 */
StatusType
CancelAlarm(AlarmType almid)
{
	StatusType	ercd = E_OK;

	LOG_CANALM_ENTER(almid);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2);
	CHECK_ALMID(almid);

	lock_cpu();
	if (almcb_next[almid] == almid) {
		ercd = E_OS_NOFUNC;
		goto d_error_exit;
	}
	dequeue_alarm(almid, alminib_cntid[almid]);

	/*
	 *  set alarm cycle to zero
	 *  if something wrong with dequeue_alarm() not really cancel
	 *  this alarm, the Zero value of alarm cycle will make sure 
	 *  it will be auto-cancled at the next expiry value when SignalCounter()
	 */
	almcb_cycle[almid] = 0u;
  exit:
	unlock_cpu();
	LOG_CANALM_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
  d_error_exit:
	_errorhook_par1.almid = almid;
	call_errorhook(ercd, OSServiceId_CancelAlarm);
	goto exit;
}
Example #3
0
/*
 *  イベントの状態参照
 */
StatusType
GetEvent(TaskType tskid, EventMaskRefType p_mask)
{
	StatusType	ercd = E_OK;

	LOG_GETEVT_ENTER(tskid, p_mask);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2 | TCL_ERROR | TCL_PREPOST);
	CHECK_TSKID(tskid);
	CHECK_ACCESS(tskid < tnum_exttask);

	lock_cpu();
	D_CHECK_STATE(tcb_tstat[tskid] != TS_DORMANT);
	*p_mask = tcb_curevt[tskid];
  exit:
	unlock_cpu();
	LOG_GETEVT_LEAVE(ercd, *p_mask);
	return(ercd);

  error_exit:
	lock_cpu();
  d_error_exit:
	_errorhook_par1.tskid = tskid;
	_errorhook_par2.p_mask = p_mask;
	call_errorhook(ercd, OSServiceId_GetEvent);
	goto exit;
}
Example #4
0
/*
 *  スケジューラの呼び出し
 */
StatusType
Schedule(void)
{
	/*
	 *  ここでの ercd の初期化は本来は不要であるが,コンパイラの警
	 *  告メッセージを避けるために初期化している.
	 */
	StatusType	ercd = E_OK;

	LOG_SCHED_ENTER();
	CHECK_CALLEVEL(TCL_TASK);
	CHECK_RESOURCE(tcb_lastres[runtsk] == RESID_NULL);

	lock_cpu();
	if (tinib_inipri[runtsk] < nextpri) {
		tcb_curpri[runtsk] = tinib_inipri[runtsk];
		preempt();
		dispatch();
		tcb_curpri[runtsk] = tinib_exepri[runtsk];
	}
  exit:
	unlock_cpu();
	LOG_SCHED_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
	call_errorhook(ercd, OSServiceId_Schedule);
	goto exit;
}
Example #5
0
/*
 *  実行状態のタスクIDの参照
 */
StatusType
GetTaskID(TaskRefType p_tskid)
{
	StatusType	ercd = E_OK;

	LOG_GETTID_ENTER(p_tskid);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2 | TCL_ERROR | TCL_PREPOST);

	lock_cpu();
	*p_tskid = runtsk;
	/*
	 *  本来は runtsk ではなく以下の式になるべきだが,TSKID_NULL 
	 *  と INVALID_TASK は等しいので,単に runtsk でよい.
	 *      (runtsk == TSKID_NULL) ? INVALID_TASK : runtsk
	 */
  exit:
	unlock_cpu();
	LOG_GETTID_LEAVE(ercd, *p_tskid);
	return(ercd);

  error_exit:
	lock_cpu();
	call_errorhook(ercd, OSServiceId_GetTaskID);
	goto exit;

}
Example #6
0
/*
 *  タスクの起動
 */
StatusType
ActivateTask(TaskType tskid)
{
	StatusType	ercd = E_OK;

	LOG_ACTTSK_ENTER(tskid);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2);
	CHECK_TSKID(tskid);

	lock_cpu();
	if (tcb_tstat[tskid] == TS_DORMANT) {
		if ((make_active(tskid)) && (callevel == TCL_TASK)) {
			dispatch();
		}
	}
	else if (tcb_actcnt[tskid] < tinib_maxact[tskid]) {
		tcb_actcnt[tskid] += 1;
	}
	else {
		ercd = E_OS_LIMIT;
		goto d_error_exit;
	}
  exit:
	unlock_cpu();
	LOG_ACTTSK_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
  d_error_exit:
	_errorhook_par1.tskid = tskid;
	call_errorhook(ercd, OSServiceId_ActivateTask);
	goto exit;
}
Example #7
0
/*
 *  イベントのセット
 */
StatusType
SetEvent(TaskType tskid, EventMaskType mask)
{
	StatusType	ercd = E_OK;

	LOG_SETEVT_ENTER(tskid, mask);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2);
	CHECK_TSKID(tskid);
	CHECK_ACCESS(tskid < tnum_exttask);

	lock_cpu();
	D_CHECK_STATE(tcb_tstat[tskid] != TS_DORMANT);

	tcb_curevt[tskid] |= mask;
	if ((tcb_curevt[tskid] & tcb_waievt[tskid]) != EVTMASK_NONE) {
		tcb_waievt[tskid] = EVTMASK_NONE;
		if ((make_runnable(tskid)) && (callevel == TCL_TASK)) {
			dispatch();
		}
	}
  exit:
	unlock_cpu();
	LOG_SETEVT_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
  d_error_exit:
	_errorhook_par1.tskid = tskid;
	_errorhook_par2.mask = mask;
	call_errorhook(ercd, OSServiceId_SetEvent);
	goto exit;
}
Example #8
0
/*
 *  自タスクの終了
 */
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);
}
Example #9
0
/*
 *  アラームの設定(絶対値)
 */
StatusType
SetAbsAlarm(AlarmType almid, TickType start, TickType cycle)
{
	StatusType	ercd = E_OK;
	CounterType	cntid;
	TickType	maxval, start2;

	LOG_SETABS_ENTER(almid, start, cycle);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2);
	CHECK_ALMID(almid);

	cntid = alminib_cntid[almid];
	maxval = cntinib_maxval[cntid];
	CHECK_VALUE(start <= maxval);
	CHECK_VALUE((cycle == 0u)
		|| ((cntinib_mincyc[cntid] <= cycle) && (cycle <= maxval)));

	lock_cpu();
	if (almcb_next[almid] != almid) {
		ercd = E_OS_STATE;
		goto d_error_exit;
	}

	start2 = start + maxval + 1;
	if (cntcb_curval[cntid] <= maxval) {
		if (start <= cntcb_curval[cntid]) {
			almcb_almval[almid] = start2;
		}
		else {
			almcb_almval[almid] = start;
		}
	}
	else {
		if (start2 <= cntcb_curval[cntid]) {
			almcb_almval[almid] = start;
		}
		else {
			almcb_almval[almid] = start2;
		}
	}
	almcb_cycle[almid] = cycle;
	enqueue_alarm(almid, cntid);
  exit:
	unlock_cpu();
	LOG_SETABS_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
  d_error_exit:
	_errorhook_par1.almid = almid;
	_errorhook_par2.start = start;
	_errorhook_par3.cycle = cycle;
	call_errorhook(ercd, OSServiceId_SetAbsAlarm);
	goto exit;
}
Example #10
0
/*
 *  自タスクの終了とタスクの起動
 */
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);
}
Example #11
0
/*
 *  リソースの獲得
 */
StatusType
GetResource(ResourceType resid)
{
	StatusType	ercd = E_OK;
	Priority	ceilpri, curpri;

	LOG_GETRES_ENTER(resid);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2);
	CHECK_RESID(resid);

	ceilpri = resinib_ceilpri[resid];
	if (callevel == TCL_TASK) {
		CHECK_ACCESS(tinib_inipri[runtsk] <= ceilpri);

		lock_cpu();
		D_CHECK_ACCESS(rescb_prevpri[resid] == TPRI_NULL);
		curpri = tcb_curpri[runtsk];
		rescb_prevpri[resid] = curpri;
		rescb_prevres[resid] = tcb_lastres[runtsk];
		tcb_lastres[runtsk] = resid;
		if (ceilpri > curpri) {
			tcb_curpri[runtsk] = ceilpri;
			if (ceilpri >= TPRI_MINISR) {
				set_ipl(ceilpri - TPRI_MINISR);
			}
		}
	}
	else {
		CHECK_ACCESS(isrinib_intpri[runisr] <= ceilpri);

		lock_cpu();
		D_CHECK_ACCESS(rescb_prevpri[resid] == TPRI_NULL);
		curpri = current_ipl() + TPRI_MINISR;
		rescb_prevpri[resid] = curpri;
		rescb_prevres[resid] = isrcb_lastres[runisr];
		isrcb_lastres[runisr] = resid;
		if (ceilpri > curpri) {
			set_ipl(ceilpri - TPRI_MINISR);
		}
	}
  exit:
	unlock_cpu();
	LOG_GETRES_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
  d_error_exit:
	_errorhook_par1.resid = resid;
	call_errorhook(ercd, OSServiceId_GetResource);
	goto exit;
}
Example #12
0
/*
 *  リソースの返却
 */
StatusType
ReleaseResource(ResourceType resid)
{
	StatusType	ercd = E_OK;

	LOG_RELRES_ENTER(resid);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2);
	CHECK_RESID(resid);

	if (callevel == TCL_TASK) {
		CHECK_ACCESS(tinib_inipri[runtsk] <= resinib_ceilpri[resid]);
		CHECK_NOFUNC(tcb_lastres[runtsk] == resid);

		lock_cpu();
		if (rescb_prevpri[resid] >= TPRI_MINISR) {
			set_ipl(rescb_prevpri[resid] - TPRI_MINISR);
		}
		else{
			if (tcb_curpri[runtsk] >= TPRI_MINISR) {
				set_ipl(IPL_ENA_ALL);
			}
		}
		tcb_curpri[runtsk] = rescb_prevpri[resid];
		tcb_lastres[runtsk] = rescb_prevres[resid];
		rescb_prevpri[resid] = TPRI_NULL;
		if (tcb_curpri[runtsk] < nextpri) {
			preempt();
			dispatch();
		}
	}
	else {
		CHECK_ACCESS(isrinib_intpri[runisr] <= resinib_ceilpri[resid]);
		CHECK_NOFUNC(isrcb_lastres[runisr] == resid);

		lock_cpu();
		set_ipl(rescb_prevpri[resid] - TPRI_MINISR);
		isrcb_lastres[runisr] = rescb_prevres[resid];
		rescb_prevpri[resid] = TPRI_NULL;
	}
  exit:
	unlock_cpu();
	LOG_RELRES_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
	_errorhook_par1.resid = resid;
	call_errorhook(ercd, OSServiceId_ReleaseResource);
	goto exit;
}
ER_UINT
can_wup(ID tskid)
{
	TCB		*p_tcb;
	ER_UINT	ercd;

	LOG_CAN_WUP_ENTER(tskid);
	CHECK_TSKCTX_UNL();
	if (tskid == TSK_SELF) {
		p_tcb = p_runtsk;
	}
	else {
		CHECK_ID(VALID_TSKID(tskid));
		p_tcb = get_tcb(tskid);
	}

	lock_cpu();
	if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (TSTAT_DORMANT(p_tcb->tstat)) {
		ercd = E_OBJ;
	}
	else {
		ercd = p_tcb->wupque ? 1 : 0;
		p_tcb->wupque = false;
	}
	unlock_cpu();

  error_exit:
	LOG_CAN_WUP_LEAVE(ercd);
	return(ercd);
}
Example #14
0
ER
pol_sem(ID semid)
{
	SEMCB	*p_semcb;
	ER		ercd;

	LOG_POL_SEM_ENTER(semid);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_SEMID(semid));
	p_semcb = get_semcb(semid);

	lock_cpu();
	if (p_semcb->p_seminib->sematr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (p_semcb->semcnt >= 1) {
		p_semcb->semcnt -= 1;
		ercd = E_OK;
	}
	else {
		ercd = E_TMOUT;
	}
	unlock_cpu();

  error_exit:
	LOG_POL_SEM_LEAVE(ercd);
	return(ercd);
}
Example #15
0
ER
ref_mtx(ID mtxid, T_RMTX *pk_rmtx)
{
	MTXCB	*p_mtxcb;
	ER		ercd;
    
	LOG_REF_MTX_ENTER(mtxid, pk_rmtx);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_MTXID(mtxid));
	CHECK_MACV_WRITE(pk_rmtx, T_RMTX);
	p_mtxcb = get_mtxcb(mtxid);

	lock_cpu();
	if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn4)) {
		ercd = E_OACV;
	}
	else {
		pk_rmtx->htskid = (p_mtxcb->p_loctsk != NULL) ?
								TSKID(p_mtxcb->p_loctsk) : TSK_NONE;
														
		pk_rmtx->wtskid = wait_tskid(&(p_mtxcb->wait_queue));
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_REF_MTX_LEAVE(ercd, pk_rmtx);
	return(ercd);
}
Example #16
0
ER
sta_alm(ID almid, RELTIM almtim)
{
    ALMCB	*p_almcb;
    ER		ercd;

    LOG_STA_ALM_ENTER(almid, almtim);
    CHECK_UNL();
    CHECK_ID(VALID_ALMID(almid));
    CHECK_PAR(VALID_RELTIM(almtim));
    p_almcb = get_almcb(almid);

    lock_cpu();
    if (p_almcb->almsta) {
        tmevtb_dequeue(&(p_almcb->tmevtb));
    }
    else {
        p_almcb->almsta = true;
    }
    tmevtb_enqueue(&(p_almcb->tmevtb), almtim);
    ercd = E_OK;
    unlock_cpu();

error_exit:
    LOG_STA_ALM_LEAVE(ercd);
    return(ercd);
}
ER
get_pri(ID tskid, PRI *p_tskpri)
{
	TCB		*p_tcb;
	ER		ercd;

	LOG_GET_PRI_ENTER(tskid, p_tskpri);
	CHECK_TSKCTX_UNL();							/*[NGKI1203][NGKI1204]*/
	if (tskid == TSK_SELF) {
		p_tcb = p_runtsk;						/*[NGKI1211]*/
	}
	else {
		CHECK_ID(VALID_TSKID(tskid));			/*[NGKI1205]*/
		p_tcb = get_tcb(tskid);
	}

	lock_cpu();
	if (TSTAT_DORMANT(p_tcb->tstat)) {
		ercd = E_OBJ;							/*[NGKI1209]*/
	}
	else {
		*p_tskpri = EXT_TSKPRI(p_tcb->priority);	/*[NGKI1210]*/
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_GET_PRI_LEAVE(ercd, p_tskpri);
	return(ercd);
}
Example #18
0
/*
 *  アラームベースの参照
 */
StatusType
GetAlarmBase(AlarmType almid, AlarmBaseRefType p_info)
{
	StatusType	ercd = E_OK;
	CounterType	cntid;

	LOG_GETALB_ENTER(almid, p_info);
	CHECK_CALLEVEL(TCL_TASK | TCL_ISR2 | TCL_ERROR | TCL_PREPOST);
	CHECK_ALMID(almid);

	cntid = alminib_cntid[almid];
	p_info->maxallowedvalue = cntinib_maxval[cntid];
	p_info->ticksperbase = cntinib_tickbase[cntid];
	p_info->mincycle = cntinib_mincyc[cntid];
  exit:
	LOG_GETALB_LEAVE(ercd);
	return(ercd);

  error_exit:
	lock_cpu();
	_errorhook_par1.almid = almid;
	_errorhook_par2.p_info = p_info;
	call_errorhook(ercd, OSServiceId_GetAlarmBase);
	unlock_cpu();
	goto exit;
}
ER_UINT
can_act(ID tskid)
{
	TCB		*p_tcb;
	ER_UINT	ercd;

	LOG_CAN_ACT_ENTER(tskid);
	CHECK_TSKCTX_UNL();							/*[NGKI1139][NGKI1140]*/
	if (tskid == TSK_SELF) {
		p_tcb = p_runtsk;						/*[NGKI1146]*/
	}
	else {
		CHECK_ID(VALID_TSKID(tskid));			/*[NGKI1141]*/
		p_tcb = get_tcb(tskid);
	}

	lock_cpu();
	ercd = p_tcb->actque ? 1 : 0;				/*[NGKI1144]*/
	p_tcb->actque = false;						/*[NGKI1144]*/
	unlock_cpu();

  error_exit:
	LOG_CAN_ACT_LEAVE(ercd);
	return(ercd);
}
Example #20
0
ER
ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
{
	MPFCB	*p_mpfcb;
	ER		ercd;
    
	LOG_REF_MPF_ENTER(mpfid, pk_rmpf);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_MPFID(mpfid));
	p_mpfcb = get_mpfcb(mpfid);

	lock_cpu();
	if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else {
		pk_rmpf->wtskid = wait_tskid(&(p_mpfcb->wait_queue));
		pk_rmpf->fblkcnt = p_mpfcb->fblkcnt;
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_REF_MPF_LEAVE(ercd, pk_rmpf);
	return(ercd);
}
Example #21
0
ER
ref_sem(ID semid, T_RSEM *pk_rsem)
{
	SEMCB	*p_semcb;
	ER		ercd;
    
	LOG_REF_SEM_ENTER(semid, pk_rsem);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_SEMID(semid));
	p_semcb = get_semcb(semid);

	lock_cpu();
	if (p_semcb->p_seminib->sematr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else {
		pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
		pk_rsem->semcnt = p_semcb->semcnt;
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_REF_SEM_LEAVE(ercd, pk_rsem);
	return(ercd);
}
Example #22
0
ER
ini_sem(ID semid)
{
	SEMCB	*p_semcb;
	ER		ercd;
    
	LOG_INI_SEM_ENTER(semid);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_SEMID(semid));
	p_semcb = get_semcb(semid);

	lock_cpu();
	if (p_semcb->p_seminib->sematr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else {
		init_wait_queue(&(p_semcb->wait_queue));
		p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
		if (p_runtsk != p_schedtsk) {
			dispatch();
		}
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_INI_SEM_LEAVE(ercd);
	return(ercd);
}
Example #23
0
ER
ini_mpf(ID mpfid)
{
	MPFCB	*p_mpfcb;
	ER		ercd;
    
	LOG_INI_MPF_ENTER(mpfid);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_MPFID(mpfid));
	p_mpfcb = get_mpfcb(mpfid);

	lock_cpu();
	if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else {
		init_wait_queue(&(p_mpfcb->wait_queue));
		p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
		p_mpfcb->unused = 0U;
		p_mpfcb->freelist = INDEX_NULL;
		if (p_runtsk != p_schedtsk) {
			dispatch();
		}
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_INI_MPF_LEAVE(ercd);
	return(ercd);
}
Example #24
0
ER
ref_alm(ID almid, T_RALM *pk_ralm)
{
    ALMCB	*p_almcb;
    ER		ercd;

    LOG_REF_ALM_ENTER(almid, pk_ralm);
    CHECK_TSKCTX_UNL();
    CHECK_ID(VALID_ALMID(almid));
    p_almcb = get_almcb(almid);

    lock_cpu();
    if (p_almcb->almsta) {
        pk_ralm->almstat = TALM_STA;
        pk_ralm->lefttim = tmevt_lefttim(&(p_almcb->tmevtb));
    }
    else {
        pk_ralm->almstat = TALM_STP;
    }
    ercd = E_OK;
    unlock_cpu();

error_exit:
    LOG_REF_ALM_LEAVE(ercd, pk_ralm);
    return(ercd);
}
Example #25
0
ER
pget_mpf(ID mpfid, void **p_blk)
{
	MPFCB	*p_mpfcb;
	ER		ercd;

	LOG_PGET_MPF_ENTER(mpfid, p_blk);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_MPFID(mpfid));
	p_mpfcb = get_mpfcb(mpfid);

	lock_cpu();
	if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (p_mpfcb->fblkcnt > 0) {
		get_mpf_block(p_mpfcb, p_blk);
		ercd = E_OK;
	}
	else {
		ercd = E_TMOUT;
	}
	unlock_cpu();

  error_exit:
	LOG_PGET_MPF_LEAVE(ercd, p_blk);
	return(ercd);
}
Example #26
0
ER
sac_mtx(ID mtxid, const ACVCT *p_acvct)
{
	MTXCB	*p_mtxcb;
	MTXINIB	*p_mtxinib;
	ER		ercd;

	LOG_SAC_MTX_ENTER(mtxid, p_acvct);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_MTXID(mtxid));
	CHECK_MACV_READ(p_acvct, ACVCT);
	p_mtxcb = get_mtxcb(mtxid);

	lock_cpu();
	if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn3)) {
		ercd = E_OACV;
	}
	else if (MTXID(p_mtxcb) <= tmax_smtxid) {
		ercd = E_OBJ;
	}
	else {
		p_mtxinib = (MTXINIB *)(p_mtxcb->p_mtxinib);
		p_mtxinib->acvct = *p_acvct;
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_SAC_MTX_LEAVE(ercd);
	return(ercd);
}
Example #27
0
ER
ref_mbf(ID mbfid, T_RMBF *pk_rmbf)
{
	MBFCB	*p_mbfcb;
	ER		ercd;
    
	LOG_REF_MBF_ENTER(mbfid, pk_rmbf);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_MBFID(mbfid));
	CHECK_MACV_WRITE(pk_rmbf, T_RMBF);
	p_mbfcb = get_mbfcb(mbfid);

	lock_cpu();
	if (p_mbfcb->p_mbfinib->mbfatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (VIOLATE_ACPTN(p_mbfcb->p_mbfinib->acvct.acptn4)) {
		ercd = E_OACV;
	}
	else {
		pk_rmbf->stskid = wait_tskid(&(p_mbfcb->swait_queue));
		pk_rmbf->rtskid = wait_tskid(&(p_mbfcb->rwait_queue));
		pk_rmbf->smbfcnt = p_mbfcb->smbfcnt;
		pk_rmbf->fmbfsz = p_mbfcb->fmbfsz;
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_REF_MBF_LEAVE(ercd, pk_rmbf);
	return(ercd);
}
Example #28
0
ER
del_sem(ID semid)
{
	SEMCB	*p_semcb;
	SEMINIB	*p_seminib;
	ER		ercd;

	LOG_DEL_SEM_ENTER(semid);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_SEMID(semid));
	p_semcb = get_semcb(semid);

	lock_cpu();
	if (p_semcb->p_seminib->sematr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (semid <= tmax_ssemid) {
		ercd = E_OBJ;
	}
	else {
		init_wait_queue(&(p_semcb->wait_queue));
		p_seminib = (SEMINIB *)(p_semcb->p_seminib);
		p_seminib->sematr = TA_NOEXS;
		queue_insert_prev(&free_semcb, &(p_semcb->wait_queue));
		if (p_runtsk != p_schedtsk) {
			dispatch();
		}
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_DEL_SEM_LEAVE(ercd);
	return(ercd);
}
ER
set_dft(int32_t drift)
{
	ER		ercd;

	LOG_SET_DFT_ENTER(drift);
	CHECK_UNL();								/*[NGKI3598]*/
	CHECK_PAR(TMIN_DRIFT <= drift && drift <= TMAX_DRIFT);
												/*[NGKI3599]*/
	lock_cpu();
	update_current_evttim();

	drift_rate = (uint32_t)(1000000U + drift);	/*[NGKI3601]*/

	evttim_step = (TSTEP_HRTCNT * drift_rate + 999999U) / 1000000U;
	evttim_step_frac = (TSTEP_HRTCNT * drift_rate + 999999U) % 1000000U;

	set_hrt_event();
	ercd = E_OK;
	unlock_cpu();

  error_exit:
	LOG_SET_DFT_LEAVE(ercd);
	return(ercd);
}
Example #30
0
ER
ini_pdq(ID pdqid)
{
	PDQCB	*p_pdqcb;
	ER		ercd;
    
	LOG_INI_PDQ_ENTER(pdqid);
	CHECK_TSKCTX_UNL();
	CHECK_ID(VALID_PDQID(pdqid));
	p_pdqcb = get_pdqcb(pdqid);

	lock_cpu();
	init_wait_queue(&(p_pdqcb->swait_queue));
	init_wait_queue(&(p_pdqcb->rwait_queue));
	p_pdqcb->count = 0U;
	p_pdqcb->p_head = NULL;
	p_pdqcb->unused = 0U;
	p_pdqcb->p_freelist = NULL;
	if (p_runtsk != p_schedtsk) {
		dispatch();
	}
	ercd = E_OK;
	unlock_cpu();

  error_exit:
	LOG_INI_PDQ_LEAVE(ercd);
	return(ercd);
}