NXP iMX8M Plus M7核心FreeRTOS开发

news2025/1/22 22:53:01

By Toradex胡珊逢

Toradex 的 Verdin iMX8M Plus 计算机模块采用 NXP 的 iMX8M Plus 处理器。该 CPU 除了有支持 AI 硬件加速单元的 NPU 外,还配置了一个 M7 微控制器。相比于 iMX 8 QuadMax 处理器上时钟频率为 266MHz 的M4 微控制器, 该M7 的时钟频率为 800MHz。且支持双精度浮点运算。在计算性能上有较大程度的提高。文章将介绍如何在 Verdin iMX8M Plus 计算机模上开发 M7 微控制器,以及使用异构核之间的 rpmsg 通信。

本次使用到的硬件包括 Verdin iMX8M Plus 计算机模和 Verdin Development Board。BSP 为 Linux BSP v5.7.0 multimedia reference image。硬件连线如下,分别连接电源、网络和USB 调试串口。Verdin Development Board 的 USB 调试串口有 ttyUSB0、ttyUSB1、ttyUSB2 和 ttyUSB3。 其中 ttyUSB3 是 Verdin iMX8M Plus 的 A53 调试串口, ttyUSB2 是 M7 调试串口。默认波特率均为 115200。

Device Tree 配置

根据这里的说明下载 Linux 内核源码。在默认的 device tree 配置中尚未加入 rpmsg 节点和 M7 预留地址空间的配置。在源码的 arch/arm64/boot/dts/freescale/ 位置创建 imx8mp-verdin-rpmsg.dtsi 文件,内容如下:

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

/*

 * Copyright 2022 Toradex

 */

#include <dt-bindings/clock/imx8mp-clock.h>

// Enable RPMSG support

/ {

    reserved-memory {

        #address-cells = <2>;

        #size-cells = <2>;

        ranges;

        /* use linux config instead */

        /delete-node/ linux,cma;

        /* Allocate 16MB DDR RAM memory for cortex M -> check the ram drr linker file for details */

        m7_reserved: m7@0x80000000 {

            no-map;

            reg = <0 0x80000000 0 0x1000000>;

        };

        /* Allocate resource table from Cortex-M7 -> check copyResourceTable inside rsc_table.c for details */

        rsc_table: rsc_table@550ff000 {

            reg = <0 0x550ff000 0 0x1000>;

            no-map;

        };

        /* VDEV0_VRING_BASE 0 comes from FreeRTOS rsc_table.c */

        vdev0vring0: vdev0vring0@55000000 {

            reg = <0 0x55000000 0 0x8000>;

            no-map;

        };

        /* VDEV0_VRING_BASE 1 comes from FreeRTOS rsc_table.c */

        vdev0vring1: vdev0vring1@55008000 {

            reg = <0 0x55008000 0 0x8000>;

            no-map;

        };

        /* Buffers to use with RPMSG */

        vdevbuffer: vdevbuffer@55400000 {

            compatible = "shared-dma-pool";

            reg = <0 0x55400000 0 0x100000>;

            no-map;

        };

    };

    imx8mp-cm7 {

        compatible = "fsl,imx8mp-cm7";

        rsc-da = <0x55000000>;

        clocks = <&clk IMX8MP_CLK_M7_DIV>;

        mbox-names = "tx", "rx", "rxdb";

        mboxes = <&mu 0 1

              &mu 1 1

              &mu 3 1>;

        memory-region = <&vdev0vring0>, <&vdev0vring1>, <&vdevbuffer>, <&rsc_table>, <&m7_reserved>;

        status = "okay";

    };

};

&rpmsg{

    /*

     * 64K for one rpmsg instance:

     * --0x55000000~0x5500ffff: pingpong

     */

    vdev-nums = <1>;

    reg = <0x0 0x55000000 0x0 0x10000>;

    memory-region = <&vdevbuffer>, <&rsc_table>, <&m7_reserved>;

    status = "disabled";

};

然后在 imx8mp-verdin-wifi-dev.dts 添加

#include "imx8mp-verdin-rpmsg.dtsi"

在 imx8mp-verdin-wifi.dtsi 中删除 &iomuxc 里的 <&pinctrl_gpio_hog4>。

&iomuxc {

    pinctrl-names = "default";

    pinctrl-0 = <&pinctrl_gpio1>, <&pinctrl_gpio2>,

            <&pinctrl_gpio3>, <&pinctrl_gpio4>,

            <&pinctrl_gpio7>, <&pinctrl_gpio8>,

            <&pinctrl_gpio_hog2>, <&pinctrl_gpio_hog3>,

            <&pinctrl_hdmi_hog>;

};

