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 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(); }
void signal_time(void) { TMEVTB *p_tmevtb; bool_t callflag; assert(sense_context()); assert(!sense_lock()); lock_cpu(); in_signal_time = true; /*[ASPD1033]*/ do { /* * コールバック関数を呼び出さなければループを抜ける[ASPD1020]. */ callflag = false; /* * 現在のイベント時刻を求める[ASPD1022]. */ update_current_evttim(); /* * 発生時刻がcurrent_evttim以前のタイムイベントがあれば,タイ * ムイベントヒープから削除し,コールバック関数を呼び出す * [ASPD1018][ASPD1019]. */ while (p_last_tmevtn >= p_top_tmevtn && EVTTIM_LE(top_evttim, current_evttim)) { p_tmevtb = tmevtb_delete_top(); (*(p_tmevtb->callback))(p_tmevtb->arg); callflag = true; } } while (callflag); /*[ASPD1020]*/ /* * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1025]. */ set_hrt_event(); in_signal_time = false; /*[ASPD1033]*/ unlock_cpu(); }