一、软件定时器简介
定时器本质是递减计数器,当计数器减到零时可以触发某种动作的执行,这个动作通过回调函数来实现。当定时器计时完成时,定义的回调函数就会被立即调用,应用程序可以有任意数量的定时器,UCOSIII中定时器的时间分辨率由一个宏OS_CFG_TMR_TASK_RATE_HZ,单位为HZ,默认为100Hz. 要想使用定时器,必须先将OS_CFG_TMR_EN这个宏置为1。
注意!一定要避免在回调函数中使用阻塞调用或者可以阻塞或删除定时器任务的函数。
回调函数就是A、B两个函数,A函数在传参时将B函数作为实参传给A。
例:A() B() ===è A(B)
回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
-
软件定时器API函数
函数名 | 作用 |
OSTmrCreate() | 创建定时器并制定运行模式 |
OSTmrDel() | 删除定时器 |
OSTmrRemainGet() | 获取定时器的剩余时间 |
OSTmrStart() | 启动定时器计数 |
OSTmrStateGet() | 获取当前定时器状态 |
OSTmrStop() | 停止计数器倒计时 |
二、UCOSIII软件定时器工作模式
2.1 创建软件定时器:使用函数OSTmrCreate():
OSTmrCreate (OS_TMR *p_tmr,//结构体指针:OS_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)//返回的错误码
2.2单次定时器
单次定时器从初始值(也就是OSTmrCreate()函数中的参数dly)开始倒计数,直到为0调用回调并停止。单次定时器的定时器只执行一次。
在倒计时没完时再调用一次OSTmrStart();,就会中途打断重新计数
2.3周期模式(无初始延迟)
创建定时器的时候我们可以设定为周期模式,当倒计时完成后,定时器调用回调函数,并重置计数器重新开始计时,一直循环性下去。如果在调用函数OSTmrCreate()创建周期定时器时让参数dly为0,那么定时器每个周期就是period。
2.4周期模式(有初始延迟):
周期定时器也可以设定为带初始延迟时间的运行模式,使用函数OSTmrCreate() 参数dly来确定第一个周期,以后的每个周期开始时将计数器值重置为period。
定时器的使用参考代码、步骤:
1、在开始任务函数创建定时器
2、在开始任务函数创建任务
3、编写任务函数
4、编写定时器回调函数(用定时器要实现的功能函数)