当前位置: 首页 > news >正文

第 12 章:Linux 侧 RPMsg 用户态驱动与数据接口

通过前面几章,我们已经让 M33 在底层跑得飞快,数据也通过 HSEM 或 OpenAMP 顶到了 A35 的门口。现在,我们要解决 Linux 开发者最关心的问题:如何在应用层(User Space)优雅、稳定地拿到这些数据?

在 Linux 侧,我们通常不希望业务逻辑开发者去操作复杂的 VirtIO 寄存器,而是提供一个标准的字符设备节点(如/dev/rpmsg0)。


12.1 RPMsg 字符设备框架 (RPMSG_CHAR)

Linux 内核提供了一个专用的辅助驱动rpmsg_char,它能将 M33 侧定义的rpmsg-raw服务映射为文件描述符。

  • M33 侧:我们在第 10 章创建了名为"rpmsg-raw"的端点。

  • Linux 侧:内核检测到该名称后,会在/sys/class/rpmsg/下生成控制接口。


12.2 实战:在 Linux 终端手动激活端点

默认情况下,Linux 可能不会自动为每个端点创建/dev节点。我们需要在 Linux 启动后执行以下操作:

# 1. 找到 M33 对应的控制器目录
cd /sys/class/rpmsg/rpmsg_ctrl0

# 2. 创建一个本地端点,关联到 M33 的 "rpmsg-raw" 服务
# 格式:echo <name> <src_addr> <dst_addr>
echo "rpmsg-raw" > create_ept

# 3. 检查是否生成了设备文件
ls -l /dev/rpmsg0

12.3 深度实战:编写 Linux C 应用读取 IMU 数据

现在我们可以像读串口一样编写 C 语言程序。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main() {
int fd;
char buf[256];

/* 1. 打开 RPMsg 设备 */
fd = open("/dev/rpmsg0", O_RDWR);
if (fd < 0) {
perror("Open /dev/rpmsg0 failed");
return -1;
}

printf("Waiting for IMU data from M33...\n");

/* 2. 阻塞读取数据 */
while (1) {
int len = read(fd, buf, sizeof(buf) - 1);
if (len > 0) {
buf[len] = '\0';
/* 假设数据格式是第 10 章定义的 "ACC:x,y,z;GYRO:x,y,z" */
printf("M33 Data: %s\n", buf);
}
}

close(fd);
return 0;
}

12.4 进阶:如何处理二进制结构体?

字符串解析(sprintf/sscanf)非常耗费 CPU。在工业实战中,我们通常直接传递二进制 Raw Data

注意:M33 是 32 位,A35 是 64 位。虽然两者都是小端模式,但结构体对齐可能不同。

/* 在 M33 和 A35 之间必须严格共享的头文件定义 */
typedef struct __attribute__((packed)) {
uint32_t timestamp;
int16_t accel[3];
int16_t gyro[3];
uint16_t checksum;
} IMU_Frame_t;

/* A35 侧读取 */
IMU_Frame_t frame;
read(fd, &frame, sizeof(IMU_Frame_t));

12.5 异步监听:使用 poll 提高效率

如果你的 Linux 应用不仅要读 M33 数据,还要处理网络、GUI 任务,那么不能死等read

#include <poll.h>

struct pollfd fds[1];
fds[0].fd = fd;
fds[0].events = POLLIN;

if (poll(fds, 1, 1000) > 0) { // 1秒超时
if (fds[0].revents & POLLIN) {
read(fd, buf, sizeof(buf));
}
}

12.6 避坑指南:

  • 权限问题:默认情况下/dev/rpmsg0只有 root 权限。

    • 解法:编写udev规则,或者在启动脚本里chmod 666 /dev/rpmsg0

  • 缓冲区限制:RPMsg 默认单包上限通常是512 字节。如果你要传高清摄像头的一帧图像,必须分包,或者改用第 11 章的无锁队列(DDR 映射)。

  • 端点冲突:如果 Linux 端点名和 M33 端点名不一致,read将永远阻塞。


