RTOS基础 -- NXP M4小核的RPMsg-lite与端点机制回顾

news2025/4/11 0:37:59

一、RPMsg-lite与端点机制回顾

在RPMsg协议框架中:

  • Endpoint(端点) 是一个逻辑通信端口,由本地地址(local addr)、远程地址(remote addr)和回调函数组成。
  • 每个消息都会发送到特定的端点地址,端点负责接收并处理对应地址的消息。
  • rpmsg-lite库提供了轻量级API用于RTOS或裸机端实现,降低资源占用。

RPMsg端点创建的一般步骤为:

  • 创建端点(提供本地地址、回调函数)。
  • 向名字服务注册端点名(可选)。
  • 通知远端核自动完成绑定。

二、rpmsg_lite_create_ept的详细实现

函数原型与含义:

struct rpmsg_lite_endpoint *rpmsg_lite_create_ept(
    struct rpmsg_lite_instance *rpmsg_dev,   // rpmsg-lite 实例
    uint32_t addr,                           // 本地端点地址(可以填 RPMSG_ADDR_ANY 自动分配)
    rpmsg_ept_rx_cb_t rx_cb,                 // 消息接收回调函数
    void *rx_cb_data                         // 回调函数用户数据(上下文)
);

执行流程与机制:

1. 创建端点结构体(endpoint):

  • 在内部分配一个struct rpmsg_lite_endpoint,包含端点地址、本地回调函数、回调数据等:
struct rpmsg_lite_endpoint {
    struct rpmsg_lite_instance *rpmsg_dev;
    uint32_t addr;               // 本地地址
    rpmsg_ept_rx_cb_t cb;        // 回调函数
    void *cb_data;               // 回调数据
    struct rpmsg_lite_endpoint *next;
};

2. 地址分配机制:

  • 如果用户指定地址为RPMSG_ADDR_ANY (0xFFFFFFFF),RPMsg-lite会自动从地址池分配未占用的地址。
  • 如果指定了明确地址,则直接使用该地址。

3. 回调函数的注册:

  • 接收到的消息会通过RPMsg-lite库的中断/virtqueue机制接收后,解析目标地址,将消息分发给对应端点,调用注册的回调函数:
// 接收消息流程示意
rpmsg_rx_callback(endpoint, payload, payload_len, src_addr);

实例代码示例:

// 创建端点示例
struct rpmsg_lite_endpoint *my_ept = rpmsg_lite_create_ept(
    rpmsg_instance, 
    RPMSG_ADDR_ANY,       // 自动地址分配
    my_endpoint_rx_cb,    // 回调函数
    NULL                  // 回调上下文
);

三、rpmsg_ns_announce实现详解(名字服务机制)

RPMsg名字服务用于远端核自动发现端点并建立端到端通信通道。

函数原型与含义:

int32_t rpmsg_ns_announce(
    struct rpmsg_lite_instance *rpmsg_lite_dev, 
    struct rpmsg_lite_endpoint *new_ept, 
    const char *ept_name, 
    uint32_t flags
);
  • rpmsg_lite_dev:RPMsg实例句柄。
  • new_ept:需要注册的端点句柄。
  • ept_name:端点名称,远端用此名称发现服务。
  • flags:标志位,目前通常为0。

内部实现流程:

rpmsg_ns_announce本质是向一个特殊端点(地址为RPMSG_NS_ADDR=53)发送一个特殊消息,这个消息称为名字服务公告消息(announce)

消息结构定义为(伪代码):

struct rpmsg_ns_msg {
    char name[32];       // 端点名
    uint32_t addr;       // 端点地址
    uint32_t flags;      // 属性标记
};

发送方式:

  • nameaddrflags组成payload,发送到特殊端点(地址53)。
  • 远端的RPMsg名字服务(Linux端的rpmsg_core、rpmsg_ctrl)会监听地址53的消息,收到此消息后自动执行相应端点绑定和设备节点创建操作。

示例:

// 发送名字服务公告消息
rpmsg_ns_announce(rpmsg_instance, my_ept, "rpmsg-channel-1", 0);

四、协议交互过程详细示意图解

RTOS/裸机端(M4)与Linux端(A53)交互过程如下:

M4端                                 共享内存(VRing)                           Linux端
 |                                        |                                          |
rpmsg_lite_create_ept(...)                |                                          |
 +--创建端点,自动分配地址                |                                          |
 |                                        |                                          |
rpmsg_ns_announce(...)                    |                                          |
 +---向RPMSG_NS_ADDR发送端点公告--------->|                                          |
 |                                        |--------VRing传输名字服务消息----------->|
 |                                        |                                          |
 |                                        |                                Linux RPMsg Core
 |                                        |                                          |
 |                                        |<-----接收到名字服务公告(端点名+地址)--+
 |                                        |                                          |
 |                                        |----自动创建/dev/rpmsgX设备文件(rpmsg_char)
 |                                        |                                          |
 |                                        |                                          |
 |                                        |                                          |
 |<---远端核打开/dev/rpmsgX,并绑定到端点地址------| 
 |                                        |                                          |
 |<-------远端通过/dev/rpmsgX发送消息到地址(端点)|
 |                                        |                                          |
my_endpoint_rx_cb(...)                    |                                          |
 +----回调被调用,处理接收到的消息         |                                          |

