我需要一个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()
要调用的时间间隔。AFAIKCLOCKS_PER_SEC
在Linux上比Windows系统更大,因此您更有可能“丢掉”时钟滴答。阅读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;
}
该代码从总的经过时间开始工作,因此所有不是精确时钟滴答数的间隔都将被平均(而不是累积舍入误差)。
在某些时候,from的值clock()
将溢出/自动换行,因此可以运行任何时间长度的实际实现都必须注意这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句