예제 #1
0
파일: overrun.c 프로젝트: yuyaotsuka/etrobo
void
call_ovrhdr(void)
{
	PRI		saved_ipm;

	assert(sense_context());
	assert(!i_sense_lock());
	assert(ovrinib.ovrhdr != NULL);

	p_runtsk->leftotm = 0U;
	saved_ipm = i_get_ipm();

	LOG_OVR_ENTER(p_runtsk);
	(*((OVRHDR)(ovrinib.ovrhdr)))(TSKID(p_runtsk), p_runtsk->p_tinib->exinf);
	LOG_OVR_LEAVE(p_runtsk);

	if (i_sense_lock()) {
		i_unlock_cpu();
	}
	i_set_ipm(saved_ipm);
}
예제 #2
0
void
call_ovrhdr(void)
{
    assert(sense_context());
    assert(!i_sense_lock());
    assert(ovrinib.ovrhdr != NULL);

    i_lock_cpu();
    if (p_runtsk!= NULL && p_runtsk->leftotm == 1U) {
        p_runtsk->leftotm = 0U;
        i_unlock_cpu();

        LOG_OVR_ENTER(p_runtsk);
        ((OVRHDR)(ovrinib.ovrhdr))(TSKID(p_runtsk), p_runtsk->p_tinib->exinf);
        LOG_OVR_LEAVE(p_runtsk);
    }
    else {
        /*
         *  このルーチンが呼び出される前に,オーバランハンドラの起動が
         *  キャンセルされた場合
         */
        i_unlock_cpu();
    }
}