回调函数OS_TMR_CALLBACK_PTR在OS_TmrTask的上下文中执行,执行时调度器锁状态,在回调函数中需要确保不要有阻塞操作,并且要确保OS_TmrTask的堆栈不要溢出。
typedef void (*OS_TMR_CALLBACK_PTR)(void *p_tmr, void *p_arg);
typedef struct os_tmr OS_TMR;
typedef struct os_tmr_spoke OS_TMR_SPOKE;
struct os_tmr {
OS_OBJ_TYPE Type;
CPU_CHAR *NamePtr; /* Name to give the timer */
OS_TMR_CALLBACK_PTR CallbackPtr; /* Function to call when timer expires */
void *CallbackPtrArg; /* Argument to pass to function when timer expires */
OS_TMR *NextPtr; /* Double link list pointers */
OS_TMR *PrevPtr;
OS_TICK Match; /* Timer expires when OSTmrTickCtr matches this value */
OS_TICK Remain; /* Amount of time remaining before timer expires */
OS_TICK Dly; /* Delay before start of repeat */
OS_TICK Period; /* Period to repeat timer */
OS_OPT Opt; /* Options (see OS_OPT_TMR_xxx) */
OS_STATE State;
#if OS_CFG_DBG_EN > 0u
OS_TMR *DbgPrevPtr;
OS_TMR *DbgNextPtr;
#endif
};
struct os_tmr_spoke {
OS_TMR *FirstPtr; /* Pointer to first timer in linked list */
OS_OBJ_QTY NbrEntries;
OS_OBJ_QTY NbrEntriesMax;
};
void OSTmrCreate (OS_TMR *p_tmr,
CPU_CHAR *p_name,
OS_TICK dly,
OS_TICK period,
OS_OPT opt,
OS_TMR_CALLBACK_PTR p_callback,
void *p_callback_arg,
OS_ERR *p_err):
创建一个定时器。
OS_OPT_TMR_ONE_SHOT:只执行一次
OS_OPT_TMR_PERIODIC:循环执行
CPU_BOOLEAN OSTmrDel (OS_TMR *p_tmr,
OS_ERR *p_err):
删除一个定时器。操作时锁调度器。个人感觉这个函数不大会被用到。
判断p_tmr->State:
当OS_TMR_STATE_RUNNING:从spoke对应的定时器链表中删除,清空p_tmr的参数,解锁调度器。
当OS_TMR_STATE_STOPPED、OS_TMR_STATE_COMPLETED:清空p_tmr的参数,解锁调度器。
当OS_TMR_STATE_UNUSED:不允许删除,返回错误代码。
OS_TICK OSTmrRemainGet (OS_TMR *p_tmr,
OS_ERR *p_err):
获取定时器还有多长时间超时。
判断p_tmr->State:
当OS_TMR_STATE_RUNNING:p_tmr->Remain =p_tmr->Match - OSTmrTickCtr;,解锁调度器。
当OS_TMR_STATE_STOPPED:(定时器还没有启动)根据p_tmr是否是周期的返回remain,解锁调度器。
当OS_TMR_STATE_UNUSED、OS_TMR_STATE_COMPLETED:remain = 0,返回错误代码。
CPU_BOOLEAN OSTmrStart (OS_TMR *p_tmr,
OS_ERR *p_err):
启动定时器,可以在定时器过程中,重新开始。
判断p_tmr->State:
当OS_TMR_STATE_RUNNING:将p_tmr从spoke对应的定时器链表中删除,重新添加spoke对应的定时器链表中,解锁调度器。
当OS_TMR_STATE_STOPPED、OS_TMR_STATE_COMPLETED:将p_tmr添加spoke对应的定时器链表中,解锁调度器。
当OS_TMR_STATE_UNUSED:Tmr没有被创建,返回错误代码。
OS_STATE OSTmrStateGet (OS_TMR *p_tmr,
OS_ERR *p_err):
获取当前定时器的状态。
CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr,
OS_OPT opt,
void *p_callback_arg,
OS_ERR *p_err):
停止定时器。
判断p_tmr->State:
当OS_TMR_STATE_RUNNING:将p_tmr从spoke对应的定时器链表中删除,根据opt参数调用回调函数,解锁调度器。
当OS_TMR_STATE_STOPPED、OS_TMR_STATE_COMPLETED:已经停止,解锁调度器。
当OS_TMR_STATE_UNUSED:Tmr没有被创建,返回错误代码。
void OS_TmrClr (OS_TMR *p_tmr):
清空p_tmr结构体内的参数。在OSTmrDel()中调用。
void OS_TmrInit (OS_ERR *p_err):
初始化定时器模块,OSInit()调用,初始化定时器列表如下图,创建定时器任务。
void OS_TmrLink (OS_TMR *p_tmr,
OS_OPT opt):
将p_tmr插入到spoke对应的定时器链表。计算p_tmr->Remain,计算spoke,将p_tmr按照Remain升序的顺序插入到spoke对应的定时器链表中。
void OS_TmrResetPeak (void):
跟踪当前spoke最大的个数。在OSStatReset()中调用。
void OS_TmrUnlink (OS_TMR *p_tmr):
将p_tmr从spoke对应的定时器链表中删除,更新p_tmr->State、NextPtr、PrevPtr,p_spoke->NbrEntries
void OS_TmrTask (void *p_arg):
OS内部函数,管理定时器。
等待tick ISR信号(Sem,在OSTimeTick中发出),OSTmrTickCtr++;,遍历spoke对应的定时器链表,如果OSTmrTickCtr==p_tmr->Match,从链表中删除p_tmr,如果周期的则插入到新的spoke中,调用回调函数。
回调函数在OS_TmrTask的上下文中执行,执行时调度器锁状态,在回调函数中需要确保不要有阻塞操作,并且要确保OS_TmrTask的堆栈不要溢出。