软件定时器 freertos
时间: 2025-01-08 18:30:04 浏览: 4
### 设置和使用 FreeRTOS 软件定时器
#### 配置 FreeRTOS 使用软件定时器
为了使 FreeRTOS 支持软件定时器功能,`configUSE_TIMERS` 配置项需设为 `1`。这会在启动调度器时自动创建一个 RTOS 守护任务用于处理所有的软件定时器操作[^1]。
#### 创建软件定时器
创建一个新的软件定时器可以通过调用 `xTimerCreate()` 函数实现。此函数允许指定定时器名称、周期时间、是否重复执行以及回调函数等参数。需要注意的是,刚创建的软件定时器默认处于休眠状态,并不会立即开始计时[^2]。
```c
// 创建一个名为 "OneShotTimer" 的一次性定时器
const TickType_t xTimerPeriod = pdMS_TO_TICKS(5000); // 5秒
StaticTimer_t xTimerBuffer;
TimerHandle_t xTimer;
xTimer = xTimerCreateStatic(
"OneShotTimer", /* 名字 */
xTimerPeriod, /* 周期 (单位: ticks) */
pdFALSE, /* 是否循环 */
(void *)0, /* ID */
vTimerCallbackFunction, /* 回调函数 */
&xTimerBuffer /* 缓冲区地址 */
);
```
#### 启动软件定时器
要激活已创建但尚未运行的软件定时器,可利用 `xTimerStart()` 或者 `xTimerChangePeriod()` 来改变其间隔并同时将其置于活动状态。一旦启动成功,守护线程就会负责监控该定时器直到超时事件发生。
```c
if (xTimer != NULL)
{
// 开启定时器
if (xTimerStart(xTimer, 0) != pdPASS)
{
// 处理错误...
}
}
```
#### 利用定时器ID传递数据至回调函数
在定义定时器时所传入的那个 `(void*)` 类型指针即作为定时器ID存在;它可以携带额外的信息到回调函数内部供后续逻辑判断之用。例如,可以用作区分不同类型的定时器或是存储某些特定数值以便于回调期间访问[^3]。
```c
static void vTimerCallbackFunction(TimerHandle_t pxTimer)
{
uint32_t ulParameter = (uint32_t)pvTimerGetTimerID(pxTimer);
// 根据ulParameter做不同的事情...
configASSERT(ulParameter == 0UL || ulParameter == 1UL);
}
```
阅读全文