H HRTOS 示例
HRTOS Kernel Timing Core

系统节拍机制

Tick System 是 HRTOS 的唯一时间基准源,由硬件定时器中断驱动, 用于调度触发、延时递减与系统时间推进。所有时间行为(delay / timeout / wait)均依赖 Tick 驱动。

示例目标

系统运行一个硬件定时器中断作为 Tick 源,驱动系统时间基准和调度器触发。 通过 LED 指示展示 Tick 中断频率、系统运行时间和延时递减过程,验证 Tick 在实时操作系统中的基础作用。

核心API os_tick_get / os_uptime_ms
驱动方式 硬件定时器中断
时间基准 系统节拍计数
调度触发 os_interrupt_exit

核心机制

  • 硬件定时器中断驱动
  • 系统时间基准维护
  • 调度器触发检查
  • 延时队列递减
Definition

机制定义

Tick 是 HRTOS 的唯一时间基准源

Tick System 由硬件定时器中断、内核时间基准和调度器触发三部分组成。 在 HRTOS 中,所有时间行为(delay / timeout / wait)均依赖 Tick 驱动,而不是软件轮询。

核心公式: Tick = Hardware Timer Interrupt + Kernel Time Base + Scheduler Trigger

硬件定时器中断

由硬件定时器(如 Timer1)周期性产生中断,作为 Tick 的物理来源。 每次中断代表一个系统节拍,通常配置为 1ms 或其他固定时间间隔。

内核时间基准

Tick 中断中维护一个全局计数器(g_tick),作为系统时间的唯一基准。 所有时间相关的 API(os_tick_get、os_uptime_ms)都基于此计数器。

调度器触发

Tick 中断结束后通过 os_interrupt_exit 触发调度器检查, 判断是否需要进行任务切换。这是时间片调度和延时唤醒的基础。

延时队列递减

Tick 中断中自动递减 delay 队列中的任务延时计数, 当延时到期时将任务从阻塞状态转移到就绪状态。

Core Functions

核心作用

Tick 在 HRTOS 中的四大核心功能

时间基准

功能:提供统一系统时间源

API:os_tick_get / os_uptime_ms

作用:所有时间测量都基于 Tick 计数

精度:由硬件定时器配置决定

调度触发

触发时机:Tick 中断结束后

触发方式:os_interrupt_exit

调度检查:判断是否需要任务切换

调度策略:时间片轮转 + 优先级

延时递减

递减对象:delay 队列中的任务

递减频率:每个 Tick 一次

唤醒机制:延时到期转移到就绪队列

阻塞管理:支持多任务同时延时

时间片控制

控制方式:基于 Tick 计数的时间片

抢占机制:时间片到期触发调度

公平调度:同优先级任务轮转执行

实时性:保证任务响应时间

Execution Flow

执行流程

Tick 从触发到调度检查的完整路径

1硬件定时器触发:Timer1 周期性产生 Tick 中断
2Tick计数更新:系统时间递增(kernel time base)
3阻塞队列处理:delay / wait timeout 递减
4调度器检查:判断是否发生任务切换
Timer1 中断 → g_tick++ → LED_TICK 翻转 → os_interrupt_exit → 调度器检查 → 任务切换(如需要)
Demo Code

演示代码

Tick 系统的完整实现示例

Tick 中断与时间 API

Timer1 中断服务程序作为 Tick 源,维护系统时间基准

#include "hrtos.h"

sbit LED_TICK = P1^0;
sbit LED_1S   = P1^1;
sbit LED_RUN  = P1^2;

static volatile u32 g_tick = 0;

/* Timer1 ISR = Tick Source */
void timer1_isr(void)
{
    g_tick++;

    LED_TICK = ~LED_TICK;

    os_interrupt_exit();   // 触发调度点
}

/* uptime API */
u32 os_uptime_ms(void)
{
    return g_tick;
}

/* busy delay(仅用于演示,不推荐生产) */
void task_delay_ms(u16 ms)
{
    u32 start = g_tick;
    while ((g_tick - start) < ms);
}

演示任务与系统初始化

LED 演示任务展示 Tick 时间基准的使用,hrtos_main 初始化定时器和任务

void task_led_demo(void)
{
    u32 t1 = 0, t2 = 0;

    while(1)
    {
        u32 now = os_uptime_ms();

        if(now - t2 >= 1)
        {
            t2 = now;
            LED_RUN = ~LED_RUN;
        }

        if(now - t1 >= 10)
        {
            t1 = now;
            LED_1S = ~LED_1S;
        }

        task_delay_ms(1);
    }
}

/* system entry */
void hrtos_main(void)
{
    LED_TICK = 0;
    LED_1S = 0;
    LED_RUN = 0;

    g_tick = 0;

    /* Timer1 init */
    TMOD |= 0x10;
    TH1 = 0xFC;
    TL1 = 0x66;

    ET1 = 1;
    EA  = 1;
    TR1 = 1;

    /* Tick ISR as kernel task */
    os_task_create((unsigned int)timer1_isr, 0, 9, 0);

    /* demo task */
    os_task_create((unsigned int)task_led_demo, 1, 2, 5);
}
API Reference

API 对照(v2)

时间核心 API 与中断核心 API

Interrupt Core

os_schedule_request - 请求调度

os_interrupt_id - 获取中断 ID

os_interrupt_enter - 中断入口处理

os_interrupt_exit - 中断出口触发调度

System Significance

系统意义

Tick 在实时操作系统中的基础作用

唯一时间源 Tick 是 HRTOS 的"唯一时间源",所有调度行为最终都回归 Tick 驱动
确定性基础 硬件定时器驱动的 Tick 提供可预测的时间基准,是实时系统确定性的基础
调度驱动 时间片调度、延时唤醒、超时处理都依赖 Tick 中断触发
时间管理 提供 os_uptime_ms 等时间 API,支持任务时间测量和系统运行统计
核心判断: Tick 是实时操作系统的时间心脏,通过硬件定时器中断驱动,为系统提供统一的时间基准和调度触发机制,是实现多任务时间管理和实时响应的基础。