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 signal_time(void) { TMEVTB *p_tmevtb; PCB *my_p_pcb; TEVTCB *my_p_tevtcb; assert(sense_context()); assert(!i_sense_lock()); i_lock_cpu(); my_p_pcb = i_acquire_tsk_lock_self(); my_p_tevtcb = my_p_pcb->p_tevtcb; /* * current_timeを更新する. */ my_p_tevtcb->current_time = my_p_tevtcb->next_time; /* * next_time,next_subtimeを更新する. */ #if TIC_DENO == 1U my_p_tevtcb->next_time = my_p_tevtcb->current_time + TIC_NUME; #else /* TIC_DENO == 1U */ my_p_tevtcb->next_subtime += TIC_NUME % TIC_DENO; my_p_tevtcb->next_time = my_p_tevtcb->current_time + TIC_NUME / TIC_DENO; if (my_p_tevtcb->next_subtime >= TIC_DENO) { my_p_tevtcb->next_subtime -= TIC_DENO; my_p_tevtcb->next_time += 1U; } #endif /* TIC_DENO == 1U */ /* * curent_timeよりイベント発生時刻の早い(または同じ)タイムイベン * トを,タイムイベントヒープから削除し,コールバック関数を呼び出 * す. */ while ((my_p_tevtcb->last_index) > 0 && EVTTIM_LE(my_p_tevtcb, TMEVT_NODE(my_p_tevtcb, 1).time, my_p_tevtcb->current_time)) { p_tmevtb = TMEVT_NODE(my_p_tevtcb, 1).p_tmevtb; tmevtb_delete_top(my_p_tevtcb); (*(p_tmevtb->callback))(p_tmevtb->arg); } /* * min_timeを更新する. */ my_p_tevtcb->min_time = my_p_tevtcb->current_time; release_tsk_lock(my_p_pcb); i_unlock_cpu(); }
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); }
ER iunl_cpu(void) { ER ercd; LOG_IUNL_CPU_ENTER(); CHECK_INTCTX(); if (i_sense_lock()) { i_unlock_cpu(); } ercd = E_OK; error_exit: LOG_IUNL_CPU_LEAVE(ercd); return(ercd); }
ER iloc_cpu(void) { ER ercd; LOG_ILOC_CPU_ENTER(); CHECK_INTCTX(); if (!i_sense_lock()) { i_lock_cpu(); } ercd = E_OK; error_exit: LOG_ILOC_CPU_LEAVE(ercd); return(ercd); }
void signal_time(void) { TMEVTB *p_tmevtb; assert(sense_context()); assert(!i_sense_lock()); i_lock_cpu(); /* * update current time */ current_time = next_time; /* * update next_time and next_sub time */ #if TIC_DENO == 1U next_time = current_time + TIC_NUME; #else /* TIC_DENO == 1U */ next_subtime += TIC_NUME % TIC_DENO; next_time = current_time + TIC_NUME / TIC_DENO; if (next_subtime >= TIC_DENO) { next_subtime -= TIC_DENO; next_time += 1U; } #endif /* TIC_DENO == 1U */ /* * if current time is not earlier than the earliest time event in time * event heap, it means a time event shall happen */ while (last_index > 0 && EVTTIM_LE(TMEVT_NODE(1).time, current_time)) { p_tmevtb = TMEVT_NODE(1).p_tmevtb; tmevtb_delete_top(); (*(p_tmevtb->callback))(p_tmevtb->arg); } /* * update min time */ min_time = current_time; i_unlock_cpu(); }
ER iunl_cpu(void) { ER ercd; LOG_IUNL_CPU_ENTER(); CHECK_INTCTX(); if (i_sense_lock() && ((get_my_p_pcb())->locspnid == 0)) { i_unlock_cpu(); } ercd = E_OK; error_exit: LOG_IUNL_CPU_LEAVE(ercd); return(ercd); }
void call_almhdr(uint_t almidx) { /* アラームハンドラを停止状態にする */ almcb_almact &= ~ALMACT_BIT(almidx); i_unlock_cpu(); /* アラームハンドラの実行 */ LOG_ALM_ENTER(almidx); (*alminib_almhdr[almidx])(alminib_exinf[almidx]); LOG_ALM_LEAVE(almidx); if (!i_sense_lock()) { i_lock_cpu(); } }
void call_cychdr(uintptr_t cycidx) { cyccb_evttim[cycidx] += cycinib_cyctim[cycidx]; /* 次周期のタイムイベントを登録 */ time_event_enqueue((ID)cycidx , cyccb_evttim[cycidx] , call_cychdr , cycidx); i_unlock_cpu(); /* 周期ハンドラを実行 */ LOG_CYC_ENTER(cycidx); (*cycinib_cychdr[cycidx])(cycinib_exinf[cycidx]); LOG_CYC_LEAVE(cycidx); if (!i_sense_lock()) { i_lock_cpu(); } }
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); } } }
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(); } }