SODIMM 151 和 SODIMM 153 对应的 UART4是 M7 的默认调试串口。Verdin iMX8M Plus Quad 4GB WB IT V1.1A 及其以后版本的模块,UART4  被用于连接模块上的蓝牙。默认配置下在 &pinctrl_gpio_hog4 里 SODIMM 151 和 SODIMM 153 设置为 GPIO 模式。在Linux 启动后继续使用 M7 的调试串口功能,就需要将该节点删除。

    /* Wifi usage only */

    pinctrl_gpio_hog4: gpiohog4grp {

        fsl,pins = <

            MX8MP_IOMUXC_UART4_RXD__GPIO5_IO28      0x1c4   /* SODIMM 151 */

            MX8MP_IOMUXC_UART4_TXD__GPIO5_IO29      0x1c4   /* SODIMM 153 */

        >;

    };

完成对 device tree 的修改后,重新编译。并将其复制到开发板的 /boot 目录下,覆盖原文件。

-----------------------------------

make freescale/imx8mp-verdin-wifi-dev.dtb

-----------------------------------

 

MCUxpresso SDK

 

先打开 MCUXpresso SDK Builder 页面,点击 Select Development Board。此时需要输入账号,如果没有请先注册。

在 Search for Hardware 栏中输入 MIMX8ML8xxxKZ。点击 Processors 下面的 MIMX8ML8xxxKZ。

点击右边的 Build MCUXpresso SDK。

根据需要选择 Host OS,Toolchian/IDE 以及 SDK 里的组件。通常建议使用 Linux 作为开发电脑。至少勾选 multicore 和 FreeRTOS 组件。最后点击 DOWNLOAD SDK。

解压 SDK 压缩包。根据 SDK 压缩包解压目录的文档,如 SDK_2_12_1_MIMX8ML8xxxKZ/docs/MCUXpresso SDK Release Notes for EVK-MIMX8MP.pdf 中描述的 GCC 版本,在 这里下载对应的软件。SDK 2.12.1 使用 GCC Arm Embedded 10.3-2021.10。

RPMSG demo 编译

进入 SDK 安装目录的SDK_2_12_1_MIMX8ML8xxxKZ/boards/evkmimx8mp/multicore_examples/rpmsg_lite_str_echo_rtos/ 路径。

-----------------------------------

$cd SDK_2_12_1_MIMX8ML8xxxKZ/boards/evkmimx8mp/multicore_examples/rpmsg_lite_str_echo_rtos/

-----------------------------------

根据 GCC 编译工具的实际安装路径,配置变量 ARMGCC_DIR。

-----------------------------------

$ export ARMGCC_DIR=gcc-arm-none-eabi-10.3-2021.10

-----------------------------------

在 armgcc 文件夹里执行编译脚本。

-----------------------------------

$ cd armgcc

$ ./build_all.sh

-----------------------------------

编译完成后可以在 debug/release、ddr_debug/ddr_release、flash_debug/flash_release 文件夹里看到 bin 文件。上面三组文件夹分别对应 bin 的加载位置为 TCM、DDR和 QSPI Flash。在 Verdin 模块上可以使用 TCM 和 DDR。

运行 RPMSG demo

如果 M7 的固件较大,无法在 TCM 上执行,就需要使用模块的 DDR。将 ddr_release 目录下编译好的 M7 固件重命名为 m7.bin,然后复制到模块的 /home/root/ 目录下。在 U-Boot 设置下面参数。

-----------------------------------

setenv m4boot 'ext4load mmc 2:2 0x80000000 /home/root/m7.bin; dcache flush; bootaux 0x80000000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

如果 M7 的固件不大,则可以在 TCM 上运行。由于 TCM 是 M7 专用的存储,无需访问 DDR 控制器。这可以降低 M7 运行时 IO 开销。将 release 目录下编译好的 M7 固件重命名为 m7.bin,然后复制到模块的 /home/root/ 目录下。在 U-Boot 设置下面参数。

-----------------------------------

setenv m4boot 'ext4load mmc 2:2 ${loadaddr} /home/root/m7.bin; cp.b ${loadaddr} 0x7e0000 ${filesize}; dcache flush; bootaux 0x7e0000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

打开 M7 的调试串口,模块启动后可以看到下面信息。

-----------------------------------

Nameservice sent, ready for incoming messages..

-----------------------------------

在 Linux 的调试串口里输入下面命令,加载 rpmsg 驱动模块。

-----------------------------------

~# modprobe imx_rpmsg_tty

-----------------------------------

 M7 的调试串口会打印下面内容,表示 M7 已经收到 A53 上rmpsg 驱动发送的默认消息。

-----------------------------------

Get Message From Master Side : "hello world!" [len : 12]

