我正在尝试将 u8glib(图形库)移植到 MIPS 处理器、OpenWrt 路由器。 这是 example在arm环境下。
因此,我必须实现的例程之一是:
delay_micro_seconds(uint32_t us)
由于这是一个高分辨率的时间单位,我如何在我的环境中可靠地做到这一点?我已经尝试了以下方法,但我什至不知道如何验证它:
nanosleep((struct timespec[]){{0, 1000}}, NULL);
如何验证此方法?如果这是一个糟糕的方法,我如何才能在 C 中可靠地延迟 1 微秒?
编辑:我已经尝试过这个,但我得到了奇怪的输出,我预计两个 print 之间的差异为 1000*10 iterations = 10,000 ,但实际上更接近 670,000 纳秒:
int main(int argc, char **argv)
{
long res, resb;
struct timespec ts, tsb;
int i;
res = clock_gettime(CLOCK_REALTIME, &ts);
for(i=0;i<10;i++){
nanosleep((struct timespec[]){{0,1000}}, NULL);
}
resb = clock_gettime(CLOCK_REALTIME, &tsb);
if (0 == res) printf("%ld %ld\n", ts.tv_sec, ts.tv_nsec);
else perror("clock_gettime");
if (0 == resb) printf("%ld %ld\n", tsb.tv_sec, tsb.tv_nsec);
else perror("clock_gettime"); //getting 670k delta instead of 10k for tv_nsec
return 0;
}
最佳答案
我假设您的代码可以在 Linux 下运行。
首先,使用clock_getres(2)
查找时钟的分辨率。
然后,使用clock_nanosleep(2)
可能会产生更准确的 sleep 。
要验证 sleep ,我建议您使用clock_gettime(2)
检查耗时
res = clock_gettime(CLOCK_REALTIME, &ts);
if (0 == res) printf("%ld %ld\n", ts.tv_sec, ts.tv_nsec);
else perror("clock_gettime");
clock_nanosleep(CLOCK_REALTIME, 0, &delay, NULL);
res = clock_gettime(CLOCK_REALTIME, &ts);
if (0 == res) printf("%ld %ld\n", ts.tv_sec, ts.tv_nsec);
else perror("clock_gettime");
此外,如有必要,您可以使用更高的 HZ 配置重新编译内核。 阅读 time(7) 手册页会很有帮助。特别是软件时钟、HZ 和 jiffies 和高分辨率计时器部分。 虽然我的手册页说 mips 架构下不支持高分辨率定时器,但我只是用 google 搜索了一下,mips-linux 显然支持 HRT。
关于c - C MIPS 环境中延迟 1 微秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27163501/