예제 #1
0
ER
stp_ovr(ID tskid)
{
    TCB		*p_tcb;
    ER		ercd;

    LOG_STP_OVR_ENTER(tskid);
    CHECK_TSKCTX_UNL();
    CHECK_OBJ(ovrinib.ovrhdr != NULL);
    CHECK_TSKID_SELF(tskid);
    p_tcb = get_tcb_self(tskid);

    t_lock_cpu();
    if (p_tcb->leftotm > 0U) {
        if (p_tcb == p_runtsk) {
            (void) target_ovrtimer_stop();
            ovrtimer_flag = false;
        }
        p_tcb->leftotm = 0U;
    }
    ercd = E_OK;
    t_unlock_cpu();

error_exit:
    LOG_STP_OVR_LEAVE(ercd);
    return(ercd);
}
예제 #2
0
ER
sta_ovr(ID tskid, OVRTIM ovrtim)
{
    TCB		*p_tcb;
    ER		ercd;

    LOG_STA_OVR_ENTER(tskid, ovrtim);
    CHECK_TSKCTX_UNL();
    CHECK_OBJ(ovrinib.ovrhdr != NULL);
    CHECK_TSKID_SELF(tskid);
    CHECK_PAR(0U < ovrtim && ovrtim <= TMAX_OVRTIM);
    p_tcb = get_tcb_self(tskid);

    t_lock_cpu();
    if (p_tcb == p_runtsk) {
        if (p_tcb->leftotm > 0U) {
            (void) target_ovrtimer_stop();
        }
        target_ovrtimer_start(ovrtim);
        ovrtimer_flag = true;
    }
    p_tcb->leftotm = ovrtim;
    ercd = E_OK;
    t_unlock_cpu();

error_exit:
    LOG_STA_OVR_LEAVE(ercd);
    return(ercd);
}
예제 #3
0
파일: overrun.c 프로젝트: yuyaotsuka/etrobo
ER
stp_ovr(ID tskid)
{
	TCB		*p_tcb;
	ER		ercd;

	LOG_STP_OVR_ENTER(tskid);
	CHECK_TSKCTX_UNL();
	CHECK_OBJ(ovrinib.ovrhdr != NULL);
	CHECK_TSKID_SELF(tskid);
	p_tcb = get_tcb_self(tskid);

	t_lock_cpu();
	if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
		ercd = E_NOEXS;
	}
	else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) {
		ercd = E_OACV;
	}
	else {
		if (p_tcb->leftotm > 0U) {
			if (p_tcb == p_runtsk) {
				(void) target_ovrtimer_stop();
				ovrtimer_flag = false;
			}
			p_tcb->leftotm = 0U;
		}
		ercd = E_OK;
	}
	t_unlock_cpu();

  error_exit:
	LOG_STP_OVR_LEAVE(ercd);
	return(ercd);
}
예제 #4
0
void
ovrtimer_stop(void)
{
    if (ovrtimer_flag) {
        assert(p_runtsk->leftotm > 0U);
        p_runtsk->leftotm = target_ovrtimer_stop();
        ovrtimer_flag = false;
    }
}