一、定时器组介绍
FreeRTOS 软件定时器组的时基是基于系统时钟节拍实现的, 之所以叫软件定时器是因为它的实现不需要使用任何硬件定时器, 而且可以创建很多个,综合这些因素,这个功能就被称之为软件定时器组。
FreeRTOS 提供的软件定时器支持单次模式和周期性模式, 单次模式就是用户创建了定时器并启动了定时器后, 定时时间到将不再重新执行, 这就是单次模式软件定时器的含义。 周期模式就是此定时器会按照设置的时间周期重复去执行, 这就是周期模式软件定时器的含义。 另外就是单次模式或者周期模式的定时时间到后会调用定时器的回调函数,用户可以回调函数中加入需要执行的工程代码。
FreeRTOS 定时器组的大部分 API 函数都是通过消息队列给定时器任务发消息,在定时器任务里面执行实际的操作。
二、定时器组API函数
1、函数 xTimerCreate 用于创建软件定时器
TimerHandle_t xTimerCreate( const char * const pcTimerName, /* 定时器名字 */
const TickType_t xTimerPeriodInTicks, /* 定时器周期,单位系统时钟节拍 */
const BaseType_t xAutoReload, /* 选择单次模式或周期模式 */
void * const pvTimerID, /* 定时器ID */
TimerCallbackFunction_t pxCallbackFunction )/* 定时器回调函数 */
第 3 个参数是选择周期模式还是单次模式, 若参数为 pdTRUE, 则表示选择周期模式, 若参数为pdFALSE, 则表示选择单次模式。
返回值:创建成功返回定时器的句柄。
2、函数 xTimerStart 用于启动软件定时器
BaseType_t xTimerStart( TimerHandle_t xTimer, /* 定时器句柄 */
TickType_t xBlockTime ); /* 成功启动定时器前的最大等待时间设置, 单位系统时钟节拍 */
返回值, 返回 pdFAIL 表示此函数向消息队列发送消息失败,返回 pdPASS 表示此函数向消息队列发送消息成功。
3、函数 pvTimerGetTimerID 用于返回使用函数 xTimerCreate 创建的软件定时器 ID
void * pvTimerGetTimerID( const TimerHandle_t xTimer ); /* 定时器句柄 */
返回值:返回定时器 ID。
注意事项:
定时器回调函数是在定时器任务中执行的, 实际应用中切不可在定时器回调函数中调用任何将定时器任务挂起的函数,比如vTaskDelay(), vTaskDelayUntil()以及非零延迟的消息队列和信号量相关的函数。将定时器任务挂起, 会导致定时器任务负责的相关功能都不能正确执行了。
三、测试例程
测试步骤:
1.创建定时器组,一个设置定时1s,一个设置定时2s,并在启动调度前调用
2.实现定时器回调函数,处理不同定时器ID的回调
3.使用串口打印验证
例程:https://gitee.com/hutaooooooo/git_keil/tree/master/freetos_xTimerCreate