Tick 计数器
Timer 基于系统 Tick 计数器进行时间测量,通过 os_tick_get 获取当前时间, 使用 os_ms_to_tick 将毫秒转换为 Tick 数。
Timer 基于 HRTOS Tick 系统实现周期触发与事件驱动回调, 用于实现延时任务、周期任务与事件触发机制。所有 Timer 行为依赖系统 Tick 驱动。
系统创建一个软件定时器,配置为 1000ms 周期触发,通过事件机制解耦定时器回调与任务处理。 验证软件定时器在任务周期执行中的作用,展示定时器与系统 Tick 的关系。
Timer 的组成与驱动方式
Timer System 由 Tick 计数器、比较匹配和回调调度三部分组成。 在 HRTOS 中,所有 Timer 行为依赖 os_tick_config / os_tick_get / scheduler dispatch,而不是独立计时。
Timer 基于系统 Tick 计数器进行时间测量,通过 os_tick_get 获取当前时间, 使用 os_ms_to_tick 将毫秒转换为 Tick 数。
Timer 内部维护目标时间点,每个 Tick 中断时检查是否到达匹配条件, 到达时触发回调执行。
匹配触发后,调度器执行 Timer 回调函数。回调应尽量短, 推荐通过事件机制解耦,避免在回调中执行耗时操作。
Timer 支持单次触发和周期触发两种模式。周期模式下, 回调执行后自动重新计算下一个匹配时间点。
Timer 在 HRTOS 中的主要功能
功能:实现指定时间后的单次任务
API:os_timer_create + os_timer_start
应用:超时处理、延迟初始化
特点:精确到 Tick 级别
功能:按固定周期重复执行任务
配置:设置周期参数为 1
应用:定时采样、状态监控
精度:取决于 Tick 频率
功能:Timer 回调触发事件通知
机制:Timer → Event → Task
优势:解耦回调与任务处理
设计:推荐轻量回调 + 事件解耦
驱动方式:依赖系统 Tick
时间基准:os_tick_get
调度机制:调度器统一管理
资源效率:共享硬件定时器
Timer 从创建到回调执行的完整路径
Timer 系统的完整实现示例
Timer 回调函数通过事件解耦,system_init 初始化事件和定时器
#include "hrtos.h"
#define TIMER_ID 0
#define EVENT_ID 1
/* Timer回调(建议:轻量 + 事件触发) */
void timer_callback(void)
{
os_event_write(EVENT_ID); // 推荐:通过事件解耦
}
/* 初始化 */
void system_init(void)
{
os_event_init(EVENT_ID);
/* 1000ms周期Timer */
os_timer_create(TIMER_ID, os_ms_to_tick(1000), timer_callback, 1);
os_timer_start(TIMER_ID);
}
task_consumer 等待事件并处理,hrtos_main 创建任务并启动系统
/* 消费任务 */
void task_consumer(void)
{
while(1)
{
os_event_wait(EVENT_ID, 0); // 永久等待
LED_EVENT = ~LED_EVENT;
}
}
/* system entry */
void hrtos_main(void)
{
system_init();
os_task_create((unsigned int)task_consumer, 1, 2, 5);
while(1)
{
os_nop();
}
}
Timer 使用时的最佳实践
Timer 回调应尽量短,仅用于触发事件。避免在回调中执行耗时操作或复杂计算, 以免影响系统实时性和调度性能。
Timer → Event → Task,避免 ISR 阻塞。通过事件机制将定时器回调与任务处理解耦, 回调仅负责触发事件,具体处理由任务完成。
Timer 全部依赖系统 Tick,而不是独立计时。所有定时器共享同一个硬件定时器中断, 提高资源利用效率,保证时间基准的一致性。
时间 API、定时器 API 与事件 API
os_tick_get - 获取当前 Tick 计数
os_ms_to_tick - 毫秒转换为 Tick
os_tick_config - 配置 Tick 参数
os_uptime_ms - 获取系统运行时间
深入学习的相关资源