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) | 中断级停止软件定时器函数 |