问题很难看清,因为很难用一行来描述一个问题,所以就到这里了。
我在Raspberry Pi上使用Debian来运行PID调节器,这意味着每次计算PID输出时都会获得dt(循环执行之间的时间差)。
基本上dt是这样计算的。

    oldtime_ = time_;
    clock_gettime(CLOCK_MONOTONIC, &time_);
    Timer.dt = ((static_cast<int64_t>(time_.tv_sec) * 1000000000 + static_cast<int64_t>(time_.tv_nsec)) - (static_cast<int64_t>(oldtime_.tv_sec) * 1000000000 + static_cast<int64_t>(oldtime_.tv_nsec))) / 1000000000.0;

PID大约每秒更新400次,并且效果很好,但是Linux有时会决定花更多的时间来执行操作。结果是大量的dt,例如,不是1/400 = 0.0025,而是0.8,这是所需数量的320倍。
结果是PID的计算不正确。看起来像这样。

我很想知道如何使树莓派更接近实时系统的答案。

编辑

谢谢,anaken78和任何帮助过的人。使用RR_FIFO计划可以完美地工作,处理速度始终在380-400hz之间。

最佳答案

我假设您使用的是原始Raspberry pi,而不是Raspberry pi2。原始Raspberry pi的问题在于它使用的是单核ARM11 cpu,这实际上意味着绑定(bind)了任何类型的RT计算(您的操作方式)由于硬件中断而出现错误。例如,通过Wifi传输的数据包可能会中断您的系统,从而导致问题。

如果没有网络连接,如果没有问题,您可以尝试做的一件事是增加进程优先级,并关闭wifi和eth接口(interface)。我想,这些是异步中断的主要来源,这些异步中断可能最终会破坏您的流程执行。还会有其他中断继续触发,您可以查看/proc/interrupts和/proc/softirq来了解中断触发的方法,但是在树莓派之类的平台中,它们应该是周期性的(定时器),否则它们会被触发。生命周期很短(例如USB中断)不会导致过程延迟,仅为几毫秒。

关于c++ - 如何限制Linux采取行动的时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29061824/

10-11 16:55