-----------------------------------

在 Linux 的调试串口里输入下面命令,向 M7 发送指定内容。

-----------------------------------

~# echo 'Toradex' > /dev/ttyRPMSG30

-----------------------------------

M7 的调试串口会打印所接收到的消息。

-----------------------------------

Get Message From Master Side : "Toradex" [len : 7]

Get New Line From Master Side

-----------------------------------

在调试期间,通过 TFTP 传输 M7 固件会更加方面。下面分别是通过 TFTP 将固件下载到 DDR 和 TCM 运行所需的 U-Boot 设置。注意附件分别来自于 ddr_release 和 release 两个不同的文件夹。

l DDR

-----------------------------------

setenv m4boot 'tftp 0x80000000 m7.bin; dcache flush; bootaux 0x80000000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

l TCM

-----------------------------------

setenv m4boot 'tftp ${loadaddr} m7.bin; cp.b ${loadaddr} 0x7e0000 ${filesize}; dcache flush; bootaux 0x7e0000'

setenv fdt_high=0xffffffffffffffff

saveenv

-----------------------------------

总结

Verdin iMX8M Plus 上的 M7 微处理器非常适合于那些实时或者低功耗任务。MCUxpresso SDK 除了上面介绍的 A53 和 M7 核心的通信例程,还有大量操作外设如 CAN、GPIO、SPI 等,这些可以加速用户的开发。

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

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

相关文章

Java基础39 Object类(节选)

ObjectObject类一、 equals( )● 与 equals的对比&#xff08;☆&#xff09;二、hashCode( )三、toString( )四、finalize( )Object类 Object类&#xff1a;Java中lang包的类&#xff0c;是类层次结构的根类&#xff0c;每个类都使用Object作为超类。所有对象&#xff08;包…

【2015NOIP普及组】T3:求和 试题解析

【15NOIP普及组】求和 时间限制: 1000 ms 内存限制: 131072 KB 【题目描述】 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色colori用[1,m]当中的一个整数表示),并且写了一个数字numberi。 定义一种特殊的三元组:(x,y,z),其中x,…

Java架构该如何进阶?还在东拼西凑的学习?这份进阶指南相信会对你有所帮助,十多位资深大佬独家秘籍一并传授!

如何成为一名架构师? 笔者认为,想成为一名架构师&#xff0c;首先第一点必然是你的技术足够优秀&#xff0c;知识的深度和广度足够&#xff0c;遇到问题能很快从脑海中寻找出最合适的解决之道。其次,架构师会从整体上领导项目&#xff0c;与人打交道必不可少&#xff0c;因此…

区块链baas平台告警方案

前言 在《24*7动态化监管为“链”站岗》中&#xff0c;我们介绍了区块链动态化监控中心&#xff0c;如果说监控的作用是防患于未然&#xff0c;那么告警则是当异常发生时第一时间触发运维人员的关键&#xff0c;可充分降低监控对象异常的时间&#xff0c;最大化降低因异常给区…

深度解析KubeEdge EdgeMesh 高可用架构

摘要&#xff1a;通过高可用特性应用场景、高可用特性使用手册、课题总结、未来展望等四个部分的内容来向大家介绍新版本EdgeMesh的高可用架构。本文分享自华为云社区《KubeEdge EdgeMesh 高可用架构详解|KubeEdge云原生边缘计算社区》&#xff0c;作者&#xff1a;南开大学&am…

【计算机视觉OpenCV基础】实验二 基元检测

实验二 基元检测 计算机视觉OpenCV基础实验合辑&#xff08;实验1234扩展&#xff09; 资源下载地址&#xff1a; https://download.csdn.net/download/weixin_53403301 合辑&#xff1a;&#xff08;加在下载地址后面&#xff09; /87113581 讲义&#xff08;包括理论、图例、…

[附源码]SSM计算机毕业设计火车售票系统论文JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

antd table 表格滚动高度适配

文章の目录问题产生背景如何解决写在最后问题产生背景 在开发一个后台管理系统&#xff0c;某一页面用到了table表格&#xff0c;产品的需求是&#xff1a; table表格无论展示多少条数据&#xff0c;表头和分页信息要展示出来 此时我们一定首先想到了table表格的 scroll 属性…

【设计模式】原型模式

原型模式属于创建型模式&#xff0c;主要作用是利用一个原型对象的克隆方法&#xff0c;在保证性能的情况下创建多个重复的对象&#xff0c;本质就是通过克隆一个原有的对象来复制出一个新对象。 文章目录原型模式的介绍使用场景原型模式的实现类图实现方法第一步&#xff0c;编…

一文解决 Go 安装和常用环境变量的配置

