use*_*123 5 c++ linux time real-time raspberry-pi
问题可能看起来很模糊,因为很难在一行中描述问题所以就这样了.我在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;
Run Code Online (Sandbox Code Playgroud)
PID每秒更新大约400次并且它很好,但有时Linux决定花费更多的时间来采取行动.结果是大量的dt,比如,不是1/400 = 0.0025而是0.8,这是所需的320倍.结果是PID的计算不正确.看起来像这样.

我很乐意回答如何将raspbian移动到更接近实时系统的位置.
编辑
谢谢,anaken78和任何帮助过的人.使用RR_FIFO计划工作完美,处理速度始终为380-400hz.

我假设您使用的是原始 Raspberry pi,而不是 Raspberry pi 2。原始 Raspberry pi 的问题是它使用单核 ARM11 cpu,这实际上意味着任何类型的 RT 计算(您所做的方式)都受到限制由于硬件中断而出现错误。例如,通过 Wifi 传送的数据包可能会中断您的系统,从而导致问题。
如果您不介意没有网络连接,您可以尝试的一件事是提高进程优先级并关闭 wifi 和 eth 接口。我想说,这些是异步中断的主要来源,最终可能会中断进程的执行。还会有其他中断不断触发,您可以查看 /proc/interrupts 和 /proc/softirq 以了解中断触发的情况,但在像树莓派这样的平台中,它们应该是周期性的(计时器),否则它们将非常短暂的事件(例如 USB 中断)不应导致进程延迟几毫秒。