首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >linux和多核系统实时周期任务(< 1ms)的最佳实践

linux和多核系统实时周期任务(< 1ms)的最佳实践
EN

Stack Overflow用户
提问于 2022-08-21 05:28:03
回答 1查看 203关注 0票数 2

我用Linux作为操作系统的四核嵌入式计算机来控制机器人系统.

这个项目基本上是用C++编写的多线程单进程程序.

以下是一些背景和要求;

  • 的一些任务(信号处理和硬件通信)需要一些严格的“实时”操作。运行周期为500 is或1000 is (configurable)
  • The计数器,即所谓的“硬实时HW”(有指定DSP的一个)
  • 偶尔缺失1~2个周期(可能是由于抖动),偶尔会导致系统operation.
  • Missing 3~9周期几乎不明显的下降,偶尔会导致系统性能相当明显的下降,但fatal.
  • Missing >10周期至少会导致整个系统停止,并被认为是致命的主要malfunction.

我心目中的解决办法是下面的组合。

threads'.

  • Set

  • 将“实时操作”所需的所有功能都放在一个线程中,并使其成为“实时线程”.

  • 将其他函数放在一个或两个线程中,并使其“实时线程的非实时

  • sched_priority”约为95.

  • 通过操纵所有默认linux服务的CPU亲和力以使用‘实时内核’和设置‘实时线程’的线程CPU亲缘关系来进行实时操作。要使用空闲的实时内核(使关键任务得到最小的interference).

  • Inter-thread通信),将使用std::atomic变量进行内存顺序、releaseacquire,但最小化。

这是申请的好做法吗?还有其他更稳定运作的做法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-24 13:47:52

如果您需要您的1ms周期进程具有非常低的抖动,您就不能完全依赖系统定时器。不管是不是,抖动都会很大。

唯一合理的方法是做以下工作(这是机器人技术和低延迟财务应用的典型方法):

将一个中央处理器核心(isolcpus=...)

  • Build内核隔离为具有NOHZ_FULL支持的nohz_full内核,为隔离的CPU核心

  • 配置rcu_nocbs设置nohz_full。

  • 使用sched_setaffinity(...)将您的进程绑定到所选的独立CPU

  • --使用sched_setscheduler(...)为该进程设置SCHED_FIFO策略(或任何其他实时调度策略),它将告诉内核实际重新划分此核心的NOHZ_FULL设置)。

  • 您必须只有一个进程运行在该核心

  • 上,在该实时进程中不使用任何系统调用,系统调用会导致上下文切换,这是您必须不惜一切代价避免的。

  • 使用繁忙的等待旋转,您需要等待一个偶数或一段时间。不要使用系统调用来睡觉。您的CPU负载必须始终保持在100%的

  • 上,使用实时进程和非实时支持

  • 之间的无锁通信,同时要考虑到DDR延迟

  • ,确保您在实时进程循环中所做的一切都在此1ms超时之前终止。

这样,您将有一个亚微秒抖动,只要您的系统中的其他核心或设备不阻塞总线太多。

请记住,这个过程中的I/O必须完全在用户空间中。您应该尽量避免使用系统调用来与外围设备对话。在某些情况下,您可以直接写入设备的控制寄存器,并使用DMA将数据从它们中提取出来(也就是说,只需将驱动程序功能从内核转移到用户空间即可)。如果您的外围设备依赖于中断,则会更复杂。一个理想的实现是如果您使用的是FPGA SoC (如Xilinx UltraScale+或Intel Cyclone等)--您可以实现您自己的I/O外围设备,这些外围设备仅通过寄存器和DMA进行通信,并且不需要中断。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73431869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档