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操作定时器
925

被折叠的 条评论
为什么被折叠?



