机制概述
系统时间推进与任务调度并不是同一个概念。
系统 Tick 为内核提供周期性的时间推进依据。 在具体实现中,Tick 相关处理可以与任务等待计时、超时检查、 时间片管理及调度触发等机制发生联系。
需要区分的是:时间基准、任务状态更新、调度请求和实际上下文切换 属于不同层次。一次 Tick 到来,并不意味着每次都会发生任务切换。
工作机制
从周期性中断到可能发生的调度处理。
Tick 中断
硬件定时器按照配置产生周期性中断。
时间推进
执行相应的系统时间计数与时间管理处理。
状态检查
根据内核规则处理等待计时和满足条件的任务。
调度处理
符合相应触发条件时,进入后续调度流程。
对于任务延时,重点是等待条件何时满足以及任务状态如何更新; 对于调度处理,重点则是何时需要重新选择任务,以及内核通过什么路径完成切换。
关键接口
系统 Tick 配置、时间读取与延时相关 API。
| 接口 | 作用 |
|---|---|
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_ms() 属于忙等待,与任务级延时有本质区别。
不应将它当作能够阻塞当前任务并让其他任务运行的延时接口。
Tick 配置与时间参数
配置参数决定系统节拍的实际运行行为。
os_tick_config(u8 slice_count, u16 tick_value)
用于配置 HRTOS 的 Tick 相关参数。配置时应结合目标芯片、
定时器时钟、内核时间单位及时间片策略理解各参数的含义。
os_tick_config() 的实现、参数取值范围、定时器工作模式与目标芯片的数据手册,
确认计算结果和寄存器配置相匹配。
初始化顺序、定时器启动时机及参数合法性检查也应以当前内核实现为准, 不宜仅根据接口名称推断内部执行顺序。
运行流程与调度关系
将时间处理与上下文切换分开理解。
如果等待任务达到唤醒条件,内核可以按照相应规则更新任务状态; 任务进入就绪状态之后,是否立即执行,还取决于调度策略、当前执行上下文及相关触发条件。
因此,分析实时响应时间时,应分别关注 Tick 中断处理耗时、 调度触发路径、上下文切换开销以及高优先级任务对执行时机的影响。
设计与实时性注意事项
时间精度、处理开销和响应延迟需要共同考虑。
中断处理开销
Tick 相关中断处理应尽可能精简,避免在中断路径中引入不必要的长耗时操作。
时间分辨率
Tick 周期决定基于 Tick 的时间管理粒度之一,但不等于整个系统的实际响应延迟。
时间片策略
时间片轮转行为取决于调度器的具体实现,需结合优先级策略和时间片配置分析。
精度与开销
提高 Tick 频率通常会增加单位时间内的中断处理次数,应结合应用需求评估。