freeRTOS 定时器服务
一、概念:软件定时器、定时器服务任务、定时器命令队列
软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的回调函数。
不能在回调函数中调用任何会阻塞任务的 API 函数 !
定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务(或 Daemon)任务来提供的。
FreeRTOS 提供了很多定时器有关的 API 函数, 这些 API 函数大多都使用 FreeRTOS的队列发送命令给定时器服务任务。
这个队列叫做定时器命令队列。
定时器命令队列是提供给FreeRTOS 的软件定时器使用的,用户不能直接访问!
定时器命令队列将用户应用任务和定时器服务任务连接在一起。
应用程序调用函数 xTimerReset(),结果就是复位命令会被发送到定时器命令队列中,定时器服务任务会处理这个命令。
应用程序是通过函数 xTimerReset()间接的向定时器命令队列发送了复位命令,并不是直接调用类似 xQueueSend()这样的队列操作函数发送的。
使用定时器服务任务,需要配置的几个宏:
configUSE_TIMERS
configTIMER_TASK_PRIORITY
configTIMER_QUEUE_LENGTH
configTIMER_TASK_STACK_DEPTH
二、复位软件定时器
复位软件定时器,会重新计算定时周期到达的时间点,这个新的时间点是相对于复位定时器的那个时刻计算的,并不是第一次启动软件定时器的那个时间点!!!
BaseType_t xTimerReset ( TimerHandle_t xTimer, TickType_t xTicksToWait ) BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, BaseType_t * pxHigherPriorityTaskWoken ); 真正执行的是函数 xTimerGenericCommand()
三、创建软件定时器
新创建的软件定时器处于休眠状态,也就是未运行的。
函数 xTimerStart() 、 xTimerReset() 、xTimerStartFromISR() 、 xTimerResetFromISR() 、 xTimerChangePeriod() 和 xTimerChangePeriodFromISR()可以使新创建的定时器进入活动状态。
TimerHandle_t xTimerCreate( const char * const pcTimerName, TickType_t xTimerPeriodInTicks, UBaseType_t uxAutoReload, void * pvTimerID, 多个定时器使用同一个回调函数时,用于区别。TimerID TimerCallbackFunction_t pxCallbackFunction ) TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, TickType_t xTimerPeriodInTicks, UBaseType_t uxAutoReload,
void * pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t * pxTimerBuffer ) 用于保存Timer结构体
四、开关软件定时器
如果软件定时器没有运行的话调用函数 xTimerStart()就会计算定时器到期时间;
如果软件定时器正在运行的话调用函数 xTimerStart()的结果和 xTimerReset()一样。 BaseType_t xTimerStart ( TimerHandle_t xTimer, TickType_t xTicksToWait ) 进入命令队列的阻塞时间 BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, BaseType_t * pxHigherPriorityTaskWoken ); 这两个功能真正实现的函数是xTimerGenericCommand()
BaseType_t xTimerStop ( TimerHandle_t xTimer, TickType_t xTicksToWait ) BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, BaseType_t * pxHigherPriorityTaskWoken ); 真正实现是函数xTimerGenericCommand()
留白
联我:shen5773384##163.com