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

RPMsg-Lite上手

文章目录

    • 1、rpmsg-lite介绍
    • 2、rpmsg-lite 应用

现在的芯片非常复杂,很多都是包含多个核,特别是片上系统(SoC),一颗芯片上不仅包含了很多个核心,并且很多核心都是异构的。

为了最大限度的发挥他们的性能,协同完成某一任务,不同的核心上面运行的系统可能各不相同,有些核心上面运行的通用系统例如 Linux、Android 等,另外一些核心上可能运行的就是实时操作系统(RTOS)等。这些不同架构的核心以及他们上面所运行的软件组合在一起,就成了异构多处理系统(Asymmetric Multiprocessing System)。
在这里插入图片描述
异构多处理系统中往往会形成主-从(Master-Slave)结构。主核上的系统先启动,并负责准备好运行环境,然后根据需要或者一定规则启动从核并对其进行管理。主-从核心上的系统都准备好之后,他们之间就通过 IPC(Inter Processor Communication)方式进行通信,而 RPMsg 就是 IPC 中的一种。

RPMsg,全称 Remote Processor Messaging,它定义了异构多核处理系统(AMP,Asymmetric Multiprocessing)中核与核之间进行通信时所使用的标准二进制接口。

对于非通用的操作系统,它上面很可能是没有搭载传统的 TCP/IP 协议栈的,因此,当主核想要通过 RPC 的方式调用从核上的服务的时候,便不能使用一般的 RPC 框架所采用的网络通信方式。这时候类似于 RPMsg 这种专门用于核间通信的通信协议就派上了用场。
在这里插入图片描述

1、rpmsg-lite介绍

RPMsg-Lite 是远程处理器消息传递(RPMsg)协议的轻量级实现。 RPMsg 协议定义了标准化的二进制接口,该接口用于在异构多核系统中的多个核之间进行通信。与开放式非对称多处理(OpenAMP)框架的 RPMsg 实现相比,RPMsg-Lite 减少了代码大小,简化了 API,并提高了模块性。

RPMsg-Lite 是由 NXP Semiconductors 开发并在 BSD 兼容许可下发布的开源组件。

官方仓库为:https://github.com/nxp-mcuxpresso/rpmsg-lite

官方详细使用的指南:https://nxp-mcuxpresso.github.io/rpmsg-lite

下载 rpmsg-lite 源码后,查看源码文件较少

$ tree -L 2
.
├── common
│   └── llist.c
├── include
│   ├── environment
│   ├── llist.h
│   ├── platform
│   ├── rpmsg_compiler.h
│   ├── rpmsg_default_config.h
│   ├── rpmsg_env.h
│   ├── rpmsg_lite.h
│   ├── rpmsg_ns.h
│   ├── rpmsg_queue.h
│   ├── virtio_ring.h
│   └── virtqueue.h
├── rpmsg_lite
│   ├── porting
│   ├── rpmsg_lite.c
│   ├── rpmsg_ns.c
│   └── rpmsg_queue.c
└── virtio└── virtqueue.c

RPMsg-Lite 的实现可以分为三个子组件,核心组件位于 rpmsg_lite.c 中,rpmsg_ns.c 和 rpmsg_queue.c 是可选的组件。两个可选组件用于实现阻塞接收 API(在 rpmsg_queue.c 中)和动态“命名”端点创建和删除公告服务(在 rpmsg_ns.c 中)。

媒体访问层 是在 virtqueue.c 中实现的,它是与 OpenAMP 实现共享的少数几个文件之一。该层主要定义了共享内存模型,内部定义了使用的组件,如vring或virtqueue。
在这里插入图片描述

2、rpmsg-lite 应用

nxp 有很多 AMP 的芯片(如:frdmk32l3a6、imxrt1160、imxrt1170、lpcxpresso55s69、lpcxpresso54114等),都是基于 rpmsg-lite 的实现的核间通信,可下载对应SDK https://github.com/nxp-mcuxpresso/mcux-sdk-examples 学习。

下面通过 lpcxpresso54114 中的示例展示 rpmsg 中比较典型的 pingpong 应用实现。

在这里插入图片描述

lpcxpresso54114 中 master 端是 Cortex-M4 核, remote 端 Cortex-M0 + 核。

  • master 端
