rCore

发布时间 2023-12-15 01:54:43作者: huyufeifei

毫秒和微秒返回结果误差

需要实现的两个功能(TaskInfosys_get_time)需要不同精度的时间(毫秒和微秒),于是我就分别用了OS提供的这两个不同函数。
结果经过一番debug 发现这两个函数的返回值msus/1000之间有一定的时间差,原因出在如下部分:

pub fn get_time_ms() -> usize {
    time::read() / (CLOCK_FREQ / MSEC_PER_SEC)
}

pub fn get_time_us() -> usize {
    time::read() / (CLOCK_FREQ / MICRO_PER_SEC)
}

其中(CLOCK_FREQ / MSEC_PER_SEC)是12500
(CLOCK_FREQ / MICRO_PER_SEC)是12.5 -> 12
这个致命的取整导致两个函数除出来的结果不一致,并且很明显ms是准确的,而us有较大误差(4%)
具体来说,我的一个任务从50ms开始运行,在sleep 500ms之后来到550ms,但是这是用us计算出的550ms,实际上现在是530ms,只睡眠了480ms左右。