FreeRTOS 学习六:软件定时器

1. 简介:

  • 对定时器的命令队列的长度需要配置 configTIMER_QUEUE_LENGTH,是个私有的变量
  • 定时器的优先级是宏 configTIMER_TASK_PRIORITY,是个私有变量

2. 函数:

2.1 创建软件定时器

TimerHandle_t xTimerCreate( const char *pcTimerName,  
                            const TickType_t xTimerPeriod,  
                            const UBaseType_t uxAutoReload,  
                            void * const pvTimerID,  
                            TimerCallbackFunction_t pxCallbackFunction );
参数:
①pcTimerName,定时器的名字,纯粹是为了调试
②xTimerPeriod,定时器的周期,单位是tick,要把ms转换成tick,用pdMS_TO_TICKS()宏转换,比如500ms定时器pdMS_TO_TICKS( 500 ),需要注意的是configTICK_RATE_HZ配置的值应该<=1000
③uxAutoReload,设置成pdTRUE,将定义一个无限重复的定时器,设置成pdFALSE,将定义一个只执行一次的定时器
④pvTimerID,创建的定时器的标识符,如果多个定时器使用同一个回调函数,可以在回调函数中通过识别这个标识符来决定使用哪个定时器,另外,定时器标识符可以被用作储存一个值
⑤pxCallbackFunction,时间到后执行这个指针指向的函数,这个函数的原型是 void vCallbackFunctionExample( TimerHandle_t xTimer );
返回值:
非NULL,定时器的句柄,创建成功
NULL,因freertos的堆空间不同,创建失败

注意:

  • configUSE_TIMERS和configSUPPORT_DYNAMIC_ALLOCATION必须设置成1,configSUPPORT_DYNAMIC_ALLOCATION默认值就是1
  • 此函数也有一个static后缀的函数,此处不再介绍

2.2 删除定时器

BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );
参数:
xTimer,定时器句柄
xTicksToWait ,指定一个时间,单位ticks,调用这个函数的任务处于阻塞状态,等待着删除命令在这个指定的时间内成功发送到定时器的命令队列中,删除需要在任务调度开始前执行
返回值:
pdFAIL,在指定的时间内不能成功发送到定时器的命令队列中,或者是时间超时
pdPASS,成功发送,是不是执行,还要看定时器的优先级

2.3 定时器开始

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );
/* 中断中使用 */
BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken );
参数:
xTimer,定时器句柄
xTicksToWait,单位ticks,调用这个函数的任务等待start信号成功发送到命令队列的时间
pxHigherPriorityTaskWoken,定时器服务大多数情况下都处于阻塞状态,等待命令队列的到达,如果调用xTimerStartFromISR函数,引起定时器任务跳出阻塞状态,并且定时器任务的优先级等于或者大于当前任务的优先级,则,这个值设为pdTRUE
返回值:
pdFAIL,不能成功发送到命令队列(队列满),或者时间超时
pdPASS,成功发送,是不是执行,还要看定时器的优先级
说明:
如果原先定时器没有开始,这个函数是开始,如果原先定时器就在运行,那这个函数就相当于xTimerReset函数

2.4 定时器停止

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );
/* 中断中定义 */
BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken );
参数:
xTimer,定时器句柄
xTicksToWait,单位ticks,调用这个函数的任务等待stop信号成功发送到命令队列的时间
pxHigherPriorityTaskWoken,如果调用xTimerStopFromISR函数,引起定时器任务跳出阻塞状态,并且定时器任务的优先级等于或者大于当前任务的优先级,则,这个值设为pdTRUE,之后应该在中断程序退出前有个上下文切换
返回值:
pdFAIL,不能成功发送到命令队列(可能是队列满了),或者时间超时
pdPASS,成功发送,是不是执行,还要看定时器的优先级

2.5 定时器复位

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );
/* 中断中使用 */
BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken );
参数:
xTimer,定时器句柄
xTicksToWait,单位ticks,调用这个函数的任务等待stop信号成功发送到命令队列的时间
pxHigherPriorityTaskWoken,如果调用xTimerResetFromISR函数,引起定时器任务跳出阻塞状态,并且定时器任务的优先级等于或者大于当前任务的优先级,则,这个值设为pdTRUE,之后应该在中断程序退出前有个上下文切换
返回值:
pdFAIL,不能成功发送到命令队列(可能是队列满了),或者时间超时
pdPASS,成功发送,是不是执行,还要看定时器的优先级
说明:
如果定时器已经开始,定时器将重新计算需要时间,如果定时器没有开始运行,则这个函数相当于xTimerStart函数

2.6 定时器的TimerID的操作

/* 设置TimerID */
void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID );
/* 查询 */
void *pvTimerGetTimerID( TimerHandle_t xTimer );
说明:
需要设置 configUSE_TIMERS = 1 ,这两个函数才能使用
TimerID 在多个定时器公用一个回调函数的时候,可以用于区分具体哪个定时器,这个参数还可以作为调用者和毁掉函数传递参数的媒介

2.7 对任务周期的操作

/* 改变周期 */
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,  
                               TickType_t xNewPeriod, 
                               TickType_t xTicksToWait );
/* 中断中使用 */
BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer,  
                                      TickType_t xNewPeriod, 
                                      BaseType_t *pxHigherPriorityTaskWoken );
/* 查询周期 */
TickType_t xTimerGetPeriod( TimerHandle_t xTimer );
由于前边参数的介绍比较多了,此处的参数除非有很大差异,否则不再介绍。 说明:
单位是 ticks

2.8 查询定时器守护进程任务句柄

TaskHandle_t xTimerGetTimerDaemonTaskHandle( void );
说明:
返回软件定时器守护进程的句柄,这个守护进程是调度器开始的时候自动创建的,定时器的回调函数运行在守护进程的上下文(context)

2.9 查询定时器名字

const char * pcTimerGetName( TimerHandle_t xTimer );
说明:
没啥说明的,太简单,,,

2.10 查询定时器终结(Expiry)的时间

const char * pcTimerGetName( TimerHandle_t xTimer );
简介:
返回定时器终结的时间,这个时间是定时器回调函数执行的时间
返回值:
如果被xTimer(OS系统的定时器)引用的定时器(stm32的定时器)是可用的(active),xTimerIsTimerActive用于查询定时器是不是active,返回回调函数将要执行的时间,单位是ticks,如果定时器不可用,返回值没有定义,因此xTimerIsTimerActive的使用是必须的。
说明:
如果返回的时间值小于 目前的tick计数值,那么这个定时器不会停止,直到定时器的tick计数溢出或者回到了0。

2.11 查询定时器开始没开始

BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer );
返回值:
pdFALSE,没有运行
其他值,运行

2.12 一个还没理解的函数(有待完善)

BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, 
                                   void *pvParameter1, 
                                   uint32_t ulParameter2, 
                                   TickType_t xTicksToWait );
BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, 
                                          void *pvParameter1, 
                                          uint32_t ulParameter2, 
                                          BaseType_t *pxHigherPriorityTaskWoken );
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值