FreeRTOS软件定时器

一、软件定时器简介

1、软件定时器概述
软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数。
2、回调函数的注意事项
软件定时器的回调函数是在定时器服务任务中执行的,所以一定不能在回调函数中调用任何会阻塞任务的API函数!比如,定时器回调函数中千万不能调用vTaskDelay()、vTaskDelayUnti(),还有一些访问队列或者信 量的非零阻塞时间的API函数也不能调用。

二、定时器服务任务/Daemon任务

1、定时器服务任务与队列
定时器是一个可选的、不属于FreeRTOS内核的功能,它是由定时器服务(或Daemon)任务来提供的。FreeRTOS提供了很多定时器有关的API函数,这些API函数大多都使用FreeRTOS的队列发送命令给定时器服务任务。这个队列叫做定时器命令队列。定时器命令队列是提供给FreeRTOS的软件定时器使用的,用户不能直接访问

四、软件定时器相关API函数

1、复位软件定时器
FreeRTOS提供了两个API函数来完成软件定时器的复位,如下表所示:

函数 描述
xTimerReset() 复位软件定时器,用在任务中。
xTimerResetFromISR() 复位软件定时器,用在中断服务函数中。
  • ①、函数xTimerReset()
    复位一个软件定时器,此函数只能用在任务中,不能用于中断服务函数!此函数是一个宏,真正执行的是函数xTimerGenericCommand(),函数原型如下:
参数 描述
xTimer 要复位的软件定时器的句柄。
xTicksToWait 设置阻塞时间,调用函数xTimerReset()开启软件定时器其实就是向定时器命令队列发送一条tmrCOMMAND_RESET命令,既然是向队列发送消息,那
肯定会涉及到入队阻塞时间的设置。
返回值 pdPASS:软件定时器复位成功。pdFAIL:软件定时器复位失败。
  • ②、函数xTimerResetFromISR()
    此函数是xTimerReset()的中断版本,此函数用于中断服务函数中!此函数是一个宏,真正执行的是函数xTimerGenericCommand(),函数原型如下:
参数 描述
xTimer 要复位的软件定时器的句柄。
pxHigherPriorityTaskWoken 记录退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为pdTRUE的时候在退出中断服务函数之前一定要进行一次任务切换。
返回值 pdPASS:软件定时器复位成功。pdFAIL:软件定时器复位失败。

2、创建软件定时器
使用软件定时器之前要先创建软件定时器,软件定时器创建函数如下表所示:

函数 描述
XTimerCreate() 使用动态方法创建软件定时器。
xTimerCreateStatic() 使用静态方法创建软件定时器。
  • ①、函数xTiemrCreate()

此函数用于创建一个软件定时器,所需要的内存通过动态内存管理方法分配。新创建的软件定时器处于休眠状态,也就是未运行的。函数xTimerStart()、xTimerReset()、xTimerStartFromISR() 、xTimerResetFromISR() 、 xTimerChangePeriod()和
xTimerChangePeriodFromISR()可以使新创建的定时器进入活动状态,此函数的原型如下:

参数 描述
peTimerName 软件定时器名字,名字是一串字符串,用于调试使用。
xTimerPeriodInTicks 软件定时器的定时器周期,单位是时钟节拍数。可以借助portTICK_PERIOD_MS将ms单位转换为时钟节拍数。举个例子,定时器的周期为100个时钟节拍的话,那么xTimerPeriodInTicks就为100,当定时器周期为500ms的时候xTimerPeriodInTicks就可以设置=为(500/portTICK_PERIOD_MS)。
uxAutoReload 设置定时器模式,单次定时器还是周期定时器参数为pdTRUE的时候表示创建的是周期定时器。如果为pdFALSE的话表示创建的是单次定时器
pvTimerID 定时器ID ,一般情况下每个定时器都有一个回调函数,当定时器定时周期到了以后就会执行这个回调函数。但是FreeRTOS也支持多个定时器共用同一个回调函数,在回调函数中根据定时器的ID 来处理不同的定时器。
pxCallbackFunction 定时器回调函数,当定时器定时周期到了以后就会调用这个函数。
返回值 NULL:软件定时器创建失败。其他值:创建成功的软件定时器句柄。
  • ②、函数xTimerCreateStatic()
    此函数用于创建一个软件定时器,所需要的内存需要用户自行分配。新创建的软件定时器处于休眠状态,也就是未运行的。函数xTimerStart()、xTimerReset()、xTimerStartFromISR()、xTimerResetFromISR()、xTimerChangePeriod()和xTimerChangePeriodFromISR()可以使新创建的定时器进入活动状态,此函数的原型如下:
