初级会员
- 积分
- 72
- 金钱
- 72
- 注册时间
- 2018-4-9
- 在线时间
- 30 小时
|
发表于 2018-11-24 16:33:09
|
显示全部楼层
/* 定时事件触发处理函数 */
void TimeDispatch(void)
{
TIMER_HANDLE i;
TIMEVAL next_wakeup = TIMEVAL_MAX;
/* 获取定时器中断到现在已经流逝的时间 */
UNS32 overrun = (UNS32)getElapsedTime();
/* 计算出到目前为止真正流逝的时间 */
TIMEVAL real_total_sleep_time = total_sleep_time + overrun;
s_timer_entry *row;
/* 遍历定时事件入口 */
for(i = 0, row = timers; i <= last_timer_raw; i++, row++)
{
/* 如果该定时事件入口被定时事件占用,如判断是否超时 */
if(row->state & TIMER_ARMED)
{
/* 如果已经超时,则需要触发 */
if(row->val <= real_total_sleep_time)
{
/* 如果该事件为单次触发,则将该事件状态设置为已触发 */
if(!row->interval)
{
row->state = TIMER_TRIG;
}
/* 如果该事件为周期触发 */
else
{
/* 校正定时时间 */
row->val = row->interval - (overrun % (UNS32)row->interval);
/* 状态置为已周期触发 */
row->state = TIMER_TRIG_PERIOD;
/* 更新定时器唤醒时间 */
if(row->val < next_wakeup)
next_wakeup = row->val;
}
}
/* 没有超时,不需要触发 */
else
{
/* 更新该事件唤醒时间 */
row->val -= real_total_sleep_time;
/* 更新定时器唤醒时间 */
if(row->val < next_wakeup)
next_wakeup = row->val;
}
}
}
/* 将得出定时器唤醒时间赋值 */
total_sleep_time = next_wakeup;
/* 设置定时器重载值 */
setTimer(next_wakeup);
/* 遍历所欲定时事件接口 */
for(i = 0, row = timers; i <= last_timer_raw; i++, row++)
{
/* 如果该事件已经被触发(单次触发/周期触发) */
if(row->state & TIMER_TRIG)
{
/* 将单次触发更新为空闲,周期触发的更新为被占用 */
row->state &= ~TIMER_TRIG;
/* 需要触发的事件,调用一下回调函数 */
if(row->callback)
(*row->callback)(row->d, row->id);
}
}
}
|
|