我用Linux作为操作系统的四核嵌入式计算机来控制机器人系统.
这个项目基本上是用C++编写的多线程单进程程序.
以下是一些背景和要求;
。
我心目中的解决办法是下面的组合。
threads'.
sched_priority”约为95.
std::atomic变量进行内存顺序、release和acquire,但最小化。。
这是申请的好做法吗?还有其他更稳定运作的做法吗?
发布于 2022-08-24 13:47:52
如果您需要您的1ms周期进程具有非常低的抖动,您就不能完全依赖系统定时器。不管是不是,抖动都会很大。
唯一合理的方法是做以下工作(这是机器人技术和低延迟财务应用的典型方法):
将一个中央处理器核心(isolcpus=...)
sched_setaffinity(...)将您的进程绑定到所选的独立CPU
sched_setscheduler(...)为该进程设置SCHED_FIFO策略(或任何其他实时调度策略),它将告诉内核实际重新划分此核心的NOHZ_FULL设置)。
。
这样,您将有一个亚微秒抖动,只要您的系统中的其他核心或设备不阻塞总线太多。
请记住,这个过程中的I/O必须完全在用户空间中。您应该尽量避免使用系统调用来与外围设备对话。在某些情况下,您可以直接写入设备的控制寄存器,并使用DMA将数据从它们中提取出来(也就是说,只需将驱动程序功能从内核转移到用户空间即可)。如果您的外围设备依赖于中断,则会更复杂。一个理想的实现是如果您使用的是FPGA SoC (如Xilinx UltraScale+或Intel Cyclone等)--您可以实现您自己的I/O外围设备,这些外围设备仅通过寄存器和DMA进行通信,并且不需要中断。
https://stackoverflow.com/questions/73431869
复制相似问题