FreeRTOS 软件定时器工作原理及应用
FreeRTOS 的 软件定时器(Software Timer) 是一种基于系统节拍(Tick)的计时机制,允许开发者创建周期性或单次触发的定时任务,而无需依赖硬件定时器。软件定时器由 定时器服务任务(Timer Service Task) 管理,适用于需要时间控制但无需高精度的场景(如心跳检测、状态轮询等)。
1. 软件定时器的工作原理
1.1 基本架构
-
定时器服务任务(Timer Daemon Task)
- FreeRTOS 在启动调度器时(
vTaskStartScheduler()
)自动创建该任务(需启用configUSE_TIMERS=1
)。 - 默认优先级由
configTIMER_TASK_PRIORITY
定义(通常较高,如configMAX_PRIORITIES-1
)。 - 负责检查定时器列表,并在到期时执行回调函数。
- FreeRTOS 在启动调度器时(
-
定时器控制块(Timer Control Block, TCB)
- 存储定时器的状态(激活/未激活)、周期、回调函数等信息。
-
定时器命令队列(Timer Command Queue)
- 用户通过 API(如
xTimerStart()
)发送命令(启动/停止/复位等)到队列,由定时器服务任务异步处理。
- 用户通过 API(如
1.2 工作流程
-
创建定时器
- 调用
xTimerCreate()
创建一个定时器对象(返回TimerHandle_t
句柄)。 - 指定定时器类型(单次
pdFALSE
/ 周期pdTRUE
)、周期时间(Tick 数)、回调函数。
- 调用
-
启动定时器
- 通过
xTimerStart()
或xTimerStartFromISR()
(中断中调用)将启动命令发送到定时器命令队列。 - 定时器服务任务从队列中取出命令并激活定时器。
- 通过
-
定时器到期处理
- 定时器服务任务检查系统时间,当定时器到期时:
- 执行用户定义的回调函数。
- 若为周期定时器,自动重新加载周期值;若为单次定时器,则停止。
- 定时器服务任务检查系统时间,当定时器到期时:
2. 关键 API 函数
2.1 创建定时器
TimerHandle_t xTimerCreate(
const char * const pcTimerName, // 定时器名称(调试用)
const TickType_t xTimerPeriod, // 周期(Tick 数)
co