static void app_nameservice_isr_cb(uint32_t new_ept, const char *new_ept_name, uint32_t flags, void *user_data)
{uint32_t *data = (uint32_t *)user_data;*data = new_ept;
}void app_task_master(void *param)
{volatile uint32_t remote_addr = 0U;struct rpmsg_lite_endpoint *my_ept;rpmsg_queue_handle my_queue;struct rpmsg_lite_instance *my_rpmsg;rpmsg_ns_handle ns_handle;my_rpmsg =rpmsg_lite_master_init((void *)RPMSG_LITE_SHMEM_BASE, SH_MEM_TOTAL_SIZE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS);my_queue  = rpmsg_queue_create(my_rpmsg);my_ept    = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, rpmsg_queue_rx_cb, my_queue);ns_handle = rpmsg_ns_bind(my_rpmsg, app_nameservice_isr_cb, (void *)&remote_addr);/* Wait until the secondary core application issues the nameservice isr and the remote endpoint address is known. */while (0U == remote_addr){};/* Send the first message to the remoteproc */msg.DATA = 0U;(void)rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg, sizeof(THE_MESSAGE), RL_DONT_BLOCK);while (msg.DATA <= 100U){(void)rpmsg_queue_recv(my_rpmsg, my_queue, (uint32_t *)&remote_addr, (char *)&msg, sizeof(THE_MESSAGE), &len,RL_BLOCK);(void)PRINTF("Primary core received a msg\r\n");(void)PRINTF("Message: Size=%x, DATA = %i\r\n", len, msg.DATA);msg.DATA++;(void)rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg, sizeof(THE_MESSAGE), RL_BLOCK);}(void)rpmsg_lite_destroy_ept(my_rpmsg, my_ept);my_ept = ((void *)0);(void)rpmsg_queue_destroy(my_rpmsg, my_queue);my_queue = ((void *)0);(void)rpmsg_ns_unbind(my_rpmsg, ns_handle);(void)rpmsg_lite_deinit(my_rpmsg);wile (1){vTaskDelay(1000);}
}
  • remote 端
static void app_nameservice_isr_cb(uint32_t new_ept, const char *new_ept_name, uint32_t flags, void *user_data)
{
}void app_task_remote(void *param)
{volatile uint32_t remote_addr;volatile rpmsg_ns_handle ns_handle;my_rpmsg = rpmsg_lite_remote_init((void *)RPMSG_LITE_SHMEM_BASE, RPMSG_LITE_LINK_ID, RL_NO_FLAGS);rpmsg_lite_wait_for_link_up(my_rpmsg);(void)PRINTF("Link is up!\r\n");my_queue  = rpmsg_queue_create(my_rpmsg);my_ept    = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, rpmsg_queue_rx_cb, my_queue);ns_handle = rpmsg_ns_bind(my_rpmsg, app_nameservice_isr_cb, ((void *)0));/* Introduce some delay to avoid NS announce message not being captured by the master side.This could happen when the remote side execution is too fast and the NS announce message is triggeredbefore the nameservice_isr_cb is registered on the master side. */SDK_DelayAtLeastUs(1000000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);(void)rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING, (uint32_t)RL_NS_CREATE);(void)PRINTF("Nameservice announce sent.\r\n");while (msg.DATA <= 100U){(void)PRINTF("Waiting for ping...\r\n");(void)rpmsg_queue_recv(my_rpmsg, my_queue, (uint32_t *)&remote_addr, (char *)&msg, sizeof(THE_MESSAGE),((void *)0), RL_BLOCK);msg.DATA++;(void)PRINTF("Sending pong...\r\n");(void)rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg, sizeof(THE_MESSAGE), RL_BLOCK);}(void)PRINTF("Ping pong done, deinitializing...\r\n");(void)rpmsg_lite_destroy_ept(my_rpmsg, my_ept);my_ept = ((void *)0);(void)rpmsg_queue_destroy(my_rpmsg, my_queue);my_queue = ((void *)0);(void)rpmsg_ns_unbind(my_rpmsg, ns_handle);(void)rpmsg_lite_deinit(my_rpmsg);my_rpmsg = ((void *)0);msg.DATA = 0U;while (1){vTaskDelay(1000);}
}

相关文章:

RPMsg-Lite上手

文章目录 1、rpmsg-lite介绍2、rpmsg-lite 应用 现在的芯片非常复杂&#xff0c;很多都是包含多个核&#xff0c;特别是片上系统&#xff08;SoC&#xff09;&#xff0c;一颗芯片上不仅包含了很多个核心&#xff0c;并且很多核心都是异构的。 为了最大限度的发挥他们的性能&am…...

基于YOLOv8 的 多边形区域内目标检测,跟踪,计数

文章大纲 使用OpenCV 进行多边形 角点获取yolov5 的样例实现基于 roboflow 开源库的实现roboflow 开源库 介绍基于YOLOv8 track 的 Polygon Zone 计数参考文献与学习路径自己实现使用 开源库使用OpenCV 进行多边形 角点获取 import cv2 def SetPoints(windowname, img):"…...

STSP中用于记录节点和旅行回路的四种数据结构

STSP中用于记录节点和旅行回路的四种数据结构 双链表结构2-level tree卫星结构k-level卫星结构树参考文献 对于TSP是是历史悠久的研究问题&#xff0c;直至现在已经有了很多成熟高效的算法来求解问题。在拥有好的求解算法的同时&#xff0c;优秀的数据结构可以同时大幅提升问题…...

