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

使用uefi-rs的get_time函数无法获取纳秒值求助

问题解决思路

1. 修复代码逻辑:每次循环重新获取时间

你的代码仅在初始化时获取了一次time变量,后续循环打印的始终是这个初始值,所以不会有变化。需要把时间获取操作放到循环内部:

#![no_main]
#![no_std]

use uefi::prelude::*;
use uefi_services::println;

#[entry]
fn main(_handle: Handle, mut system_table: SystemTable<Boot>) -> Status {
    uefi_services::init(&mut system_table).unwrap();
    let rt = system_table.runtime_services();

    loop {
        let time = rt.get_time().unwrap();
        println!("Nanoseconds: {}", time.nanosecond());
    }
}

2. 检查UEFI固件的时间精度支持

UEFI规范中,Time结构体的nanosecond字段值由固件实现决定,很多BIOS/UEFI固件并不支持纳秒级时间精度,这时该字段会固定返回0。可以先检查时间分辨率确认:

// 在代码中添加分辨率检查逻辑
let time = rt.get_time().unwrap();
println!("Time resolution: {} ns", time.resolution());

如果分辨率远大于1纳秒(比如1000000纳秒即1毫秒),说明固件本身不提供纳秒级时间,nanosecond()返回0属于正常情况。

3. 使用性能计数器替代实时时钟

如果需要高精度计时测试绘制帧率,UEFI的RuntimeServices提供了get_performance_counter()和get_performance_counter_frequency()方法,这是专门用于性能测量的高精度计数器,精度远高于实时时钟:

#![no_main]
#![no_std]

use uefi::prelude::*;
use uefi_services::println;

#[entry]
fn main(_handle: Handle, mut system_table: SystemTable<Boot>) -> Status {
    uefi_services::init(&mut system_table).unwrap();
    let rt = system_table.runtime_services();

    // 获取性能计数器频率
    let (freq, _) = rt.get_performance_counter_frequency().unwrap();
    println!("Performance counter frequency: {} Hz", freq);

    loop {
        let start = rt.get_performance_counter().unwrap();
        // 此处调用你的绘制函数
        // draw_frame();
        let end = rt.get_performance_counter().unwrap();

        // 计算耗时(纳秒):(end - start) * 1e9 / freq
        let duration_ns = (end.checked_sub(start).unwrap() as u128) * 1_000_000_000 / (freq as u128);
        println!("Frame duration: {} ns", duration_ns);
    }
}

性能计数器的精度由硬件决定,通常能达到纳秒级,完全适配帧率测试场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:43:21