任务级延时
通过内核接口请求延时,任务在等待期间不继续执行其后续代码。
任务延时用于表达“当前任务暂时不需要继续执行”的时间要求。 通过系统时间基准与调度机制配合,任务可以在延时期间让出处理器, 并在满足恢复条件后重新参与调度。
延时是任务级时间控制机制,不等同于 CPU 忙等待。
在 RTOS 中,任务延时通常用于周期性工作、等待指定时间后继续执行, 或为其他任务提供处理器执行机会。与循环查询时间的忙等待不同, 可调度的任务延时会结合内核调度机制处理任务的暂停与恢复。
通过内核接口请求延时,任务在等待期间不继续执行其后续代码。
系统 Tick 为内核提供离散的时间计数,延时到期判定受节拍机制影响。
延时条件满足后,任务可以重新具备运行资格;不代表它会立即获得 CPU。
实际延时受到 Tick 配置、调用时刻与调度开销等因素影响。
从延时请求到重新调度,涉及时间推进与任务状态管理。
在典型的 Tick 驱动任务延时模型中,任务提交延时请求后, 内核记录相应的时间条件,并通过调度机制使当前任务暂停执行。 系统时间基准继续推进,满足到期条件后,任务被恢复为可参与调度的状态。
任务调用延时接口,指定需要等待的时间。
内核根据延时语义处理任务的运行资格。
系统时基推进,并判断延时条件是否满足。
任务恢复参与调度,具体执行时刻取决于调度条件。
Task requests delay
|
v
Kernel processes delay request
|
v
Task temporarily stops executing
|
v
System time advances
|
v
Delay condition is satisfied
|
v
Task becomes eligible for scheduling
|
v
Scheduler selects the next task
Tick 是离散时间基准,实际延时精度不能只看请求参数。
Tick 通常由周期性系统时钟中断推进。若系统 Tick 周期为 \(T_{\text{tick}}\),则一个 Tick 对应的名义时间间隔为该周期。 延时请求与 Tick 边界之间的相位差,以及到期后的调度过程, 都会影响任务实际恢复执行的时刻。
Tick frequency = f_tick
Tick period = 1 / f_tick
Nominal elapsed time for N ticks:
T = N × T_tick
例如,若某系统配置的 Tick 周期为 1 ms,那么 10 个 Tick 对应的名义时间跨度为 10 ms。 这并不意味着任务调用延时接口后,经过严格的 10.000 ms 就一定开始继续执行。 实际结果仍取决于计时起点、到期判定方式与调度时机。
按任务延时、单位换算与系统时间读取三个方向理解接口。
os_delay(u16 tick)
os_delay_ms(u8 ms)
os_ms_to_tick(u16 ms)
os_sec_to_tick(u8 sec)
os_tick_config(u8 slice_count, u16 tick_value)
os_tick_get(u16 *high, u16 *low)
os_uptime_ms()
| 接口 | 用途说明 | 核对重点 |
|---|---|---|
os_delay() |
请求基于 Tick 的任务延时。 | 参数单位、零值语义、适用调用上下文与实际恢复规则。 |
os_delay_ms() |
以毫秒为单位表达延时需求。 | 忙等待延时,等待期间持续占用 CPU。 |
os_ms_to_tick() |
毫秒到 Tick 的时间单位换算。 | 舍入方式、最小非零值与数值溢出边界。 |
os_sec_to_tick() |
秒到 Tick 的时间单位换算。 | 返回类型、支持范围与大数值处理方式。 |
os_tick_config() |
配置与系统节拍有关的参数。 | 各参数的真实含义、单位、合法范围及配置生效时机。 |
os_tick_get() |
读取系统 Tick 计数。 | 高低部分的组合方式、读取一致性与计数回绕处理。 |
os_uptime_ms() |
读取以毫秒表示的系统运行时间。 | 时间来源、分辨率、返回类型及长时间运行后的回绕行为。 |
将时间等待交给合适的机制,避免不必要的 CPU 占用。
定期采样、状态检查或低频后台处理,可考虑使用任务级延时控制执行节奏。
在一次处理结束后等待一段时间,再进入下一轮工作。
通过经过核实的换算接口,将业务层时间需求转换为内核时基单位。
极短的硬件时序要求需要单独评估,任务延时通常不适合承担精确微秒级波形控制。
如果任务等待的是消息、信号量或其他事件,而不是固定时间, 应优先评估相应的等待或同步机制,避免用固定延时代替事件驱动。
延时接口的可用性取决于执行上下文与参数契约。
正确理解延时的时间语义,比记住接口名称更重要。
建议结合 Time 模块总览、 Scheduler 调度机制、 任务状态模型 阅读,从系统时基、任务运行资格和调度决策三个层次理解延时行为。