rCore
毫秒和微秒返回结果误差
需要实现的两个功能(TaskInfo
和sys_get_time
)需要不同精度的时间(毫秒和微秒),于是我就分别用了OS提供的这两个不同函数。
结果经过一番debug 发现这两个函数的返回值ms
和us/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左右。