- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个具有多个多线程进程的稍微复杂的软件。因为其中一个我需要实时功能(基本上是为了稳健性),所以我为 Xenomai 修补了我的目标内核,并使用 Xenomai 的 native 皮肤对其进行了编程。
现在我需要连接两个进程:一个运行实时任务,另一个运行简单的pthreads(后者编译时没有使用 Xenomai 的实时库/皮肤) .
我的问题是:我能以某种方式传达它们吗?例如,我是否可以创建一个共享内存对象 (shm_open
) 并共享互斥体,即使其中一个在 RT 环境中?
最佳答案
我建议你使用Xenomai原生API来创建命名管道,例如rt_pipe_create()
等。
您还可以使用一件事:消息队列。然而,我总是选择命名管道而不是消息队列。
共享内存和消息队列都可以用来在进程间交换信息。区别在于它们的使用方式。
共享内存正是您所想的那样:它是一个可以由多个进程读取和写入的存储区域。它不提供内在的同步;换句话说,由程序员来确保一个进程不会破坏另一个进程的数据。但它在吞吐量方面是高效的:读取和写入是相对较快的操作。
消息队列是一个单向管道:一个进程写入队列,另一个进程按写入顺序读取数据,直到出现数据结束条件。创建队列时,会设置消息大小(每条消息的字节数,通常相当小)和队列长度(待处理消息的最大数量)。访问比共享内存慢,因为每个读/写操作通常是一条消息。但是队列保证每个操作要么成功处理整个消息,要么在不改变队列的情况下失败。因此,写入者永远不会在仅写入部分消息后失败,而读取器要么检索到完整消息,要么什么也得不到。
本质上,管道——无论是命名的还是匿名的——都像消息传递一样使用。有人向收件人发送一条信息,收件人可以收到。共享内存更像是发布数据——有人将数据放在共享内存中,而读者(可能很多)必须使用同步,例如通过信号量了解有新数据的事实,并且必须知道如何读取内存区域以查找信息。
使用管道,同步很简单,并且内置于管道机制本身 - 当发生有趣的事情时,您的读取和写入将卡住和解冻应用程序。使用共享内存,可以更轻松地异步工作并偶尔检查一次新数据——但代价是代码要复杂得多。另外,您可以获得多对多的通信,但它又需要更多的工作。此外,由于上述原因,调试基于管道的通信比调试共享内存更容易。
一个小的区别是 fifos 在文件系统中是直接可见的,而共享内存区域需要特殊的工具,如 ipcs 来管理它们,以防你,例如,创建一个共享内存段,但您的应用程序死机并且不会自行清理(信号量和您可能需要与共享内存一起使用的许多其他同步机制也是如此)。
共享内存还可以让您更好地控制缓冲和资源使用 - 在操作系统允许的限制内,您可以决定分配多少内存以及如何使用它。使用管道,操作系统会自动控制一切,因此您再次失去了一些灵 active ,但减轻了很多工作。
最重要的几点总结:用于一对一通信的管道,更少的编码和让操作系统处理事情,多对多的共享内存,更多的手动控制,但代价是更多的工作和更努力调试
关于我可以从 Xenomai 实时任务访问非 RT 共享内存对象和互斥量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19842860/
这里遇到一个特殊问题。 我正在尝试编译这段代码 https://github.com/severinson/VLC-driver在 Raspberry PI 3 上(使用 xenomai v3.0.3
我编写了一个用户空间应用程序。当我运行 fd = rt_dev_open("/dev/ttyACM0"); 时,出现错误。它说没有这样的设备。但是当我使用 POSIX open() 函数时,它工作得很
我正在创建一个周期线程,它在模拟输出上输出方波信号。我正在使用来自 Xenomai API 的 Posix Skin 和 Analogy。 我使用示波器测试了我的代码的实时性能,并查看了方波信号(频率
我是 Xenomai 的新手,我想测量两点之间的时间。 我想先发送一个 10µs 的脉冲。之后,我等到有中断。 我想测量脉冲和中断之间的时间。我使用“rtmd_clock_read()”函数。所以它返
我需要比较 preempt_rt 补丁、Xenomai 和 RTAI 之间的性能。他们每个人都有自己的基准测试,但没有给出相似的结果,并且并非所有基准测试都适用于所有三个平台。我正在寻找的是一个基准测
我正在编写一个具有多个多线程进程的稍微复杂的软件。因为其中一个我需要实时功能(基本上是为了稳健性),所以我为 Xenomai 修补了我的目标内核,并使用 Xenomai 的 native 皮肤对其进行
我尝试在 xenomai-x.x/examples/rtdm/deriver-api/下运行 tut01-sculpt-derv.c 示例。我运行 makefile 没有错误。 tut01-骨骼-de
我正在运行一个有时需要调用 gettimeofday() 的 Xenomai 实时线程,以便根据 ptpd 找出当前时间。 但是,这样做似乎不安全:特别是,它偶尔会使 Xenomai 线程和 Linu
我想在指定负载下使用延迟测试来测试 Xenomai 功能,但是当我尝试执行命令时出现以下错误。 # ./latency -p 100 sh: ./latency command not found 该
我正在 Xenomai 中测试 POSIX 皮肤。我正在尝试从 Raspberry Pi 上的一些 GPIO 读取和写入,当我执行程序时,上下文切换的次数越来越多(在/proc/xenomai/sta
我是 Xenomai 的新手,所以如果我的问题很愚蠢,请原谅我 我已经使用命令在我的 ubuntu 11.04 中安装了 xenomai 2.4.8 apt-get install libxenoma
我需要在我的 x86 平台上使用 linux 中的上下文切换,类似于 ucontext.h, 但不幸的是,ucontext 使用内核调用来完成它。在我的 Xenomai 环境中,任何内核函数调用都会将
/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld: cannot find -lrtdk 我在 ld
我想在 Ubuntu 16.04 LTS 上安装 Xenomai 3。 我无法找到任何合适的安装指南/程序。 请求帮助。 最佳答案 安装钴芯的注意事项 1)下载Ubuntu 16.04.1(v4.4内
这三种实时操作系统框架、扩展或补丁有何区别、优缺点? 我想测量一个 CPU 时间戳计数器 (TSC),每次发送或接收 Wifi 数据帧或确认帧时的时间(以纳秒为单位)。 我意识到需要三种实时技术中的一
我正在使用 buildroot 在内核版本 3 上构建 Xenomai 2。 Buildroot 完成了。现在我试图用“make”命令编译它。当我尝试使用“make”命令进行编译时,它似乎失败了:目标
我是一名优秀的程序员,十分优秀!