vxWorks环境下RTP与DKM跨模块数据共享方案咨询
VxWorks跨DKM/RTP模块的数据共享方案
针对你提到的VxWorks下不同模块(DKM与DKM、RTP与RTP、DKM与RTP)的实时数据共享需求,结合你排除Socket(延迟高)、消息队列无ftok的情况,以下是可行的落地方案:
一、两个DKM模块间的数据共享
DKM运行在Kernel空间,权限无隔离,可直接使用内核级共享机制:
- 全局内存块:在任一DKM中通过
malloc()或memPartAlloc()分配内存,通过头文件导出内存地址(或定义全局变量),其他DKM编译时引用该头文件即可直接访问。注意用semMCreate()创建互斥信号量,保证并发读写安全。 - 内核消息队列:无需ftok,团队提前约定一个固定的全局密钥(比如定义宏
MSGQ_KEY_MODULE_COMM = 0x123456),所有DKM用该密钥调用msgQCreate(),即可访问同一个队列。也可以在一个DKM中创建队列后,将队列ID通过全局变量导出给其他DKM使用。
二、两个RTP模块间的数据共享
RTP是隔离的用户空间进程,需用跨进程的共享机制:
- 共享内存分区:通过
rtpMemPartCreate()创建带名称的共享内存分区(比如"/shared_part_ctrl"),两个RTP都用该名称调用rtpMemPartAttach()挂载分区,之后在分区内分配内存实现数据共享。配合semOpen()创建命名互斥信号量(比如"/sem_shared_ctrl")做同步,信号量名称提前约定。 - 命名消息队列:VxWorks RTP支持命名消息队列,用
msgQOpen()指定约定好的队列名称(比如"/msgq_rtp_data"),两个RTP分别以读写/只读方式打开,无需密钥,直接通过名称关联队列。
三、DKM与RTP模块间的数据共享
跨内核/用户空间场景,需兼顾隔离性与实时性:
- 内核内存映射:在DKM中用
memPartAlloc()分配内核内存,通过rtpMemMap()将该内存块映射到目标RTP的地址空间。DKM与RTP提前约定内存的起始地址、大小,配合命名信号量(DKM用semMCreate()创建,RTP用semOpen()打开同名信号量)做同步。 - 内存命名管道:VxWorks的命名管道基于内存实现,延迟远低于Socket。DKM与RTP都通过
pipeOpen()打开同一个命名管道(比如"/pipe_dkm_rtp"),实现双向低延迟数据传输。 - 信号触发式共享内存:如果是DKM主动推送数据,可在DKM中注册数据就绪回调,当数据更新时通过
rtpSignalSend()向RTP发送信号,RTP收到信号后直接读取预先映射好的共享内存数据,这种方式延迟极低。
补充:关于消息队列无ftok的解决方案
VxWorks不需要动态生成密钥,团队提前约定固定密钥值或命名是最直接的替代方案,所有模块统一使用约定值/名称,即可保证访问同一个队列,完全满足跨模块消息传递需求。
内容的提问来源于stack exchange,提问作者Dark Sorrow
相关产品推荐
相关产品推荐

