c clock() 在不同 OS

c clock() in different OS

我需要一个 60HZ 定时器(16.6 毫秒触发一次)

它在 windows(mingw gcc) 中运行良好,但在 liunx(gcc) 中运行良好

谁能帮我解决这个问题?谢谢

#include <stdio.h>
#include <time.h>t
#define PRE_MS CLOCKS_PER_SEC / 1000
int main()
{
    clock_t pre = clock();
    int cnt = 0;
    printf("CLOCKS_PER_SEC = %d\n", CLOCKS_PER_SEC);
    while (1)
    {
        clock_t diff = clock() - pre;
        if (diff > 16 * PRE_MS)
        {
            cnt++;
            if (cnt > 60)
            {
                printf("%d\n", (int)pre);
                cnt = 0;
            }
            pre += diff;
        }
    }
}
CLOCKS_PER_SEC = 1000
1020
2058
3095
4132
5169
6206
7243
8280
9317
CLOCKS_PER_SEC = 1000000
1875000
3781250
5687500
7593750
9500000
11406250
13312500
15218750

首先是一个误解:60 Hz 不是每秒 17 次操作而是 60 次。

其次,周期检查正在读取 clock() 两次并丢弃调用 printf() 的任何时间间隔。据我所知,Linux 系统上的 CLOCKS_PER_SEC 比 Windows 系统大,因此您更有可能 'throwing away' 时钟滴答。阅读clock()一次,例如:

#include <stdio.h>
#include <time.h>

int main(void)
{
    unsigned long long tickcount = 0;
    clock_t baseticks = clock();    
    while (tickcount < 180) {           // for 3 seconds
        tickcount++;
        clock_t nexttick = (clock_t) (baseticks + tickcount * CLOCKS_PER_SEC / 60);
        while(clock() < nexttick) {}    // wait
        printf("Tick %llu\n", tickcount);
    }
    return 0;
}

该代码从总运行时间开始计算,因此任何不是精确的时钟滴答数的间隔都会被平均(而不是累积舍入误差)。

在某些时候,来自 clock() 的值将 overflow/wrap,因此运行任何时间长度的实际实现都必须考虑到这一点。