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

一、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.mzph.cn/news/900053.shtml

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

相关文章

NineData云原生智能数据管理平台新功能发布|2025年3月版

本月发布 15 项更新&#xff0c;其中重点发布 3 项、功能优化 11 项、性能优化 1 项。 重点发布 基础服务 - MFA 多因子认证 新增 MFA 多因子认证&#xff0c;提升账号安全性。系统管理员开启后&#xff0c;所有组织成员需绑定认证器&#xff0c;登录时需输入动态验证码。 数…

DAY 35 leetcode 202--哈希表.快乐数

题号202 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&a…

Maven+Spring实现后端开发

一、前置知识的介绍 1.Spring 轻量级的 DI / IoC 和 AOP 容器的开源框架 容器的开源框架网址&#xff1a;https://spring.io/projects/spring-framework 作用&#xff1a;可简化管理创建和组装对象之间的依赖关系 将controller----->service------->dao层的依赖配置…

解锁界面设计密码,打造极致用户体验

界面设计是对软件、网站、移动应用等产品的用户界面进行设计的过程&#xff0c;旨在为用户提供美观、易用、高效的交互体验。以下是关于界面设计的一些主要方面&#xff1a; 一、设计原则 用户中心原则&#xff1a;以用户为中心&#xff0c;了解用户的需求、期望、行为和习惯…

Joint Receiver Design for Integrated Sensing and Communications

摘要——在本文中&#xff0c;我们研究了集成感知与通信(ISAC)系统的联合接收机设计&#xff0c;其中通信信号和目标回波信号同时被接收和处理&#xff0c;以在两种功能之间实现平衡性能。特别地&#xff0c;我们提出了两种设计方案来解决联合感知和通信问题中的接收信号处理。…

DeepSeek接入飞书多维表格,效率起飞!

今天教大家把DeepSeek接入飞书表格使用。 准备工作&#xff1a;安装并登录飞书&#xff1b;可以准备一些要处理的数据&#xff0c;确保数据格式正确&#xff0c;如 Excel、CSV 等&#xff0c;也可直接存储到飞书多维表格。 创建飞书多维表格&#xff1a;打开飞书&#xff0c;点…

【C语言入门】由浅入深学习指针 【第二期】

目录 1. 指针变量为什么要有类型&#xff1f; 2. 野指针 2.1 未初始化导致的野指针 2.2 指针越界导致的野指针 2.3 如何规避野指针 3. 指针运算 3.1 指针加减整数 3.2 指针减指针 3.3 指针的关系运算 4. 二级指针 5. 指针数组 5.1 如何使用指针数组模拟二维数组 上…

OpenCV 图形API(13)用于执行两个矩阵(或图像)逐元素乘法操作的函数mul()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算两个矩阵的每个元素的缩放乘积。 mul函数计算两个矩阵的逐元素乘积&#xff1a; dst ( I ) saturate ( scale ⋅ src1 ( I ) ⋅ src2 ( I ) ) …

人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建

人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建 前言相关介绍C++简介ONNX简介ONNX Runtime 简介**核心特点**DLL 简介**核心特点****创建与使用****应用场景****优点与挑战**图像异常检测简介应用场景前提条件实验环境项目结构C++调用封装好的DLL进行图像超分重建C…

Linux内核之高效缓冲队列kfifo

一、先说FIFO 队列是常见的一种数据结构&#xff0c;简单看来就是一段数据缓存区&#xff0c;可以存储一定量的数据&#xff0c;先存进来的数据会被先取出&#xff0c;First In Fist Out&#xff0c;就是FIFO。 FIFO主要用于缓冲速度不匹配的通信。 例如生产者&#xff08;数…

【面试篇】Kafka

一、基础概念类 问题&#xff1a;请简述 Kafka 是什么&#xff0c;以及它的主要应用场景有哪些&#xff1f; 答案&#xff1a;Kafka 是一个分布式流处理平台&#xff0c;它以高吞吐量、可持久化、可水平扩展等特性而闻名。其主要应用场景包括&#xff1a; 日志收集&#xff1a…

解释回溯算法,如何应用回溯算法解决组合优化问题?

一、回溯算法核心原理 回溯算法本质是暴力穷举的优化版本&#xff0c;采用"试错剪枝"策略解决问题。其核心流程如下&#xff1a; ​路径构建&#xff1a;记录当前选择路径​选择列表&#xff1a;确定可用候选元素​终止条件&#xff1a;确定递归结束时机​剪枝优化…

Vue 学习随笔系列二十二 —— 表格高度自适应

表格高度自适应 文章目录 表格高度自适应1、方法一2、方法二 1、方法一 根据页面元素计算各自占比 <template><div class"main"><div class"query-form" ref"Query"><QueryFormref"QueryForm"query"query&q…

ubuntu22.04.5安装docker,解决安装出现的错误,解决Docker hello-world没打印出来

文章目录 前言一 安装失败解决1结合具体报错分析2 首先怀疑是VPN的问题3 直接百度报错信息4最终解决问题 二 验证Docker hello-world没打印出来总结 前言 先说一下前面的情况&#xff0c;使用的是公司的工作站&#xff0c;登录公司一个帐号使用的公司网络&#xff0c;使用网上…

idea插件(自用)

.ignore git排除文件插件&#xff1a;.ignore介绍 Grep console 自定义日志颜色&#xff1a;Grep console介绍 AceJump 光标快速定位&#xff1a;AceJump介绍 Key promoter 提示插件:Key promoter介绍 MetricsReloaded 分析代码复杂度的插件&#xff1a;MetricsReload…

让AI再次伟大-MCP-Client开发指南

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理、AI应用&#x1f525;如果感觉…

供应链管理:计算题 / 倒扣法

一、理解倒扣法 在供应链管理中&#xff0c;倒扣法是一种常用的成本计算方法&#xff0c;主要用于确定商品的成本和销售价格&#xff0c;以确保特定的毛利率。倒扣法的基本原理是在已知售价和期望毛利率的情况下&#xff0c;逆推计算出供货价或成本价。 二、倒扣法的计算公式…

skynet.start 的作用详细解析

目录 skynet.start 的作用详细解析1. 功能概述2. 基本用法3. 关键作用(1) 注册消息处理函数(2) 启动事件循环(3) 服务生命周期管理 4. 与其他函数的协作5. 未调用 skynet.start 的后果6. 高级场景&#xff1a;何时不需要 skynet.start7. 总结 skynet.start 的作用详细解析 在 …

基于yolo11的BGA图像目标检测

1.产生图像数据的分辨率 2.产生图像的大小 3.产生图像是黑白或是RGB彩色 灰度图像&#xff0c;达到识别要求&#xff0c;减少计算量 4.标注数据的精准程度 1.模型标注后&#xff0c;少量标注全部人工校验&#xff0c;大量数据抽检&#xff0c;部分人工检验 2.明确边界框贴合…