1.定时器的作用
1)通过定时器的回调执行周期性任务
2)通过定时器的回调执行延时任务
2. 定时器的使用
2.1 定时器相关API
OSTmrCreate() 创建并初始化定时器
OSTmrDel() 删除定时器
OSTmrRemainGet() 获取定时器超时前的剩余时间
OSTmrStart() 启动或重置定时器
OSTmrStateGet() 获取定时器的当前状态
OSTmrStop() 停止定时器
2.2 创建定时器
void OSTmrCreate (OS_TMR *p_tmr, /* Pointer to timer */
CPU_CHAR *p_name, /* Name of timer, ASCII */
OS_TICK dly, /* Initial delay */
OS_TICK period, /* Repeat period */
OS_OPT opt, /* Options */
OS_TMR_CALLBACK_PTR p_callback, /* Fnct to call at 0 */
void *p_callback_arg, /* Arg. to callback */
OS_ERR *p_err)
2.2.1 创建一次性定时器
opt =OS_OPT_TMR_ONE_SHOT, dly>0
2.2.2 重置一次性定时器
opt =OS_OPT_TMR_ONE_SHOT, dly>0 ,在定时器回调中重置定时器。
2.2.3 创建无初始延时的周期性定时器
opt =OS_OPT_TMR_PERIODIC,dly=0, period>0
2.2.4 创建有初始延时的周期性定时器
opt =OS_OPT_TMR_PERIODIC,dly>0, period>0
2.3启动定时器
调用OSTmrStart启动定时器,如果定时器正在运行则从定时器列表中删除定时器,更新remain后再把定时器重新插入到定时器列表中。如果定时器的状态为停止状态或完成状态,则直接插入定时器列表中
3 定时器的实现
3.1 定时器任务的框架
1)定时器任务检查定时器列表中是否有定时器
2)系统定时器列表中无定时器,则一直等待定时器添加
3)系统定时器列表中有定时器超时或有定时器增减
4)更新定时器列表中所有定时器的增量值
5)执行定时器回调,从定时器列表中删除定时器,若为周期性定时器则重新插入定时器列表
3.2 定时器数据结构
3.3 定时器列表
3.3.1 空定时器列表
3.3.2 插入一个定时器后的定时器列表
3.3.3 插入两个定时器后的定时器列表
4.软件 定时器总结
1) 定时器列表是一个增量列表,无需遍历整个列表,只需检查列表头部的定时器是否超时。
2) 定时器任务通过使用条件变量及互斥锁,解决了消费者等待生产者时的临界资源保护问题。 3) 定时器任务通过条件变量的阻塞超时,来唤醒定时器任务。因此定时器功能依靠系统时钟。 4) 禁止在中断服务中调用定时器的相关API操作定时器