void call_almhdr(ALMCB *p_almcb) { PRI saved_ipm; /* * アラームハンドラを停止状態にする. */ p_almcb->almsta = false; /* * アラームハンドラを,CPUロック解除状態で呼び出す. */ saved_ipm = i_get_ipm(); i_unlock_cpu(); LOG_ALM_ENTER(p_almcb); (*((ALMHDR)(p_almcb->p_alminib->almhdr)))(p_almcb->p_alminib->exinf); LOG_ALM_LEAVE(p_almcb); if (!i_sense_lock()) { i_lock_cpu(); } i_set_ipm(saved_ipm); }
void call_cychdr(CYCCB *p_cyccb) { PRI saved_ipm; /* * 次回の起動のためのタイムイベントブロックを登録する. * * 同じタイムティックで周期ハンドラを再度起動すべき場合には,この * 関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな * る. */ tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim); /* * 周期ハンドラを,CPUロック解除状態で呼び出す. */ saved_ipm = i_get_ipm(); i_unlock_cpu(); LOG_CYC_ENTER(p_cyccb); (*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf); LOG_CYC_LEAVE(p_cyccb); if (!i_sense_lock()) { i_lock_cpu(); } i_set_ipm(saved_ipm); }
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); }
void call_isr(QUEUE *p_isr_queue) { QUEUE *p_queue; ISRINIB *p_isrinib; PRI saved_ipm; saved_ipm = i_get_ipm(); for (p_queue = p_isr_queue->p_next; p_queue != p_isr_queue; p_queue = p_queue->p_next) { p_isrinib = (ISRINIB *)(((ISRCB *) p_queue)->p_isrinib); LOG_ISR_ENTER(p_isrinib->intno); (*(p_isrinib->isr))(p_isrinib->exinf); LOG_ISR_LEAVE(p_isrinib->intno); if (p_queue->p_next != p_isr_queue) { /* ISRの呼出し前の状態に戻す */ if (i_sense_lock()) { i_unlock_cpu(); } i_set_ipm(saved_ipm); } } }