linux c中的程序受到限制
我有下面的循环,它应该以略高于40Hz的频率运行(每次运行之间24毫秒)。它在几秒钟到几分钟内工作得很好,但在没有明显原因(至少我不这么认为)的情况下,它会下降到20Hz 我曾尝试在洋葱欧米茄2(运行openwrt)和ubuntu笔记本电脑上运行代码,结果相同。(omega2上的代码降到了25Hz,而我的笔记本电脑上的代码降到了20Hz) 我怎样才能强迫它继续以正确的速度运行?我用示波器检查了输出,send_brk和send_dmx功能似乎在程序节流时也能正常运行,所以我认为这不是问题所在linux c中的程序受到限制,c,linux,uart,throttling,C,Linux,Uart,Throttling,我有下面的循环,它应该以略高于40Hz的频率运行(每次运行之间24毫秒)。它在几秒钟到几分钟内工作得很好,但在没有明显原因(至少我不这么认为)的情况下,它会下降到20Hz 我曾尝试在洋葱欧米茄2(运行openwrt)和ubuntu笔记本电脑上运行代码,结果相同。(omega2上的代码降到了25Hz,而我的笔记本电脑上的代码降到了20Hz) 我怎样才能强迫它继续以正确的速度运行?我用示波器检查了输出,send_brk和send_dmx功能似乎在程序节流时也能正常运行,所以我认为这不是问题所在 do
double t1 = now();
double t2 = now();
while ( 1 ) {
// Attempt receive UDP data
int x = read(sock, &DMX[1], SIZE - 1);
t2 = now();
double dt = t2 - t1;
if(dt < 0.024){
usleep(500);
continue;
}
t1 = t2;
printf("Frame in %f %f/sec\n", dt, 1.0/dt);
if (x < 0) {
if(errno != EAGAIN){
fprintf(stderr, "Error reading from socket %s\n", strerror(errno));
}
}
send_brk();
send_dmx();
}
now()以浮点形式返回当前时间(以秒为单位)
double now() {
struct timeval tv;
gettimeofday(&tv, NULL);
double time = tv.tv_sec;
time = time + (tv.tv_usec / 1000000.0);
return time;
}
问题是您正在这样做:
while((now()-start)<0.000088){}
没有办法以这种方式生成保证的timign。如果您需要硬实时行为,您的Linux需要一个实时操作系统或RT扩展。@DavidSchwartz为什么会有这个问题?它可以在几天内正常工作minutes@Olaf很抱歉,如果我最后一次回答你的评论是错误的,我是在看到你第二次评论之前写的。我知道linux不是一个实时操作系统,但游戏通常可以以固定的每秒20帧的速度运行,同时占用更多的cpu。我只是好奇为什么这个代码不能稳定运行既然你使用usleep()
睡眠500微秒,为什么不使用usleep()
睡眠88微秒呢?至少,这会让你不再有一个繁忙的循环,它可能会影响你程序的优先级,即使间隔太小,让你感到不舒服。
void send_dmx() {
// setmode(TX);
int n = write(fd, DMX, SIZE);
if(n == -1) {
if (errno != EAGAIN) {
fprintf(stderr, "Error writing to serial %s\n", strerror(errno));
exit(1);
}
}
if (n != SIZE) {
printf("couldn't write full frame =(\n");
}
}
double now() {
struct timeval tv;
gettimeofday(&tv, NULL);
double time = tv.tv_sec;
time = time + (tv.tv_usec / 1000000.0);
return time;
}