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()

 

 

 

 

 

 

 

 

 

 

 

 

留白

posted @ 2017-11-26 22:10  为民除害  阅读(1888)  评论(0编辑  收藏  举报