linux c中的程序受到限制

linux c中的程序受到限制,c,linux,uart,throttling,C,Linux,Uart,Throttling,我有下面的循环,它应该以略高于40Hz的频率运行(每次运行之间24毫秒)。它在几秒钟到几分钟内工作得很好,但在没有明显原因(至少我不这么认为)的情况下,它会下降到20Hz 我曾尝试在洋葱欧米茄2(运行openwrt)和ubuntu笔记本电脑上运行代码,结果相同。(omega2上的代码降到了25Hz,而我的笔记本电脑上的代码降到了20Hz) 我怎样才能强迫它继续以正确的速度运行?我用示波器检查了输出,send_brk和send_dmx功能似乎在程序节流时也能正常运行,所以我认为这不是问题所在 do

我有下面的循环,它应该以略高于40Hz的频率运行(每次运行之间24毫秒)。它在几秒钟到几分钟内工作得很好,但在没有明显原因(至少我不这么认为)的情况下,它会下降到20Hz

我曾尝试在洋葱欧米茄2(运行openwrt)和ubuntu笔记本电脑上运行代码,结果相同。(omega2上的代码降到了25Hz,而我的笔记本电脑上的代码降到了20Hz)

我怎样才能强迫它继续以正确的速度运行?我用示波器检查了输出,send_brk和send_dmx功能似乎在程序节流时也能正常运行,所以我认为这不是问题所在

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;
}