c - C MIPS 环境中延迟 1 微秒

标签 c mips clock u8glib

我正在尝试将 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/

相关文章:

assembly - 在MIPS中读取文件时,它读取最后一行两次

从 linux x32/x64 交叉编译到 netbsd mips/el

clock() 在使用 C 时即使暂停大约 5 秒也会返回 0

c - MPI 总运行时间

c - 通过引用传递结构并对其进行操作

c++ - 为什么编译器允许字符串文字不是 const?

c - 字符串值 = "clay"自动更改为 "/000lay"?

c - 向 Minix 添加打印父进程 ID 系统调用

assembly - 如果数字不 >= 0,为什么代码加 7

android - 每秒更新 TextView