UCOSIII软件定时器简介
定时器其实就是一个递减计数器,当计数器递减到0的时候就会触发一个动作,这个动作就是回调函数,当定时器计时完成时就会自动的调用这个回调函数。因此我们可以使用这个回调函数来完成一些设计。比如,定时10秒后打开某个外设等等,在回调函数中应避免任何可以阻塞或者删除定时任务的函数。
如果要使用定时器的话需要将宏OS_CFG_TMR_DEL_EN定义为1。
定时器的分辨率由我们定义的系统节拍频率OS_CFG_TICK_RATE_HZ决定,比如我们定义为200,系统时钟周期就是5ms,定时器的最小分辨率肯定就是5ms。但是定时器的实际分 辨 率 是 通 过 宏OS_CFG_TMR_TASK_RATE_HZ定 义 的 , 这 个 值 绝 对 不 能 大 于OS_CFG_TICK_RATE_HZ。比如我们定义OS_CFG_TMR_TASK_RATE_HZ为100,则定时器的时间分辨率为10ms。有关UCOSIII定时器的函数都在os_tmr.c文件中。
什么是回调函数呢/p>
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
UCOSIII软件定时器API函数
函数 | 含义 |
OSTmrCreate() | 创建定时器并制定运行模式 |
OSTmrDel() | 删除定时器 |
OSTmrRemainGet() | 获取定时器的剩余时间 |
OSTmrStart() | 启动定时器计数 |
OSTmrStateGet() | 获取当前定时器状态 |
OSTmrStop() | 停止计数器倒计时 |
创建一个定时器
如果我们要使用定时器,肯定需要先创建一个定时器,使用OSTmrCreate()函数来创建一个定时器,这个函数也用来确定定时器的运行模式,OSTmrCreate()函数原型如下:
opt参数:定时器运行选项,这里有两个模式可以选择。OS_OPT_TMR_ONE_SHOT单次定时器,OS_OPT_TMR_PERIODIC周期定时器。
软件定时器工作模式
单次定时器
使用OSTmrCreate()函数创建定时器时把参数opt设置为OS_OPT_TMR_ONE_SHOT,就是创建的单次定时器。创建一个单次定时器以后,我们一旦调用OSTmrStart()函数定时器就会从创建时定义的dly开始倒计数,直到减为0调用回调函数并停止。单次定时器的定时器只执行一次。
上图展示了单次定时器在调用OSTmrStart()函数后开始倒计数,将dly减为0后调用回调函数的过程,到这里定时器就停止运行,不再做任何事情了,我们可以调用OSTmrDel()函数来删除这个运行完成的定时器。其实我们也可以重新调用OSTmrStart()函数来开启一个已经运行完成的定时器,通过调用OSTmrStart()函数来重新触发单次定时器,如下图所示。
周期模式(无初始延迟)
使用OSTmrCreate()函数创建定时器时把参数opt设置为OS_OPT_TMR_PERIODIC,就是创建的周期定时器。当定时器倒计数完成后,定时器就会调用回调函数,并且重置计数器开始下一轮的定时,就这样一直循环下去。如果使用OSTmrCreate()函数创建定时器的时候,参数dly为0的话,那么定时器在每个周期开始时计数器的初值就为period,如下图所示。
周期定时器(有初始化延迟)
在创建定时器的时候也可以创建带有初始化延时的,初始化延时就是OSTmrCreate()函数中的参数dly就是初始化延迟,定时器的第一个周期就是dly。当第一个周期完成后就是用参数period作为周期值,调用OSTmrStart()函数开启有初始化延时的定时器,如下图所示。
UCOSIII实际例程
例程要求:本例程新建两个任务:任务A和任务B,任务A用于创建两个定时器:定时器1和定时器2,任务A还创建了另外一个任务B。其中定时器1为周期定时器,初始延时为200ms,以后的定时器周期为1000ms,定时器2为单次定时器,延时为2000ms。
任务B作为按键检测任务,当KEY_UP键按下的时候,打开定时器1;当KEY0按下的时候打开定时器2;当KEY1按下的时候,同时关闭定时器1和2;任务B还用来控制LED0,使其闪烁,提示系统正在运行。
定时器1定时完成以后调用回调函数刷新其工作区域的背景,并且在LCD上显示定时器1运行的次数。定时器2定时完成后也调用其回调函数来刷新其工作区域的背景,并且显示运行次数,由于定时器2是单次定时器,我们通过串口打印来观察单次定时器的运行情况。
例子:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!