18.1 为什么需要通信?
先想一个问题。你在Android上点了个“导航”,这个指令要传给QNX去控制仪表盘显示。或者QNX检测到车门没关好,要通知Android弹个警告。这中间要是没有一套可靠的通信机制,整个座舱就乱套了。
我见过一些方案,直接用串口或者GPIO来传,那效率低得可怜。8155上,我们用的是更高级的手段。嗯,这里要注意,选哪种方式,取决于你的数据量大小和实时性要求。
18.2 rpmsg:轻量级消息通道
rpmsg,全称Remote Processor Messaging。它是基于virtio的一种简化实现。我个人习惯把它理解成“两个CPU之间的管道”。
在8155上,QNX跑在A核(应用处理器),Android其实也跑在A核,但通过虚拟化技术隔离了。rpmsg就是它们之间的一条专用通道。
核心特点:
- 轻量级,开销小
- 基于消息传递,不是流式数据
- 有固定的通道(channel)概念
我曾经在一个项目中,用rpmsg传一些控制指令,比如“切换驾驶模式”。数据量很小,就几个字节,但要求实时性高。rpmsg正好合适。
代码示例(QNX侧,创建rpmsg端点):
#include <rpmsg.h> // 创建rpmsg设备 rpmsg_device *rdev = rpmsg_create_device("virtio0", 0); if (!rdev) { // 处理错误 } // 创建端点,绑定回调 rpmsg_endpoint *ept = rpmsg_create_ept(rdev, "my_channel", 0, RPMSG_ADDR_ANY, my_callback, NULL); if (!ept) { // 处理错误 } // 发送消息 const char *msg = "switch_to_sport_mode";