HRTOS / TIME SUBSYSTEM

系统节拍 Tick System

系统节拍为 HRTOS 提供时间推进的基础。 通过硬件定时器与相关内核处理,系统可以建立运行时间计数, 并为任务延时、时间片管理及其他时间相关功能提供支持。

System Tick Timer Interrupt Time Base 8051 Kernel
01

机制概述

系统时间由内核时间机制维护,而不是由任务自行推进。

Tick System 是 HRTOS 时间管理体系的重要基础。 在周期性 Tick 方案中,硬件定时器按设定周期产生中断, 内核通过相应的中断处理推进系统时间。

任务延时、定时功能与调度相关机制可以利用这一时间基准, 但各自的处理方式并不相同。系统时间更新也不意味着每次 Tick 都必然发生任务切换。

01 / TIME BASE

统一时间基准

提供系统运行时间及基于 Tick 的时间计量基础。

02 / TIMER ISR

周期性时间驱动

在周期性 Tick 方案中,由定时器中断触发相关内核处理。

03 / KERNEL

支持时间相关功能

为任务延时、时间片及其他时间管理机制提供基础。

核心区别: Tick 是时间推进的基准;任务唤醒是状态处理;调度触发是执行流程控制。 三者相互关联,但不能简单视为同一个动作。
02

工作原理

理解定时器中断与内核时间处理的关系。

STEP 01

定时器事件

硬件定时器按配置产生周期性中断。

STEP 02

Tick 处理

执行系统时间计数及相关时间处理。

STEP 03

时间条件检查

处理等待时间、超时条件或其他时间相关状态。

STEP 04

后续内核行为

根据实际条件,进入相关状态更新或调度处理。

在实现层面,Tick ISR 的工作内容取决于内核设计。 可能涉及时间计数、任务等待时间更新及调度相关处理, 但不应仅凭一般 RTOS 的设计习惯推断 HRTOS 的具体执行顺序。

实时性注意: Tick 中断处理属于系统运行开销的一部分。 对中断路径进行分析时,应结合实际汇编指令、定时器配置和中断嵌套行为, 而不能只根据 C 代码行数估计执行时间。
03

关键接口

时间配置、运行计数读取与时间单位转换。

Time API Reference HRTOS / C51
extern char os_tick_config(u8 slice_count, u16 tick_value); extern void os_tick_get(u16 *high, u16 *low); extern u32 os_uptime_ms(void); extern u16 os_ms_to_tick(u16 ms); extern u16 os_sec_to_tick(u8 sec); extern void os_delay(u16 tick); extern void os_delay_ms(unsigned char ms);
接口 用途
os_tick_config() 配置系统 Tick 相关参数,包括时间片参数与定时器周期参数。
os_tick_get() 读取系统 Tick 计数的高、低 16 位。
os_uptime_ms() 获取以毫秒表示的系统运行时间。
os_ms_to_tick() 将毫秒数转换为 Tick 数量。
os_sec_to_tick() 将秒数转换为 Tick 数量。
os_delay() 任务级 Tick 延时接口。
os_delay_ms() 忙等待延时,等待期间持续占用 CPU,不通过任务阻塞机制主动让出处理器。
接口区别: os_delay() 与 os_delay_ms() 不应混为一谈。 后者是忙等待延时,不等价于让任务进入等待状态的任务级延时机制。
04

定时器配置与重装值

参数含义必须与目标芯片的定时器模式保持一致。

os_tick_config(u8 slice_count, u16 tick_value) 用于配置 HRTOS 的 Tick 相关参数。 按原页面所述,tick_value 会参与计算定时器重装值, 并用于设置 T0 的高、低字节寄存器。

16-bit Timer Reload CALCULATION REFERENCE
// 按原文档所述的计算形式 reload_value = 65535 - tick_value + 1 // 定时器重装寄存器 OS_T0_TH0 = reload_value >> 8 OS_T0_TL0 = reload_value & 0xFF
计算说明: 上方展示的是原文档描述的计算关系,不是完整可直接编译的配置函数。 对于 16 位定时器,数学上可将该表达式理解为 65536 - tick_value,但输入范围、计数方向、定时器工作模式及具体寄存器行为仍须与实际实现核对。

定时器的实际周期还与计数时钟、预分频设置(如果适用)、定时器模式及芯片时钟配置有关。 不能仅凭重装值直接得出准确的 Tick 周期。

05

配置函数与参数检查

将已知配置行为与尚需核实的边界条件分开。

原始示例中的条件表达式 if(tick_value *<*= 1000) 不是合法的 C 语法,无法直接用于编译。 此外,如果在该判断之前已经将输入参数转换为重装值, 那么后续检查针对的就不再是原始周期参数。

不要直接用猜测修补原函数。 在没有核对原始源码之前,不应擅自把损坏的条件改成 < 1000、<= 1000 或其他比较形式。 这些条件的含义和有效范围并不相同。

建议对配置函数进行源码核对时,分别确认以下内容:

CHECK 01

输入范围

确认 0 值、最小允许周期及最大允许周期的处理规则。

CHECK 02

整数运算

确认计算过程中的类型宽度、溢出行为和重装值转换。

CHECK 03

硬件配置

确认寄存器、定时器模式和实际时钟配置是否匹配。

06

运行流程与调度关系

时间更新不等于立即切换任务。

Tick System · Conceptual Flow LOGIC OVERVIEW
// 时间基准 Hardware Timer └─ Tick Interrupt └─ System Time Update // 可能关联的时间处理 ├─ Task Delay / Waiting-Time Processing ├─ Timeout Conditions └─ Time-Slice Management // 后续执行行为 └─ Scheduling Trigger └─ Scheduler / Context Switch // 是否执行取决于实际条件

当任务的等待条件满足时,内核可以根据自身规则更新任务状态。 任务进入就绪状态后,是否立即执行,仍取决于优先级、调度策略、 当前执行上下文以及具体调度触发路径。

因此,在分析实时响应时,应分别关注 Tick 中断处理耗时、 任务状态更新时间、调度触发路径与上下文切换开销。

07

实时性与设计注意事项

时间分辨率、处理开销与响应时间需要共同考虑。

TIMING

时间分辨率

Tick 周期决定基于 Tick 的时间管理粒度之一,但不等于完整的任务响应时间。

OVERHEAD

中断开销

周期性中断会消耗处理器时间,频率提高时应评估额外处理开销。

SCHEDULING

调度路径

实际任务切换还受到调度策略、触发条件和当前执行上下文的影响。

关于 Tickless: Tickless 是一种可选的低功耗时间管理设计。 本页不将其列为 HRTOS 已实现的功能;是否支持应以实际内核代码和目标平台为准。