Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分享!基于NXP i.MX 8M Plus平台的OpenAMP核间通信方案

分享!基于NXP i.MX 8M Plus平台的OpenAMP核间通信方案

原创
作者头像
创龙科技Tronlong
修改于 2025-02-25 06:34:28
修改于 2025-02-25 06:34:28
2420
举报

嵌入式系统领域,随着技术不断发展,对于系统性能和功能要求日益提高。核间通信作为提升系统整体效能的关键技术,成为了关注焦点。今天,我们和大家分享一个OpenAMP非对称架构核间通信方案,基于NXP i.MX 8M Plus

平台。

OpenAMP架构

AMP(Asymmetric Multi-Processing),即非对称多处理架构。“非对称AMP”双系统是指多个核心相对独立运行不同的操作系统或裸机应用程序,如Linux + RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的内存,既可各自独立运行不同的任务,又可多个核心之间进行核间通信。OpenAMP框架是一个提供用于处理非对称多处理架构(AMP)系统的软件组件,为开发者提供了便捷高效的开发工具。

随着对嵌入式系统性能需求的持续攀升,非对称AMP架构凭借其独特优势,成为一种新选择,被广泛应用于工业领域,如工业PLC、继电保护装置、小电流选线设备等场景,为工业自动化和智能化发展提供了强大的技术支持。

图 1
图 1

i.MX 8M Plus的OpenAMP开发方案

本案例采用i.MX8M Plus处理器的Cortex-A53核心与Cortex-M7核心,基于RPMsg-lite框架实现高效的核间通信。

Cortex-A53通过加载imx_rpmsg_tty驱动,向内核注册TTY终端设备。这样一来,Linux应用层只需通过访问"/dev/ttyRPMSGxx"设备节点,就能实现间接调用RPMsg-lite接口,与Cortex-M7核心建立通信连接。

系统框图如下图所示。

图 2
图 2

i.MX 8M Plus的典型应用领域

i.MX 8M Plus凭借其强大的性能和出色的兼容性,广泛应用多个领域,为行业提供了有力的硬件支撑。

图 3
图 3

OpenAMP开发案例演示

为了简化描述,本文仅摘录部分方案功能描述与测试结果。 开发环境

Windows开发环境:Windows 7 64bit、Windows 10 64bit

虚拟机:VMware15.5.5

Linux开发环境:Ubuntu20.04.6 64bit

U-Boot:U-Boot-2022.04

Kernel:Linux-5.15.71-rt51

SDK开发包:SDK_2_12_0_MIMX8ML8xxxKZ

交叉编译工具链:gcc-arm-none-eabi-10.3-2021.10-x86_64-linux

硬件平台:创龙科技TLIMX8MP-EVM工业评估板(基于NXP i.MX 8M Plus)

案例功能

本文案例主要通过RPMsg-lite框架演示核间通信。首先,在Cortex-A53核心发送"Tronlong"字符串到Cortex-M7核心,Cortex-M7核心接收到"Tronlong"字符串后,会将此消息回发到Cortex-A53核心,最后,Cortex-A53核心接收并校验消息,确保数据传输的准确性和完整性。

程序原理流程图如下所示:

图 4
图 4

案例测试

请使用USB串口线将评估板的USB TO UART2串口连接至PC机的USB接口,使用RS232交叉串口母母线、USB转RS232公头串口线将评估板的RS232 UART4串口连接至PC机的USB接口,如下图所示。

其中USB TO UART2作为Cortex-A53核心调试串口,RS232 UART4作为Cortex-M7核心调试串口。

图 5
图 5

参考产品资料进行环境搭建,启动Cortex-M7核心并加载工程镜像,Cortex-M7核心启动后将自动运行程序,加载imx_rpmsg_tty模块,启动核间通信等。

然后将案例rpmsg_lite_str_echo文件拷贝至评估板文件系统,执行如下命令发送数据至Cortex-M7核心。

Target# ./rpmsg_lite_str_echo /dev/ttyRPMSG30

图 6
图 6

Cortex-M7核心接收到数据后,在RS232 UART4调试串口将数据进行打印,同时将数据回发至Cortex-A53。

图 7
图 7

在USB TO UART2调试串口可查看Cortex-M7核心回发的数据。

图 8
图 8

如果您还想查看更多i.MX8M Plus相关的案例演示,请通过公众号(Tronlog创龙科技)查阅,亲自上手体验吧!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python之线程、进程
    从列表中取一个数据,相当于是复制了一份列表中的数据,列表中的元数据并没有被改动