一文解决 Go 安装和常用环境变量的配置下载链接Windows 操作系统下安装Linux 操作系统下安装安装多个 Go 版本常用环境变量的解释结尾耐心和持久胜过激烈和狂热。 下载链接 官网&#xff1a;https://golang.org/dl中国大陆的镜像站点&#xff1a;https://golang.google.cn/dl/…

跨境电商卖家只青睐亚马逊?其实你不知道,“备胎”早已选好!(Starday)

跨境电商平台作为一个新的国际贸易形态&#xff0c;打破传统贸易形态的方式&#xff0c;将互联网与外贸交易相结合&#xff0c;从而大大降低外贸的运营成本&#xff0c;因此在这两年逐渐燃爆电商行业&#xff0c;让许多行业的人趋之若鹜&#xff0c;从观察中我们可以发现&#…

线性插值方法

插值&#xff0c;通俗来说当在一个离散的事件中&#xff0c;想知道某一个位置确定的值时&#xff0c;就可以利用插值方式计算得到&#xff0c;即利用已知数据估计未知位置数值。插值的方式有很多&#xff0c;下面介绍几种常用的插值方式。 一、最近邻插值(Nearest Neighbour …

矩阵分析:特征值分解都在这里了

矩阵分析&#xff1a;特征值分解前置知识空间变换伸缩旋转对称矩阵对称矩阵对角化正交矩阵向量的基基变换不同基下的向量变换逆矩阵不同基下的空间变换内积的几何意义特征值、特征向量特征值分解代码前置知识 空间变换 伸缩 一个矩阵其实就是一个线性变换&#xff0c;因为一个…

借道元宇宙 一汽-大众揽巡打造沉浸式上市体验

11月18日&#xff0c;一汽-大众以元宇宙科技为载体&#xff0c;举行了行业首场元宇宙游戏形式的“巡梦之旅”线上虚拟发布会&#xff0c;宣布旗下“硬核大五座SUV”揽巡Tavendor正式上市。全新揽巡共提供330TSI 精英巡行版、330TSI 豪华巡逸版、380TSI 四驱R-Line 巡游版、380T…

代码库制作与使用

静态库 假定有以下目录结构&#xff0c;main.c 为src测试文件&#xff0c;所以要调用src目录下的四个文件。我们可以把src打包成一个静态库供main.c使用 tree 命令展示目录结构制作 1.先把目标代码编译生成.o文件 需要包含头文件&#xff0c;否则会报错&#xff0c;使用-I来…

dB family cheat sheet: dB, dBW, dBm, dBi, dBc, etc

目录 1. dB 2. dBi 3. dBW和dBm 4. dBc(Decibel relative to carrier power level) 5. dBuV(dB over 1 microvolt), dBmV(dB over 1 millivolt) 6. 功率、电压、匹配阻抗 7. dBFS 1. dB dB用于表示功率之间的对数比率&#xff0c;所以它没有单位&#xff0c;其定义为&am…

【2022.11最新】Python疫情数据采集 + 可视化展示

嗨害大家好鸭&#xff01;我是小熊猫 最近我又又又在家里居家办公了 闲来无事&#xff0c;用python采集一下 再做个可视化 康康现在疫情如何 源码、资料素材电子书点击这里 知识点: 1. 爬虫基本流程 2. requests 发送请求 3. re 正则表达式 4. json 结构化数据解析 5. pyech…

【深度学习】CycleGAN开源项目学习笔记 | 完整流程 | 报错总结 | pytorch

文章目录前言一、下载项目&#xff0c;文件结构观察二、数据集下载三、训练3.1、训练初体验3.2、命令行输入参数3.3、继续训练命令四、预测4.1、使用自己训练完的权重文件进行预测4.2、使用网上的预训练文件进行预测前言 你敢想象&#xff0c;就是这么一个简单的开源网站&…

南卡电容笔和绿联哪款更好用?性价比高的电容笔推荐

随着生活节奏逐渐加快&#xff0c;从而Apple Pencil的出现引来了不少热度&#xff0c;不过Apple Pencil由于价格昂贵&#xff0c;让不少用户望而止步。然而现在出现了平替电容笔&#xff0c;而且品牌众多&#xff0c;有很多百元左右的平替电容笔&#xff0c;性能和配置都做的不…

适合运动的耳机有哪些?六款相当不错的运动耳机分享

户外运动是现代青年最常见的一种生活方式&#xff0c;无论是在公交地铁上&#xff0c;还是晚上散步的公园里&#xff0c;都能看到很多人在运动&#xff0c;然而他们在做运动的时候都会佩戴上一款运动耳机&#xff0c;音乐能够让我们沉醉于运动中。也越来越多人会问&#xff0c;…