硬件定时器中断
由硬件定时器(如 Timer1)周期性产生中断,作为 Tick 的物理来源。 每次中断代表一个系统节拍,通常配置为 1ms 或其他固定时间间隔。
Tick System 是 HRTOS 的唯一时间基准源,由硬件定时器中断驱动, 用于调度触发、延时递减与系统时间推进。所有时间行为(delay / timeout / wait)均依赖 Tick 驱动。
系统运行一个硬件定时器中断作为 Tick 源,驱动系统时间基准和调度器触发。 通过 LED 指示展示 Tick 中断频率、系统运行时间和延时递减过程,验证 Tick 在实时操作系统中的基础作用。
Tick 是 HRTOS 的唯一时间基准源
Tick System 由硬件定时器中断、内核时间基准和调度器触发三部分组成。 在 HRTOS 中,所有时间行为(delay / timeout / wait)均依赖 Tick 驱动,而不是软件轮询。
由硬件定时器(如 Timer1)周期性产生中断,作为 Tick 的物理来源。 每次中断代表一个系统节拍,通常配置为 1ms 或其他固定时间间隔。
Tick 中断中维护一个全局计数器(g_tick),作为系统时间的唯一基准。 所有时间相关的 API(os_tick_get、os_uptime_ms)都基于此计数器。
Tick 中断结束后通过 os_interrupt_exit 触发调度器检查, 判断是否需要进行任务切换。这是时间片调度和延时唤醒的基础。
Tick 中断中自动递减 delay 队列中的任务延时计数, 当延时到期时将任务从阻塞状态转移到就绪状态。
Tick 在 HRTOS 中的四大核心功能
功能:提供统一系统时间源
API:os_tick_get / os_uptime_ms
作用:所有时间测量都基于 Tick 计数
精度:由硬件定时器配置决定
触发时机:Tick 中断结束后
触发方式:os_interrupt_exit
调度检查:判断是否需要任务切换
调度策略:时间片轮转 + 优先级
递减对象:delay 队列中的任务
递减频率:每个 Tick 一次
唤醒机制:延时到期转移到就绪队列
阻塞管理:支持多任务同时延时
控制方式:基于 Tick 计数的时间片
抢占机制:时间片到期触发调度
公平调度:同优先级任务轮转执行
实时性:保证任务响应时间
Tick 从触发到调度检查的完整路径
Tick 系统的完整实现示例
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 与中断核心 API
os_schedule_request - 请求调度
os_interrupt_id - 获取中断 ID
os_interrupt_enter - 中断入口处理
os_interrupt_exit - 中断出口触发调度
Tick 在实时操作系统中的基础作用
深入学习的相关资源