8、软件定时器(software timer)
2022-11-30 19:32:14 2 举报
AI智能生成
1
作者其他创作
大纲/内容
特性
状态
运行(Running、 Active)
休眠(Dormant)
上下文
守护任务
优先级 configTIMER_TASK_PRIORITY
定时器命令队列长度 configTIMER_QUEUE_LENGTH
守护任务调度
处理命令:从命令队列里取出命令、处理
执行定时器的回调函数
回调函数
void ATimerCallback( TimerHandle_t xTimer )
函数
创建
TimerHandle_t xTimerCreate( const char * const pcTimerName, // 定时器名字
const TickType_t xTimerPeriodInTicks, // 周期, 以Tick为单位
const UBaseType_t uxAutoReload, //类型, pdTRUE --> 自动加载, pdFALSE --> 一次性
void * const pvTimerID, // 回调函数可以使用此参数, 比如分辨是哪个定时器
TimerCallbackFunction_t pxCallbackFunction ); //回调函数
const TickType_t xTimerPeriodInTicks, // 周期, 以Tick为单位
const UBaseType_t uxAutoReload, //类型, pdTRUE --> 自动加载, pdFALSE --> 一次性
void * const 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 );
TickType_t xTimerPeriodInTicks,
UBaseType_t uxAutoReload,
void * pvTimerID,
TimerCallbackFunction_t pxCallbackFunction,
StaticTimer_t *pxTimerBuffer );
回调函数类型 void ATimerCallback( TimerHandle_t xTimer ); typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer );
删除
BaseType_t xTimerDelete( TimerHandle_t xTimer, // 要删除哪个定时器 TickType_t xTicksToWait ); // 超时时间
启动/停止
启动
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );
BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t *pxHigherPriorityTaskWoken );
停止
BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );
BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t *pxHigherPriorityTaskWoken );
参数 pxHigherPriorityTaskWoken: 向队列发出命令使得守护任务被唤醒,
如果守护任务的优先级比当前任务的高,
则"*pxHigherPriorityTaskWoken = pdTRUE",
表示需要进行任务调度
如果守护任务的优先级比当前任务的高,
则"*pxHigherPriorityTaskWoken = pdTRUE",
表示需要进行任务调度
复位
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );
BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,
BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t *pxHigherPriorityTaskWoken );
修改周期
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
TickType_t xNewPeriod,
TickType_t xTicksToWait );
TickType_t xNewPeriod,
TickType_t xTicksToWait );
BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer,
TickType_t xNewPeriod,
BaseType_t *pxHigherPriorityTaskWoken );
TickType_t xNewPeriod,
BaseType_t *pxHigherPriorityTaskWoken );
定时器ID
void *pvTimerGetTimerID( TimerHandle_t xTimer ); (获得定时器的ID)
void vTimerSetTimerID( TimerHandle_t xTimer, (设置定时器的ID) void *pvNewID ) //新ID
使用
一般使用
/* 1. 工程中 */
添加 timer.c
/* 2. 配置文件FreeRTOSConfig.h中 */
##define configUSE_TIMERS 1 /* 使能定时器 */
##define configTIMER_TASK_PRIORITY 31 /* 守护任务的优先级, 尽可能高一些 */
##define configTIMER_QUEUE_LENGTH 5 /* 命令队列长度 */
##define configTIMER_TASK_STACK_DEPTH 32 /* 守护任务的栈大小 */
/* 3. 源码中 */
##include "timers.h"
添加 timer.c
/* 2. 配置文件FreeRTOSConfig.h中 */
##define configUSE_TIMERS 1 /* 使能定时器 */
##define configTIMER_TASK_PRIORITY 31 /* 守护任务的优先级, 尽可能高一些 */
##define configTIMER_QUEUE_LENGTH 5 /* 命令队列长度 */
##define configTIMER_TASK_STACK_DEPTH 32 /* 守护任务的栈大小 */
/* 3. 源码中 */
##include "timers.h"
消除抖动
0 条评论
下一页