问题标签 [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.
c - 如何在实时 Linux 中的进程之间进行通信?
FSMLabs 有很多如何为 RT-Linux 编写实时代码的例子,但是这个发行版在很多年前就被放弃了。目前,针对 vanilla 内核的 PREEMPT_RT 补丁正在积极开发中,但官方 Wiki 上的代码示例很少。首先介绍一下我的问题。
我正在编写一个包含 2 个程序的项目:
- 字节码虚拟机 - 它必须作为实时应用程序工作 - 它有 64 KB 的 I/O 内存和 64 KB 的字节码。
- 客户端程序——它将读取和写入 I/O 内存、启动/暂停机器、加载新程序、设置参数等。它不必是实时的。
如何在这些进程之间进行通信以保持进程(1)实时并避免页面错误或其他可能干扰实时应用程序的行为?
方法 1. 仅使用线程
有2个线程:
具有最高优先级的虚拟机线程
与用户和机器通信的具有正常优先级的客户端线程 两个线程都可以按名称访问所有全局变量。我可以在每个机器周期后为传入/传出数据创建额外的缓冲区。但是,如果客户端线程导致应用程序崩溃,机器线程也会终止。实现远程访问也更加困难。
方法 2. 共享内存
在旧的 FSMLabs 中,建议在进程之间使用共享全局内存。现代 PREEMPT_RT 的 Wiki 页面建议使用 mmap() 进行进程数据共享,但在同一篇文章中,由于页面错误,它不鼓励 mmap()。
方法 3. 命名管道
这是在进程之间进行通信的更灵活的方式。但是,我是 Linux 编程的新手。我们希望在机器和客户端之间共享内存,但它还应该提供一种加载新程序(文件路径或程序代码)、停止/启动机器等的方法。旧 FSMLabs RT-Linux 实现了自己的 FIFO 队列(命名管道)。现代 PREEMPT_RT 没有。使用名称管道会破坏实时行为吗?如何正确地做到这一点?我应该使用 O_NONBLOCK 标志读取数据还是创建另一个线程来从/向管道读取/写入数据?
您是否知道在一个进程必须是实时的进程之间进行通信的其他方式?也许我只需要线程。但是,考虑更多客户端连接到虚拟机进程的场景。
linux - 使用带有 RT-PREEMPT 内核的 BCM2835
我正在制作一个从天线发出 40khz 信号的项目。我发现信号不太准确,所以我决定尝试实时内核。
我在我的 Raspberry-Pi 2B 上运行 Raspbian Jessie。全新安装后,脚本运行没有任何问题。bcm2835_delayMicroseconds 可以运行。
我按照本教程http://www.frank-durr.de/?p=203编译并安装了 RT 内核。但是,该脚本无法再成功运行。在显示“HIGH SLEEP”后,它被搁置了。
这是代码片段:
编译内核时我错过了什么吗?
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
real-time - 使用 PREEMPT_RT 构建 RT 应用程序
我想在使用实时 PREEMPT_RT 的同时编写实时 Linux 程序。我找到了官方 Wiki ( https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application )。有一些代码示例,但我想了解可能的 RT 功能。
谢谢,
xenomai - 比较不同的实时 Linux 解决方案(PREEMPT_RT、Xenomai、Ubuntu 低延迟等)
我如何比较不同的实时 Linux 解决方案(PREEMPT_RT、Xenomai、Ubuntu 低延迟等)?我正在为 PREEMPT_RT 使用 rt-tests(和 cyclictest)。我将 Lachesis 测试套件作为一个选项阅读。什么是有效的测试套件?
谢谢,
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
。生成的演员(分离演员的孩子)是否在同一个线程上?
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 作为“旧”。也帮我删除这些。
c - 检查 Linux 内核是否实时
我已经安装了带有 rt 补丁的 Linux 内核 4.6,在 uname -a 之后它显示 rt 和 PREEMPT 但我必须通过编写应用程序来证明,所以我有如下想法。我会让睡眠五毫秒唤醒并检查硬件时间并存储在一个数组中,现在我只检查硬件时间的差异,如果它是实时的,它应该是相同的,现在执行大约 50 次。所以我需要知道它是否正确的方法和实施它的技巧。提前感谢任何帮助都会很棒。
这是我的代码 /* 使用“gcc -o swave swave.c -lrt -Wall”编译 */
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
导致以下结果:
- 对于
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
- 对于
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
内核,因为两者之间的最大延迟存在压倒性差异。
我想知道这是否足以在两者之间做出决定?提前致谢!
linux - Linux 内核 4.11 的 RT_PREEMPT 补丁何时发布
linux kernel 4.11的RT_PREEMPT补丁什么时候发布,最新的稳定Linux Kernel?
我知道我可以在主线 Linux 内核中启用 CONFIG_PREEMPT,但是这个主线 PREEMPT 和 RT_PREEMPT 补丁有什么区别?后者做得更好吗?