总结: 本章我们完成了核间通讯的最后一块拼图。现在,IMU 数据已经从传感器,经过 M33 的实时采集,穿过共享内存隧道,最终稳稳地出现在了 Linux 应用层的控制台上。

http://www.jsqmd.com/news/403935/

相关文章:

  • 唐山市跳汰机选型指南:2026年头部厂家综合评测榜单 - 2026年企业推荐榜
  • 第 11 章:HSEM 硬件信号量与无锁队列——解决优先级反转
  • 2026年温州水温传感器企业综合实力与选型指南 - 2026年企业推荐榜
  • 2026年安徽污水处理设备厂家公司权威推荐:医疗废水处理一体化设备、工业废水处理设备、广东废水处理、废水处理处理设备选择指南 - 优质品牌商家
  • 2026年评价高的污水处理设备厂家公司推荐:广东废水处理、废水处理处理设备、气浮机一体化污水处理设备、污水处理设备一体化处理设备选择指南 - 优质品牌商家
  • 厉害的路径!提示工程架构师实现Agentic AI与大数据结合的发展路径
  • 2026年一体化污水处理设备厂家最新推荐:陕西污水处理设备厂家/mbr一体化污水处理设备/mvr厂家/中水处理设备/选择指南 - 优质品牌商家
  • Power BI与Python结合:大数据分析新姿势
  • 2026年选矿设备直销厂商信誉评估与选购指南 - 2026年企业推荐榜
  • 移动开发中 Kotlin 的性能优化
  • 2026年污水处理设备厂家权威推荐榜:污水处理设备一体化处理设备、福建污水处理设备公司、陕西污水处理设备厂家、mbr一体化污水处理设备选择指南 - 优质品牌商家
  • 2026年福建污水处理设备公司厂家权威推荐榜:一体化污水处理成套设备/低温蒸发器/医疗废水处理一体化设备/广东废水处理/选择指南 - 优质品牌商家
  • 多云算力管理:AI应用架构师的实战经验
  • 2026年工业废水处理设备厂家权威推荐榜:医疗废水处理一体化设备、广东废水处理、废水处理处理设备、气浮机一体化污水处理设备选择指南 - 优质品牌商家
  • 树莓派gStream实现低延迟硬解推流
  • 前后端分离企业oa管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 跟思兼学Klipper(41):优化 KAMP 的自适应划线清除喷嘴残料
  • 【2025最新】基于SpringBoot+Vue的校园社团信息管理pf管理系统源码+MyBatis+MySQL
  • 大数据领域 Hive 入门指南:从基础到实战
  • 基于SpringBoot+Vue的企业资产管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 基于SpringBoot+Vue的web网上摄影工作室开发与实现pf管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • Java SpringBoot+Vue3+MyBatis 论坛网站系统源码|前后端分离+MySQL数据库
  • Ubuntu 的源代码
  • 2026年中水处理设备厂家权威推荐榜:福建污水处理设备公司、陕西污水处理设备厂家、mbr一体化污水处理设备、mvr厂家选择指南 - 优质品牌商家
  • 2026年废水处理设备厂家推荐:污水处理设备一体化处理设备/陕西污水处理设备厂家/mbr一体化污水处理设备/mvr厂家/选择指南 - 优质品牌商家
  • 意义的基建:智能时代“代码即意义”范式的落地路径与实践逻辑
  • 意义的基建:智能时代“代码即意
  • 2026年家用升降电梯厂家权威推荐榜:曳引电梯、液压电梯、网红电梯、自建房电梯、螺杆电梯、观光电梯、三层电梯、二层电梯选择指南 - 优质品牌商家
  • 年轻时迷死一大片男人的她,不结婚不生孩子,如今更是美得不像话
  • 2026年液压电梯厂家推荐:家装电梯、小型电梯、曳引电梯、网红电梯、自建房电梯、螺杆电梯、观光电梯、三层电梯、二层电梯选择指南 - 优质品牌商家