You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust无std环境下如何实现sleep/wait延时等待功能?

Rust 无标准库环境下实现延迟等待的两种常用方案

方案1:简易忙等待(适合精度要求不高的快速实现)

忙等待的原理是让CPU循环执行空操作,直到达到预期的延迟时长,不需要额外配置硬件,适合快速验证功能。

  • 首先你需要根据你的CPU主频估算出循环次数:比如1GHz的CPU每秒可以执行约10^9个周期,100ms对应1e8个周期,每个空循环大概占用2~3个周期,写完后可以实际运行校准循环次数。
  • Rust下的实现代码示例:
// 先根据你的CPU主频调整这个常量,比如1GHz下100ms大概对应30_000_000次循环,需要实际测试校准
const WAIT_100MS_COUNT: usize = 30_000_000;

#[inline(never)]
fn wait_100ms() {
    for _ in 0..WAIT_100MS_COUNT {
        // 告诉编译器不要优化掉这个空循环
        core::hint::spin_loop();
    }
}

注意:这种方案的延迟精度受CPU主频、编译器优化等级影响很大,适合临时测试用,不适合对延迟精度要求高的场景。另外core::hint::spin_loop()是core库提供的,不需要std依赖,部分架构下会在自旋时降低CPU功耗。

方案2:基于硬件定时器的精准延迟(推荐用于正式实现)

x86架构下可以使用PIT(可编程间隔定时器)或者APIC定时器,RISC-V架构可以使用内置的mtime定时器,这是精度最高的标准实现方式。
以x86_64架构的PIT为例,实现步骤如下:

  1. 初始化PIT,设置固定的计数频率(通常设置为1000Hz,也就是每1ms触发一次中断)
  2. 维护一个全局的系统滴答计数变量,每次PIT中断触发时计数加1
  3. 等待函数只需要循环判断当前滴答计数和目标计数的差值即可,示例代码框架:
use core::sync::atomic::{AtomicU64, Ordering};

// 全局滴答计数,单位ms
static TICKS: AtomicU64 = AtomicU64::new(0);

// PIT中断处理函数中调用,每次触发就加1
pub fn tick() {
    TICKS.fetch_add(1, Ordering::Relaxed);
}

pub fn wait_ms(ms: u64) {
    let start = TICKS.load(Ordering::Relaxed);
    while TICKS.load(Ordering::Relaxed) - start < ms {}
}

// 调用时传入100即可等待约100ms
// wait_ms(100);

注意:这种方案需要你提前配置好对应架构的定时器和中断处理,精度可以达到ms级,不会浪费过多CPU资源,是操作系统开发的标准实现方案。

内容的提问来源于stack exchange,提问作者yuto0214w

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:00:01