参数 描述
peTimerName 软件定时器名字,名字是一串字符串,用于调试使用。
xTimerPeriodInTicks 软件定时器的定时器周期,单位是时钟节拍数。可以借助portTICK_PERIOD_MS将ms单位转换为时钟节拍数。举个例子,定时器的周期为100个时钟节拍的话,那么xTimerPeriodInTicks就为100,当定时器周期为500ms的时候xTimerPeriodInTicks就可以设置=为(500/portTICK_PERIOD_MS)。
uxAutoReload 设置定时器模式,单次定时器还是周期定时器参数为pdTRUE的时候表示创建的是周期定时器。如果为pdFALSE的话表示创建的是单次定时器
pvTimerID 定时器ID ,一般情况下每个定时器都有一个回调函数,当定时器定时周期到了以后就会执行这个回调函数。但是FreeRTOS也支持多个定时器共用同一个回调函数,在回调函数中根据定时器的ID 来处理不同的定时器。
pxCallbackFunction 定时器回调函数,当定时器定时周期到了以后就会调用这个函数。
pxTimerBuffer 参数指向一个StaticTimer_t类型的变量,用来保存定时器结构体
返回值 NULL:软件定时器创建失败。其他值:创建成功的软件定时器句柄。

3、开始软件定时器
如果软件定时器停止运行的话可以使用FreeRTOS提供的两个开启函数来重新启动软件定时器。

函数 描述
xTimerStart() 开启软件定时器,用于任务中。
xTimerStartFromISR() 开启软件定时器,用于中断中。
  • ①、函数xTimerStart()
    启动软件定时器,函数xTimerStartFromISR()是这个函数的中断版本,可以用在中断服务函数中。如果软件定时器没有运行的话调用函数xTimerStart()就会计算定时器到期时间,如果软件定时器正在运行的话调用函数xTimerStart()的结果和xTimerReset()一样。此函数是个宏,真正执行的是函数xTimerGenericCommand,函数原型如下:
参数 描述
xTimer 要开启的软件定时器的句柄。
xTicksToWait 设置阻塞时间,调用函数xTimerStart()开启软件定时器其实就是向定时器命令队列发送一条tmrCOMMAND_START命令,既然是向队列发送消息,那肯定会涉及到入队阻塞时间的设置。
返回值 pdPASS:软件定时器开启成功,其实就是命令发送成功。pdFAIL:软件定时器开启失败,命令发送失败。
  • ②、函数xTimerStartFromISR()
    此函数是函数xTimerStart()的中断版本,用在中断服务函数中,此函数是一个宏,真正执行的是函数xTimerGenericCommand(),此函数原型如下:
参数 描述
xTimer 要开启的软件定时器的句柄。
pxHigherPriorityTaskWoken 标记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为pdTRUE的时候在退出中断服务函数之前一定要进行一次任务切换。
返回值 pdPASS:软件定时器开启成功,其实就是命令发送成功。pdFAIL:软件定时器开启失败,命令发送失败。

4、停止软件定时器
既然有开启软件定时器的API函数,那么肯定也有停止软件定时器的函数,FreeRTOS也提供了两个用于停止软件定时器的API函数,如下表所示:

函数 描述
xTimerStop() 关闭软件定时器,用于任务中。
xTimerStopFromISR() 关闭软件定时器,用于中断中。
  • ①、函数xTimerStop()
    此函数用于停止一个软件定时器,此函数用于任务中,不能用在中断服务函数中!此函数是一个宏,真正调用的是函数xTimerGenericCommand(),函数原型如下:
参数 描述
xTimer 要停止的软件定时器的句柄。
xTicksToWait 设置阻塞时间,调用函数xTimerStop()停止软件定时器其实就是向定时器命令队列发送一条tmrCOMMAND_STOP命令,既然是向队列发送消息,那肯定会涉及到入队阻塞时间的设置。
返回值 pdPASS:软件定时器停止成功,其实就是命令发送成功。pdFAIL:软件定时器停止失败,命令发送失败。
  • ②、函数xTimerStopFromISR()
    此函数是xTimerStop()的中断版本,此函数用于中断服务函数中!此函数是一个宏,真正执行的是函数xTimerGenericCommand(),函数原型如下:
参数 描述
xTimer 要停止的软件定时器的句柄。
pxHigherPriorityTaskWoken 标记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为pdTRUE的时候在退出中断服务函数之前一定要进行一次任务切换。
返回值 pdPASS:软件定时器停止成功,其实就是命令发送成功。pdFAIL:软件定时器停止失败,命令发送失败。

FreeRTOS软件定时器就讲解到这里啦!!!

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月22日
下一篇 2021年9月22日

相关推荐