如上所示, 调用函数 xTimerCreate申请,配置定时器, 通过 xTimerStart 启动定时器, 当定时器计数溢出时, 系统回调注册的函数。
定时器可以设置为一次性 One-shot 或者自动重载 Auto-reload 两种, 第一种溢出后停止定时器, 第二种溢出后会再次启动定时器。

在申请定时器的时候设置的定时器周期, 可以通过函数 xTimerChangePeriod 修改, 如下示例 :
void vAFunction_2( TimerHandle_t xTimer )
{
// 判断定时器是否处于运行状态
if( xTimerIsTimerActive( xTimer ) != pdFALSE )
{
/* xTimer is active, do something. */
}
else
{
// 处于这个状态的定时器, 可能由于 :
// 1 定时器 create 后没有start
// 2 一次性定时器执行溢出后
// 修改定时器周期
if( xTimerChangePeriod( xTimer,
/*修改定时周期*/
500 / portTICK_PERIOD_MS,
/*允许阻塞最大时间 100 ticks*/
100 ) == pdPASS )
{
// update fail
// 阻塞 100 tick 仍然无法发送命令
// 删除定时器 释放对应内存!
xTimerDelete( xTimer );
}
else
{
// 定时器配置更新成功, 并已经启动 !!
}
}
}
如上, 该函数会修改定时器并使定时器 开始运行!!!
另外, 可以通过函数 xTimerReset 重启定时器, 如果已经启动计数, 重新开始计数; 如果没有启动,启动定时器。freertos 硬件定时器
定时器使用系统提供 API,涉及 Queue 操作, 如果是在中断程序中调用,需要调用对应带 FromISR的接口。
其他获取定时器信息的函数
// 获取名称 , 申请是设置的字符串
pcTimerGetName()
// 定时器溢出周期
xTimerGetPeriod()
// 返回定时器溢出的时间点 (--> xTaskGetTickCount())
xTimerGetExpiryTime()
FreeRTOS 软定时器的实现在源码目录 , 涉及 链表 和 消息队列(后续文章分析)。
使用定时器前,需要先申请定时器, 见 中, 通过函数 xTimerCreate获取一个定时器, 实际上是向系统申请了一块内存存储定时器控制块的数据结构, 并将参数填写到该结构体中。

typedef struct tmrTimerControl
{
// 定时器名 方便调试
const char *pcTimerName;
// 链表项 用于插入定时链表
ListItem_t xTimerListItem;
// 定时器中断周期
TickType_t xTimerPeriodInTicks;
// 是否自动重置, 如果 =pdFalse 为一次性
UBaseType_t uxAutoReload;
// 溢出计数 需自己设置
void *pvTimerID;
// 定时器溢出回调函数
TimerCallbackFunction_t pxCallbackFunction;
#if( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxTimerNumber;
#endif
#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) &&
( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
// 标记定时器使用的内存, 删除时判断是否需要释放内存
uint8_t ucStaticallyAllocated; #endif
} xTIMER;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29404-2.html
你5s多少内存的
让这种无良商家自生自灭吧
这都够进监狱了