HRTOS Kernel Timing Core

系统节拍机制(Tick System)

Tick System 是 HRTOS 的唯一时间基准源,由硬件定时器中断驱动, 用于调度触发、延时递减与系统时间推进。

机制定义

Tick = Hardware Timer Interrupt + Kernel Time Base + Scheduler Trigger
所有时间行为(delay / timeout / wait)均依赖 Tick 驱动,而不是软件轮询。

核心作用

时间基准

提供统一系统时间源(os_tick_get / uptime)。

调度触发

Tick 中断结束后触发调度检查。

延时递减

delay 队列在 Tick 中自动递减。

时间片控制

支持抢占式时间片轮转调度。

执行流程

1. 硬件定时器触发

Timer1 周期性产生 Tick 中断。

2. Tick计数更新

系统时间递增(kernel time base)。

3. 阻塞队列处理

delay / wait timeout 递减。

4. 调度器检查

判断是否发生任务切换。

演示代码


#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);
}

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 对照(v2)

系统意义

Tick 是 HRTOS 的“唯一时间源”,所有调度行为最终都回归 Tick 驱动。 这是实时系统确定性的基础。