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;
}
}
}
- printf pre 1s in windows
CLOCKS_PER_SEC = 1000
1020
2058
3095
4132
5169
6206
7243
8280
9317
- printf 在 linux
前 2 秒
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,因此运行任何时间长度的实际实现都必须考虑到这一点。
我需要一个 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;
}
}
}
- printf pre 1s in windows
CLOCKS_PER_SEC = 1000
1020
2058
3095
4132
5169
6206
7243
8280
9317
- printf 在 linux 前 2 秒
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,因此运行任何时间长度的实际实现都必须考虑到这一点。