五、关键注意事项与高级技巧:

  • 自动绑定机制
    名字服务公告消息本质是一种特殊的RPMsg消息,因此远端核必须启动RPMsg Core服务才能接收公告消息,实现自动绑定。

  • 多端点支持
    使用RPMsg-lite时可创建多个端点,每个端点可以独立注册名字服务,Linux端会对应创建多个/dev/rpmsgX设备节点。

  • 资源表配置
    resource_table中的VDEV资源定义了vring共享内存和VirtIO队列配置,必须与RPMsg-lite实例初始化参数保持一致。


六、小结与应用场景推荐

  • rpmsg_lite_create_ept负责本地端点的地址申请与回调注册。
  • rpmsg_ns_announce通过特殊消息完成远程核端点发现与自动设备绑定。

典型应用场景包括:

  • Linux核调用RTOS侧传感器数据采集。
  • M4核主动向Linux核推送实时数据。
  • 多核系统启动时自动建立通讯链路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

覆盖学术、职场、生活的专业计算工具

软件介绍 今天要给大家介绍一款超给力的工具软件——CalcKit 计算器。它就像是你口袋里的智能计算专家&#xff0c;轻松化解日常生活中的各类计算难题。无论是简单的数字加减乘除&#xff0c;还是复杂的专业运算&#xff0c;它都不在话下。 这款软件内置了极为强大的计算功能…

【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇

&#x1f525;&#x1f525;&#x1f525; 上期 《大模型基建工程&#xff1a;基于 FastAPI 自动构建 SSE MCP 服务器》中我们使用fastapi-mcp自动挂载fastapi到mcp工具&#xff0c;通过源码分析和实践&#xff0c;我们发现每次sse请求又转到了内部fastapi RESTful api接口&…

【python】Plot a Square

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 用 python 实现&#xff0c;以 A和B两个点为边长&#xff0c;方向朝 C 绘制正方形 思路&#xff1a; 计算向量 AB 和 AC。使用向…

实战打靶集锦-37-Wpwnvm

文章目录 1. 主机发现2. 端口扫描&服务枚举3. 服务探查4. 系统提权 靶机地址&#xff1a;https://download.vulnhub.com/wpwn/wpwnvm.zip 1. 主机发现 目前只知道目标靶机在192.168.37.xx网段&#xff0c;通过如下的命令&#xff0c;看看这个网段上在线的主机。 $ nmap -…

三、GPIO

一、GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口GPIO引脚电平&#xff1a;0V&#xff08;低电平&#xff09;~3.3V&#xff08;高电平&#xff09;&#xff0c;部分引脚可容忍5V 容忍5V&#xff0c;即部分引脚输入5V的电压&#xff0c;…

混杂模式(Promiscuous Mode)与 Trunk 端口的区别详解

一、混杂模式&#xff08;Promiscuous Mode&#xff09; 1. 定义与工作原理 定义&#xff1a;混杂模式是网络接口的一种工作模式&#xff0c;允许接口接收通过其物理链路的所有数据包&#xff0c;而不仅是目标地址为本机的数据包。工作层级&#xff1a;OSI 数据链路层&#x…

[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子

目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力&#xff0c;碰到一个新题的时候&#xff0c;可以往之前做过的题方向靠&#xff01; 打家劫舍问题模型: 不能选择相邻的两个数&#xff0c;并且要最终…

DM数据库配置归档模式的两种方式

归档模式&#xff0c;联机日志文件中的内容保存到硬盘中&#xff0c;形成归档日志文件(REDO日志)。 采用归档模式会对系统的性能产生些许影响&#xff0c;然而系统在归档模式下运行会更安全&#xff0c;当 出现故障时其丢失数据的可能性更小&#xff0c;这是因为一旦出现介质故…

Agent TARS与Manus的正面竞争

Agent TARS 是 Manus 的直接竞争对手&#xff0c;两者在 AI Agent 领域形成了显著的技术与生态对抗。 一、技术架构与功能定位的竞争 集成化架构 vs 模块化设计 Agent TARS 基于字节跳动的 UI-TARS 视觉语言模型&#xff0c;将视觉感知、推理、接地&#xff08;grounding&#…

【Tauri2】013——前端Window Event与创建Window

前言 【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介绍了on_window_event&#xff0c;这个在Builder中的方法&#xff0c;里面有许多事件&#xff0c;比如Moved&#xff0c;Res…

创建Linux虚拟环境并远程连接,finalshell自定义壁纸

安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机&#xff0c;打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式&#xff0c;然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0&#xff0c;然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…

基于pycharm的YOLOv11模型训练方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…

034-QSharedMemory

QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案&#xff0c;包含原理、优化策略、完整代码实现及流程图解&#xff1a; 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 &#xff08;注&#xff1a;此处应为共享内存IPC流程图&#xff0c;因文本…

在 Ubuntu 上离线安装 Prometheus 和 Grafana

在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下&#xff1a; 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址&#xff1a;Prometheus 官方下载页面Grafana 下载地址&#…

Ansible:playbook的高级用法

文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组&#xff08;公共&#xff09;变量 1. handlers与notify Handlers&am…

【C++进阶九】继承和虚继承

【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…

电子电气架构 --- 面向服务的体系架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…

基姆拉尔森计算公式

基姆拉尔森计算公式&#xff08;Zellers Congruence 的变体&#xff09;是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算&#xff0c;直接得到星期几的结果。 公式定义 对于日期 年-月-日&#xff0c;公式如下&#xff1a…

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问&#xff1a;怎么本地部署 DeepSeek 搭建个人知识库。 老实说&#xff0c;如果你不是为了研究技术&#xff0c;或者确实需要保护涉密数据&#xff0c;我真不建议去折腾本地部署。 为什么呢&#xff1f; 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…

Python数据可视化-第6章-坐标轴的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制&#xff0c;包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…