机制概述
系统时间由内核时间机制维护,而不是由任务自行推进。
Tick System 是 HRTOS 时间管理体系的重要基础。 在周期性 Tick 方案中,硬件定时器按设定周期产生中断, 内核通过相应的中断处理推进系统时间。
任务延时、定时功能与调度相关机制可以利用这一时间基准, 但各自的处理方式并不相同。系统时间更新也不意味着每次 Tick 都必然发生任务切换。
统一时间基准
提供系统运行时间及基于 Tick 的时间计量基础。
周期性时间驱动
在周期性 Tick 方案中,由定时器中断触发相关内核处理。
支持时间相关功能
为任务延时、时间片及其他时间管理机制提供基础。
工作原理
理解定时器中断与内核时间处理的关系。
定时器事件
硬件定时器按配置产生周期性中断。
Tick 处理
执行系统时间计数及相关时间处理。
时间条件检查
处理等待时间、超时条件或其他时间相关状态。
后续内核行为
根据实际条件,进入相关状态更新或调度处理。
在实现层面,Tick ISR 的工作内容取决于内核设计。 可能涉及时间计数、任务等待时间更新及调度相关处理, 但不应仅凭一般 RTOS 的设计习惯推断 HRTOS 的具体执行顺序。
关键接口
时间配置、运行计数读取与时间单位转换。
| 接口 | 用途 |
|---|---|
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() 不应混为一谈。
后者是忙等待延时,不等价于让任务进入等待状态的任务级延时机制。
定时器配置与重装值
参数含义必须与目标芯片的定时器模式保持一致。
os_tick_config(u8 slice_count, u16 tick_value)
用于配置 HRTOS 的 Tick 相关参数。
按原页面所述,tick_value 会参与计算定时器重装值,
并用于设置 T0 的高、低字节寄存器。
65536 - tick_value,但输入范围、计数方向、定时器工作模式及具体寄存器行为仍须与实际实现核对。
定时器的实际周期还与计数时钟、预分频设置(如果适用)、定时器模式及芯片时钟配置有关。 不能仅凭重装值直接得出准确的 Tick 周期。
配置函数与参数检查
将已知配置行为与尚需核实的边界条件分开。
原始示例中的条件表达式
if(tick_value *<*= 1000)
不是合法的 C 语法,无法直接用于编译。
此外,如果在该判断之前已经将输入参数转换为重装值,
那么后续检查针对的就不再是原始周期参数。
< 1000、<= 1000 或其他比较形式。
这些条件的含义和有效范围并不相同。
建议对配置函数进行源码核对时,分别确认以下内容:
输入范围
确认 0 值、最小允许周期及最大允许周期的处理规则。
整数运算
确认计算过程中的类型宽度、溢出行为和重装值转换。
硬件配置
确认寄存器、定时器模式和实际时钟配置是否匹配。
运行流程与调度关系
时间更新不等于立即切换任务。
当任务的等待条件满足时,内核可以根据自身规则更新任务状态。 任务进入就绪状态后,是否立即执行,仍取决于优先级、调度策略、 当前执行上下文以及具体调度触发路径。
因此,在分析实时响应时,应分别关注 Tick 中断处理耗时、 任务状态更新时间、调度触发路径与上下文切换开销。
实时性与设计注意事项
时间分辨率、处理开销与响应时间需要共同考虑。
时间分辨率
Tick 周期决定基于 Tick 的时间管理粒度之一,但不等于完整的任务响应时间。
中断开销
周期性中断会消耗处理器时间,频率提高时应评估额外处理开销。
调度路径
实际任务切换还受到调度策略、触发条件和当前执行上下文的影响。