py3study
2020/01/03
3990
十、python学习笔记-进程-进程的start和join
""" 1、进程的start方法执行进程。 2、join方法阻塞主进程,需要等待对应的子进程结束后再继续执行主进程。 3、多进程中必须使用join方法,避免出现僵尸进程 """ from multiprocessing import Process import time """ 1、定义函数Foo1,打印循环是第几环个进程。 2、我们在函数Foo1中增加不同的sleep时间来证明是多进程并发执行的(如果是并行会按照执行完成的先后顺序打印, 如果是串行会按照123的顺序打印) 3、创建空列表p_li
堕落飞鸟
2022/02/06
1K0
Python进程
Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进程并发程序。
py3study
2020/01/09
1K0
Python 多进程
#_*_coding:utf-8_*_ __author__ = 'jieli' import time import multiprocessing ''' 线程多锁是不需要当成参数传多,因为线程之间是共享内存多。 但是进程之间多锁是需要当成参数传的,因为进程之间的内存是独立的 多进程之间加锁是为了防止同时对一个文件做操作等等 ''' def run(num,l):     time.sleep(1)     #l.acquire()     print "hello, my name is:",n
py3study
2020/01/10
3210
python之多进程
python中的多线程无法利用多核优势,如果想要充分地使用多核cpu的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。python提供了multiprocessing
py3study
2020/01/19
9860
python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
基本方法:q.put(元素) q.get() q.get_nowait() q.full() q.empty()
suwanbin
2019/09/26
6280
python并发编程-进程间通信-Queue队列使用-生产者消费者模型-线程理论-创建及对象属性方法-线程互斥锁-守护线程-02
py基础---多线程、多进程、协程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程中并发执行不同的任务。
py3study
2020/01/16
7010
py基础---多线程、多进程、协程
python并发编程之多进程
 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。     multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
py3study
2020/01/19
3940
python并发编程之多进程
Python学习记录-多进程和多线程
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
py3study
2020/01/07
8260
十、python学习笔记-进程-进程通信之Manager
# 通过Manager创建线程间共享的字典,列表等 """Manager 使用Manger创建的字典,列表等在不同进程中是可以共享的 和Queue类似,需要将创建的实例以参数的形式传入子进程在进行调用 """ from multiprocessing import Process, Manager """ 1、Foo函数的形参d是Manager创建的字典,l是Manager创建的列表,n表示是第几个进程(for 循环创建) 2、对字典列表进行操作(赋值),如果该字典和列表是共享的,最后打印时,会打印每个
堕落飞鸟
2022/02/09
4130
Python学习(十)---- python中的进程与协程
原文地址: https://blog.csdn.net/fgf00/article/details/52790360 编辑:智能算法,欢迎关注! 上期我们一起学习了python中的线程的相关知识
智能算法
2018/10/08
5860
Python与线程
进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。
星陨1357
2023/03/14
3750
Python与线程
Python之进程
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据
新人小试
2018/04/12
2.4K0
Python之进程
2.并发编程多编程
​ python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。 ​ multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
changxin7
2019/08/20
1.3K0
互斥锁和进程之间的通信
进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。
全栈程序员站长
2022/07/21
6600
python进程vs线程
线程切换是有代价的,多任务一旦多到一个限度,就会消耗掉系统所有的资源,结果效率急剧下降,所有任务都做不好
测试加
2022/04/27
4390
浅谈互斥锁与进程间的通信 (举例说明)
进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理。注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全。
Java帮帮
2020/12/24
1.3K0
python多线程
1 多进程 # 多进程, import os import time from multiprocessing import Process # 启动时必须在 if __name__ 判断下,windows 必须,其他 无限制 # ================================================= # def func(args): # print("子进程:",os.getpid()) # print("子进程的父进程:",os.getppid()) #
Dean0731
2020/05/08
1.8K0
Python自学成才之路 进程间通信
程序在创建子进程时,会完全复制一份主进程的环境,包括变量,函数,类等。所以在子进程中使用的变量,函数,类和主进程之间隔离的,子进程之间也是隔离的。 看下面这个案例:
我是李超人
2020/09/07
4590
第36天并发编程之进程篇
步骤一:创建一个py程序,用来打印三个人的信息,创建了三个函数,每个函数里面都有一个sleep来模拟网络延迟,因此我们写出了下面的代码
py3study
2020/01/20
4310
相关推荐
python之线程、进程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档