H HRTOS 示例
Software Timer System

定时器机制

Timer 基于 HRTOS Tick 系统实现周期触发与事件驱动回调, 用于实现延时任务、周期任务与事件触发机制。所有 Timer 行为依赖系统 Tick 驱动。

示例目标

系统创建一个软件定时器,配置为 1000ms 周期触发,通过事件机制解耦定时器回调与任务处理。 验证软件定时器在任务周期执行中的作用,展示定时器与系统 Tick 的关系。

核心API os_timer_create / os_timer_start
驱动方式 系统 Tick 驱动
触发模式 周期触发 + 事件解耦
回调设计 轻量 + 事件触发

核心机制

  • Tick 计数器比较匹配
  • 回调函数调度
  • 事件机制解耦
  • 周期任务执行
Mechanism Model

机制模型

Timer 的组成与驱动方式

Timer System 由 Tick 计数器、比较匹配和回调调度三部分组成。 在 HRTOS 中,所有 Timer 行为依赖 os_tick_config / os_tick_get / scheduler dispatch,而不是独立计时。

核心公式: Timer = Tick Counter + Compare Match + Callback Dispatch

Tick 计数器

Timer 基于系统 Tick 计数器进行时间测量,通过 os_tick_get 获取当前时间, 使用 os_ms_to_tick 将毫秒转换为 Tick 数。

比较匹配

Timer 内部维护目标时间点,每个 Tick 中断时检查是否到达匹配条件, 到达时触发回调执行。

回调调度

匹配触发后,调度器执行 Timer 回调函数。回调应尽量短, 推荐通过事件机制解耦,避免在回调中执行耗时操作。

周期模式

Timer 支持单次触发和周期触发两种模式。周期模式下, 回调执行后自动重新计算下一个匹配时间点。

Core Functions

核心功能

Timer 在 HRTOS 中的主要功能

延时任务

功能:实现指定时间后的单次任务

API:os_timer_create + os_timer_start

应用:超时处理、延迟初始化

特点:精确到 Tick 级别

周期任务

功能:按固定周期重复执行任务

配置:设置周期参数为 1

应用:定时采样、状态监控

精度:取决于 Tick 频率

事件触发

功能:Timer 回调触发事件通知

机制:Timer → Event → Task

优势:解耦回调与任务处理

设计:推荐轻量回调 + 事件解耦

Tick 统一驱动

驱动方式:依赖系统 Tick

时间基准:os_tick_get

调度机制:调度器统一管理

资源效率:共享硬件定时器

Execution Flow

执行流程

Timer 从创建到回调执行的完整路径

1Timer 注册到内核:os_timer_create 创建定时器并注册
2Timer 启动:os_timer_start 启动定时器
3Tick 递增计数:系统 Tick 中断递增计数器
4Compare Match 触发:检查是否到达匹配时间点
5调度器执行回调:触发 timer_callback 回调函数
os_timer_create → os_timer_start → Tick 递增 → Compare Match → timer_callback → os_event_write → task_consumer → os_event_wait → LED_EVENT 翻转
Demo Code

示例代码

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();
    }
}
Design Principles

系统设计原则

Timer 使用时的最佳实践

Timer 不做重计算

Timer 回调应尽量短,仅用于触发事件。避免在回调中执行耗时操作或复杂计算, 以免影响系统实时性和调度性能。

推荐事件解耦

Timer → Event → Task,避免 ISR 阻塞。通过事件机制将定时器回调与任务处理解耦, 回调仅负责触发事件,具体处理由任务完成。

Tick 统一驱动

Timer 全部依赖系统 Tick,而不是独立计时。所有定时器共享同一个硬件定时器中断, 提高资源利用效率,保证时间基准的一致性。

API Reference

API 对照(v2)

时间 API、定时器 API 与事件 API

Time API

os_tick_get - 获取当前 Tick 计数

os_ms_to_tick - 毫秒转换为 Tick

os_tick_config - 配置 Tick 参数

os_uptime_ms - 获取系统运行时间