使用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
相关产品推荐
相关产品推荐

