问题标签 [preempt-rt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1268 浏览

c - 如何在实时 Linux 中的进程之间进行通信?

FSMLabs 有很多如何为 RT-Linux 编写实时代码的例子,但是这个发行版在很多年前就被放弃了。目前,针对 vanilla 内核的 PREEMPT_RT 补丁正在积极开发中,但官方 Wiki 上的代码示例很少。首先介绍一下我的问题。

我正在编写一个包含 2 个程序的项目:

  1. 字节码虚拟机 - 它必须作为实时应用程序工作 - 它有 64 KB 的 I/O 内存和 64 KB 的字节码。
  2. 客户端程序——它将读取和写入 I/O 内存、启动/暂停机器、加载新程序、设置参数等。它不必是实时的。

如何在这些进程之间进行通信以保持进程(1)实时并避免页面错误或其他可能干扰实时应用程序的行为?

方法 1. 仅使用线程

有2个线程:

  • 具有最高优先级的虚拟机线程

  • 与用户和机器通信的具有正常优先级的客户端线程 两个线程都可以按名称访问所有全局变量。我可以在每个机器周期后为传入/传出数据创建额外的缓冲区。但是,如果客户端线程导致应用程序崩溃,机器线程也会终止。实现远程访问也更加困难。

方法 2. 共享内存

在旧的 FSMLabs 中,建议在进程之间使用共享全局内存。现代 PREEMPT_RT 的 Wiki 页面建议使用 mmap() 进行进程数据共享,但在同一篇文章中,由于页面错误,它不鼓励 mmap()。

方法 3. 命名管道

这是在进程之间进行通信的更灵活的方式。但是,我是 Linux 编程的新手。我们希望在机器和客户端之间共享内存,但它还应该提供一种加载新程序(文件路径或程序代码)、停止/启动机器等的方法。旧 FSMLabs RT-Linux 实现了自己的 FIFO 队列(命名管道)。现代 PREEMPT_RT 没有。使用名称管道会破坏实时行为吗?如何正确地做到这一点?我应该使用 O_NONBLOCK 标志读取数据还是创建另一个线程来从/向管道读取/写入数据?

您是否知道在一个进程必须是实时的进程之间进行通信的其他方式?也许我只需要线程。但是,考虑更多客户端连接到虚拟机进程的场景。

0 投票
2 回答
731 浏览

linux - 使用带有 RT-PREEMPT 内核的 BCM2835

我正在制作一个从天线发出 40khz 信号的项目。我发现信号不太准确,所以我决定尝试实时内核。

我在我的 Raspberry-Pi 2B 上运行 Raspbian Jessie。全新安装后,脚本运行没有任何问题。bcm2835_delayMicroseconds 可以运行。

我按照本教程http://www.frank-durr.de/?p=203编译并安装了 RT 内核。但是,该脚本无法再成功运行。在显示“HIGH SLEEP”后,它被搁置了。

这是代码片段:

编译内核时我错过了什么吗?

0 投票
1 回答
919 浏览

c - 在实时嵌入式 Linux 中记录数据时出现延迟峰值

我有一个机器人在 Beaglebone Black 上的 PREEMPT-RT 修补 Linux 操作系统上运行具有实时优先级的控制代码。所有代码都是用 C 语言编写的,运行频率为 500Hz。

在运行代码时,我经常注意到几百毫秒范围内的延迟,并且我已经将其跟踪到我编写的数据记录功能。这种延迟导致我的机器人控制失败,因为我有很多取决于实时功能。

代码的相关部分如下。为了清楚起见,我已经削减了很多代码,但如果需要任何内容​​,我会编辑这篇文章。

我需要以良好的速率(可能是 100-125Hz)记录来自多个变量(可能是 20-50)的数据。不需要以控制速率(每 2 毫秒)记录数据,但我已将其降低到 12 毫秒,并且每隔几分钟我仍然会看到延迟峰值。

延迟可能是fprintf呼叫的问题。这是 BeagleBone Black、我的代码的限制,还是仅仅是数据记录的性质?

这里问了一个类似的问题,但似乎没有解决我的问题:Finding latency issues (stalls) in Embedded Linux systems

0 投票
1 回答
3427 浏览

real-time - 使用 PREEMPT_RT 构建 RT 应用程序

我想在使用实时 PREEMPT_RT 的同时编写实时 Linux 程序。我找到了官方 Wiki ( https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application )。有一些代码示例,但我想了解可能的 RT 功能。

谢谢,

0 投票
0 回答
438 浏览

xenomai - 比较不同的实时 Linux 解决方案(PREEMPT_RT、Xenomai、Ubuntu 低延迟等)

我如何比较不同的实时 Linux 解决方案(PREEMPT_RT、Xenomai、Ubuntu 低延迟等)?我正在为 PREEMPT_RT 使用 rt-tests(和 cyclictest)。我将 Lachesis 测试套件作为一个选项阅读。什么是有效的测试套件?

谢谢,

0 投票
1 回答
188 浏览

c++ - 将手工系统移植到 libcaf

我目前有一个使用手工演员的应用程序。我的计划是将它移植到 libcaf。

当前状态是:我有一个大的全局消息队列,我的系统(又名演员)订阅以获取他们的消息。他们用消息响应该全局队列。

整个系统是一个运行在Linux rt-preempt 内核上的实时应用程序。GUI 线程本身就是一个系统(演员),但它不在 RT 优先级上。

现在我的系统不需要知道他们的消息的接收者,因为接收者注册了他们想要的。

我的移植想法如下:我使用一个全局actor来代替我的全局消息队列,它处理消息的注册。这样,我可以获得一个简单的消息日志以用于调试目的,并且我不需要让所有参与者都知道所有可能的目标。

我有一个处理与现实世界的联系的 IO 系统(canbus)。

在我当前的系统中,我生成了 GUI 线程 + 系统。它等待 RT 初始化。生成 gui 线程后,我切换到 RT Preempt 优先级并创建其他系统,预先设置堆栈等等。一切都设置好后,我通知 gui RT 已启动。现在我的系统已初始化。

当一些致命的事情发生或系统需要关闭时,我发送一条消息,所有系统都关闭,所有线程都加入。

我的问题是:如何将 GUI 角色/线程与 libcaf 中的 RT 线程分开?您会建议在单独的过程中分叉 GUI 吗?我可以在不同的 RT 优先级线程上生成演员吗?

编辑:我找到了spawn选项detached。生成的演员(分离演员的孩子)是否在同一个线程上?

0 投票
0 回答
176 浏览

linux - PREEMPT RT 内核 3.10.103-rt114 上的超线程关闭

我有一个与内核编译相关的问题,在成功编译并重新启动后,超线程选项丢失。我正在尝试使用 PREEMPT RT 内核更新我的 Cent OS 7 vanilla 内核。

这是我第一次使用内核进行试验或实验。

默认内核具有版本:- 3.10.0-123.el7.x86_64 将其替换为:- 3.10.103-rt114

在下图中的默认内核上,我可以看到使用 i7z 工具启用了 HT,并且 lscpu 说 Nodes 2 and cores = 16

默认内核

但在 RT 内核 HT 上关闭 lscpu 表示显示节点 1 和核心 8。

实时内核

请帮助我希望 RT 与 HT 一起运行,并且需要更多帮助。我已经多次编译 RT 内核,因此有很多 emtries 作为“旧”。也帮我删除这些。

0 投票
0 回答
1063 浏览

c - 检查 Linux 内核是否实时

我已经安装了带有 rt 补丁的 Linux 内核 4.6,在 uname -a 之后它显示 rt 和 PREEMPT 但我必须通过编写应用程序来证明,所以我有如下想法。我会让睡眠五毫秒唤醒并检查硬件时间并存储在一个数组中,现在我只检查硬件时间的差异,如果它是实时的,它应该是相同的,现在执行大约 50 次。所以我需要知道它是否正确的方法和实施它的技巧。提前感谢任何帮助都会很棒。

这是我的代码 /* 使用“gcc -o swave swave.c -lrt -Wall”编译 */

0 投票
0 回答
470 浏览

linux-kernel - 如何在物联网应用程序的 preempt-rt 和 non-preempt-rt linux 内核之间进行选择?

我正在开发一个物联网项目,我必须在linux kernel 4.8 preempt-rt或之间做出选择non-preempt-rt。快速运行 Linux RT 基准测试:

cd /usr/lib/rt-tests/ptest/rt_bmark.py

基本上运行

cyclictest -S -p 99 -q -i 100 -d 20 -l 30000

导致以下结果:

  1. 对于preempt-rt

6:12:51: Cyclictest completed. Actual execution time:0:01:38 Min: 3 us Avg: 6.0 us Max: 61 us Max list: [12, 13, 15, 22, 22, 61] PASS

  1. 对于non-preempt-rt

5:56:42: Cyclictest completed. Actual execution time:0:01:38 Min: 3 us Avg: 5.0 us Max: 2025 us Max list: [11, 16, 22, 46, 207, 2025] PASS

结果显然诱使我使用prempt-rt内核,因为两者之间的最大延迟存在压倒性差异。

我想知道这是否足以在两者之间做出决定?提前致谢!

0 投票
1 回答
457 浏览

linux - Linux 内核 4.11 的 RT_PREEMPT 补丁何时发布

linux kernel 4.11的RT_PREEMPT补丁什么时候发布,最新的稳定Linux Kernel?

我知道我可以在主线 Linux 内核中启用 CONFIG_PREEMPT,但是这个主线 PREEMPT 和 RT_PREEMPT 补丁有什么区别?后者做得更好吗?