定时器是内核对象之一,类型是 OS_TMR 。
NextPtr和PrevPtr都是指针, 用于将定时器链接成一个双向链表 。下图是一个空的定时器轮转表,
下图是定时器轮转表,表中有两个定时器,
定时器被放在哪里取决于计算出的spoke值,
spoke = (OS_TMR_SPOKE_IX)(p_tmr->Match % OSCfg_TmrWheelSize);
![](/qrcode.jpg)
p_spoke = &OSCfg_TmrWheel[spoke];
////////////////////////
OS_TmrTask核心代码;部分代码
{ OSSchedLock(&err);
ts_start = OS_TS_GET();
OSTmrTickCtr++; /* Increment the current time */
spoke = (OS_TMR_SPOKE_IX)(OSTmrTickCtr % OSCfg_TmrWheelSize);
p_spoke = &OSCfg_TmrWheel[spoke];
p_tmr = p_spoke->FirstPtr;
done = DEF_FALSE;
while (done == DEF_FALSE) {
if (p_tmr != (OS_TMR *)0) {
p_tmr_next = (OS_TMR *)p_tmr->NextPtr; /* Point to next tmr to update because current ... */
/* ... timer could get unlinked from the wheel. */
if (OSTmrTickCtr == p_tmr->Match) { /* Process each timer that expires */
OS_TmrUnlink(p_tmr); /* Remove from current wheel spoke */
if (p_tmr->Opt == OS_OPT_TMR_PERIODIC) {
OS_TmrLink(p_tmr,
OS_OPT_LINK_PERIODIC); /* Recalculate new position of timer in wheel */
} else {
p_tmr->State = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
}
p_fnct = p_tmr->CallbackPtr; /* Execute callback function if available */
if (p_fnct != (OS_TMR_CALLBACK_PTR)0) {
(*p_fnct)((void *)p_tmr, p_tmr->CallbackPtrArg);
}
p_tmr = p_tmr_next; /* See if next timer matches */
} else {
done = DEF_TRUE;
}
} else {
done = DEF_TRUE;
}
}