【FreeRTOS】SoftwareTimer软件定时器

软件定时器

与MCU自带的硬件定时器(比如STM32的高级、通用、基本定时器就属于硬件定时器)不同,FreeRTOS中的软件定时器通过软件实现,精度较低,适用于精度要求不高且需要周期性执行的任务。

软件定时器的回调函数是在中断服务函数中执行的,所以需要注意软件定时器回调函数中不能带有延时阻塞性的函数,比如vTaskDelay()、vTaskDelayUnti()等,以及其他非零阻塞时间的API函数也不能调用。

定时器服务/Daemon任务

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

定时器相关配置FreeRTOSConfig.h

1、configUSE_TIMERS

如果要使用软件定时器的话宏configUSE_TIMERS一定要设置为1,当设置为1时定时器服务任务会在启动FreeRTOS调度器时自动创建。

2、configTIMER_TASK_PRIORITY

设置软件定时器服务任务的任务优先级,可以为0~(configMAX_PRIORITIES-1)。优先级一定要根据实际应用要求来设置,定时器服务任务的优先级设置越高,定时器命令队列中的命令和定时器回调函数会更快得到响应和处理。

3、configTIMER_QUEUE_LENGTH

此宏用来设置定时器命令队列的队列长度

4、configTIMER_TASK_STACK_DEPTH

此宏用来设置定时器服务任务的任务堆栈大小,单位为字(对于STM32来说,1字=4字节),由于定时器服务任务中会执行定时器的回调函数,因此任务堆栈大小一定要根据定时器的回调函数来设置。

单次定时器和周期定时器

软件定时器分两种:单次定时器和周期定时器,单次即设置定时1s,时间到后会执行一次回调函数,然后停止,直到重新手动启动;周期即设置定时1s,时间到后会执行一次回调函数,然后重新开始计时1s,时间到后重新执行,依次重复。

复位软件定时器API

复位软件定时器,即重新计算定时器周期到达的时间点,这个新的时间点是相对于复位定时器的那个时刻计算的,并不是第一次启动软件定时器的时间点。例如计时10s的周期性任务,在第9秒时复位了软件定时器,则该任务需要重新等待10s才会执行。

函数描述
BaseType_t xTimerReset(TimerHandle_t xTimer,TickType_t xTicksToWait)任务级复位软件定时器函数
BaseType_t xTimerResetFromISR(TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken)中断级复位软件定时器函数

创建软件定时器API

函数描述
TimerHandle_t xTimerCreate(…)动态创建软件定时器函数
TimerHandle_t xTimerCreateStatic(…)静态态创建软件定时器函数
TimerHandle_t xTimerCreate( const char * const pcTimerName,
                            TickType_t xTimerPeriodInTicks,
                            UBaseType_t uxAutoReload,
                            void * pvTimerID,
                            TimerCallbackFunction_t pxCallbackFunction )
TimerHandle_t xTimerCreateStatic(const char * const pcTimerName,
                                TickType_t xTimerPeriodInTicks,
                                UBaseType_t uxAutoReload,
                                void * pvTimerID,
                                TimerCallbackFunction_t pxCallbackFunction,
                                StaticTimer_t * pxTimerBuffer )
参数名描述
pcTimerName软件定时器名字,字符串类型
xTimerPeriodInTicks定时器周期,单位是时钟节拍数。例如configTICK_RATE_HZ为1000,说明1ms的时钟节拍为1,则定时1s可以设置为1000
uxAutoReload设置定时器模式为单次or周期,为pdTRUE时为周期,pdFALSE为单次
pvTimerID定时器ID号,FreeRTOS中支持多个定时器共同调用一个回调函数,在回调函数中可以通过ID号区分不同定时器
pvCallbackFunction定时器回调函数,传入函数名(即函数指针)即可
pxTimerBuffer(静态创建)参数指向一个StaticTimer_t类型的变量,用来保存定时器结构体

两个函数创建成功后都会返回软件定时器控制句柄,失败则返回NULL。

开启软件定时器API

函数描述
BaseType_t xTimerStart(TimerHandle_t xTimer,TickType_t xTicksToWait)任务级开启软件定时器函数
BaseType_t xTimerStartFromISR(TimerHandle_t xTimer,BaseType_t * pxHigherPriorityTaskWoken)中断级开启软件定时器函数

停止软件定时器API

函数描述
BaseType_t xTimerStop(TimerHandle_t xTimer,TickType_t xTicksToWait)任务级停止软件定时器函数
BaseType_t xTimerStopFromISR(TimerHandle_t xTimer,BaseType_t * pxHigherPriorityTaskWoken)中断级停止软件定时器函数
  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值