【Spring】AOP切点表达式

文章目录 1、语法2、通配符3、execution4、within5、annotation6、args7、args8、bean9、this10、target11、target12、within13、表达式组合14、补充 1、语法 动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名) 举例&#xff1a; execution(public User c…...

设计模式再探——代理模式

目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战&#xff0c;优化后(只加了泛型方式&#xff0c;使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…...

MySQL日志——查询日志

1.查询日志 show variables like %general%;修改mysql的配置文件 /etc/my.cnf文件&#xff0c;添加如下内容&#xff1a; #该选项用来开启查询日志&#xff0c;可选值&#xff1a;0或者1&#xff1b;0代表关闭&#xff0c;1代表开启 general_log1 #设置日志的文件名&#xff0…...

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

pytorch的CrossEntropyLoss交叉熵损失函数默认是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的&#xff0c;即多个样本输入后获取的是一个均值标量&#xff0c;而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…...

【力扣】206. 反转链表 <链表指针>

【力扣】206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3 输入&#xff1a…...

Java包装类(自动拆装箱)

包装类 为什么要有包装类&#xff1f; 在面向对象中&#xff0c;“一切皆为对象”&#xff0c;但是基本数据类型不符合这一理念&#xff0c;为了让基本类型也称为对象 便于类型之间的转化&#xff0c;数据类型之间的基本操作 转换方式&#xff1a; int ——> Integer ne…...

使用Golang反射技术实现一套有默认值的配置解析库

在实际开发中&#xff0c;我们往往会给一个逻辑设计一套配置文件&#xff0c;用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样&#xff0c;我们就需要在配置文件中设置不同的值。但是配置文件中又有一些相同值的配置项&#xff0c;比如数据库的名称等…...

数据安全能力框架模型-详细解读(二)

数据安全能力框架构成 1&#xff09; 数据安全治理 管理视角&#xff1a;从组织制度流程上提出要求&#xff0c;由于数据在各业务系统之间流转&#xff0c;需要设立高级管理层参与决策的数据安全管理部门&#xff0c;统筹和规划多部门之间的工作&#xff1b;需要设立跨组织的…...

【BASH】回顾与知识点梳理(八)

【BASH】回顾与知识点梳理 八 八. 正则表达式&#xff08;正规表示法&#xff09;8.1 什么是正规表示法8.2 基础正规表示法语系对正规表示法的影响grep 的一些进阶选项基础正规表示法练习例题一、搜寻特定字符串例题二、利用中括号 [] 来搜寻集合字符例题三、行首与行尾字符 ^ …...

rust报错“Utf8Error { valid_up_to: 1, error_len: Some(1) } }”

这个错误通常表示在尝试将字节序列解码为UTF-8字符时出现问题。它指出在索引1处发现了无效的字节序列&#xff0c;并且错误的长度为1个字节。 要解决这个问题&#xff0c;你可以尝试以下几种方法&#xff1a; 检查你的输入数据是否包含无效的字节序列。你可以使用一些调试工具…...

【Linux】节点之间配置免密登录

文章目录 1、实现2、原理3、SSH的理解 1、实现 先写实现&#xff0c;解决问题后有兴趣的自己看后面的原理。 以实现节点A&#xff08;主&#xff09;免密登录到节点B&#xff08;从&#xff09;为例&#xff1a;&#xff08;注意例子里节点B被登录&#xff09; 步骤一&#xf…...

【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向

目录 1.sys文件夹介绍&#xff08;掌握&#xff09;2.deley文件夹介绍&#xff08;掌握&#xff09;2.1deley文件夹函数简介2.2SysTick工作原理2.3SysTick寄存器介绍2.4delay_init()函数&#xff08;F1&#xff09;2.5delay_us()函数&#xff08;F1&#xff09;2.6delay_ms()函…...

ansible配置文件案例

案例一 控制主机上的普通用户控制受控主机 控制端1台&#xff0c;受控端两台 1.将两台受控主机添加到/etc/hosts文件中 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhos…...

【大数据】Flink 从入门到实践(一):初步介绍

Flink 从入门到实践&#xff08;一&#xff09;&#xff1a;初步介绍 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行 有状态 的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 1.架构 1…...

大数据课程F4——HIve的其他操作

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join&#xff1b; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化&#xff1b; 一、jo…...

React Native详解和代码实例

目录 一、React Native 的主要特点二、React Native 的工作原理三、React Native 的优缺点四、React Native 代码示例 React Native 是一个用于构建原生移动应用程序的 JavaScript 框架。它使用 React 库&#xff0c;允许开发者使用 JavaScript 编写应用程序的 UI 和逻辑&#…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...