iMX8MQ MCUXpresso SDK开发详解

飞凌iMX8MQ 平台内部有一个Cortex M4内核,支持使用MCUXpresso SDK进行开发。

MCUXpresso SDK是微控制器软件支持的集合,它包含外围驱动程序,RPMSG多核通信,以及FreeRTOS支持。可以查看SDK API文档了解它实现的函数和结构体。

OKMX8MQ平台可以使用以下工具链进行SDK开发:

Linux环境: Makefiles support with GCC revision v7-2017-q4-major from Arm Embedded

Windows环境:IAR Embedded Workbench for ARM version 8.30.2

一、使用ARM GCC工具编译应用程序

在Linux环境下,MCUXpresso SDK使用GCC工具进行编译,下面以hello_world demo为例说明编译的过程。

首先需要搭建Linux编译环境:

1、安装cmake

$ sudo apt-get install cmake

$ cmake --version

cmake 的版本要大于 3.0.x 才行。如果您的的版本小于3.0,可以参考下列步骤进行更新。

$ cd /tmp

$ wget https://cmake.org/files/v3.11/cmake-3.11.0-rc4-Linux-x86_64.tar.gz

$ tar zxvf cmake-3.11.0-rc4-Linux-x86_64.tar.gz

$ sudo mv cmake-3.11.0-rc4-Linux-x86_64 /opt/cmake-3.11

$ sudo ln -sf /opt/cmake-3.11/bin/* /usr/bin/

$ cmake --version

2、安装GCC编译器

将用户资料工具目录的 gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2 拷贝到虚拟机/tmp 目录。

$ cd /tmp

$ sudo tar xvf gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2 -C /opt

3、设置环境变量

$ export ARMGCC_DIR=/opt/gcc-arm-none-eabi-7-2017-q4-major

$ export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/bin:$PATH

设置完成可以看一下是否设置成功:

$ echo $ARMGCC_DIR

$ echo $PATH

4、编译

将用户资料原厂资料中的 SDK_2.8.0_EVK-MIMX8MQ.zip 拷贝到虚拟机 /home/forlinx/imx8mq 目录下:

$ cd /home/forlinx/imx8mq

$ mkdir SDK_2.8.0_EVK-MIMX8MQ

$ mv SDK_2.8.0_EVK-MIMX8MQ.zip SDK_2.8.0_EVK-MIMX8MQ

$ cd SDK_2.8.0_EVK-MIMX8MQ

$ unzip SDK_2.8.0_EVK-MIMX8MQ.zip

$ cd boards/evkmimx8mq/demo_apps/hello_world/armgcc

$ ./build_debug.sh

编译出来的 hello_world.bin 文件在 ./debug 目录下。

注意:这里也可以编译其他版本,如build_ddr_debug.sh,只是在运行的时候会有差别。

二、 使用IAR和J link编译和 调试

参考官方提供的手册 《SDK_2.8.0_EVK-MIMX8MQ\docs\Getting Started with MCUXpresso SDK for EVK-MIMX8MQ》。

1、IAR和Jlink官方工具版本要求

IAR请使用IAR embedded Workbench 8.30.2版本或更高版本,jlink官方工具版本请使用包含MIM8M6_M4设备的版本,我们使用的版本为JLink_Windows_V654c。IAR embedded Workbench为付费软件,请用户自行购买安装。Jlink官方工具用户可以在jlink官方网站下载。

另外还需要NXP提供的SDK_2.8.0_EVK-MIMX8MQ,用户资料内已经提供。

2、IAR通过Jlink运行测试程序

步骤一、打开工程

1.  打开IAR

2.  在“File”菜单下选择“Open Workspace”,选择SDK_2.8.0_EVK-MIMX8MQ\boards\evkmimx8mq\demo_apps\hello_world\iar\hello_world.eww。

3.  选择debug选项

步骤   配置工程

按下ALT+F7快捷键打开配置界面。

1.  设置General Options选项配置:

2. 设置linker选项配置:

点击“Edit...”

选择MIMX8MQ6xxxJZ_cm4_ddr_ram.icf、MIMX8MQ6xxxJZ_cm4_ram.icf,不同的选项会生成的镜像会运行在不同的存储中(ddr、ram)。

3.  设置Debugger选项配置:

4. 设置J-Link/J-Trace选项配置:

配置完成后点击 “OK”。

步骤三、编译并运行工程

注意:调试M4程序,iMX8MQ开发板不能启动到Linux内核阶段,需要停止在uboot(启动时,在调试串口按下空格键)。

1.  点击“Make”编译工程,工程编译完成,且无报错:

2. 点击“Download and Debug”按钮:

3. 提示设置 J-Link 选择设备:

4. 选择“MIMX8MQ6_M4”设备:

5. 运行测试程序:

6. 在M4核调试串口查看运行结果:

三、使用 U -boot运行应用程序

可以在iMX8MQ开发板启动的时候进入u-boot命令行,通过u-boot命令来将bin文件加载到M4中并运行,下面以hello_world.bin程序为例说明运行的过程。

注意:M4程序运行可能和A53有资源冲突,如某个接口在M4中已经使用,A53中不要再次调用此接口。M4程序运行在DDR中,需要Linux中预留这部分内存。在系统烧写的设备树ok8mq-evk-rpmsg.dtb中有配置。我们下面测试都是使用此设备树测试M4程序。

在uboot命令行内输入下列命令修改设备树:

$ setenv fdt_file ok8mq-evk-rpmsg.dtb

$ saveenv

1、 准备测试用M4程序

采用第一或者第二中的方法生成运行在DDR和ram的hello_world.bin,并将它们分别命名为hello_world_ddr.bin和hello_world_ram.bin。

2、 串口连接

由于hello_world程序中使用了uart2,因此在开始测试之前请连接uart2到PC的串口。并使用串口调试工具打开对应的COM口,波特率等参数设置和OKMX8MQ Debug口参数相同。

3、 将编译出来的hello_world_ddr.bin和hello_world_ram.bin拷贝到U盘(Fat32)的根目录下面,将U盘插到开发板上,重启iMX8MQ开发板,停在u-boot命令行。

4、 在u-boot命令行执行如下命令

对于debug/release版本的bin文件,它运行在TCM,执行下列命令:

$ usb start

$ fatload usb 0:1 0x48000000 hello_world_ram.bin

$ cp.b 0x48000000 0x7e0000 0x20000

$ bootaux 0x7e0000

终端的执行:

在uart2的调试串口工具上可以看到打印信息如下:

对于ddr_debug/ddr_release版本的bin文件,它运行在DDR4,执行下列命令:

$setenv fdt_file ok8mq-evk-rpmsg.dtb

$ saveenv

$ usb start

$ fatload usb 0:1 0x80000000 hello_world_ddr.bin

$ dcache flush

$ bootaux 0x80000000

终端的执行:

在uart2的调试串口工具上可以看到打印信息如下:

四、Uboot自动启动M4程序

在制作系统镜像的时候,会将源码包内images/m4/文件夹下的文件写入到boot.img镜像内,该镜像是rootfs.sdcard的一部分。我们把镜像烧写到emmc后,这些m4程序的镜像就在emmc的fat32分区内存在。Uboot启动过程中会运行m4_run,将m4_run设置为启动m4程序,启动后uboot会启动M4程序。

以hello_world例程示例,按下面的方法设置uboot环境变量后,uboot会自动启动M4程序。

hello_world程序的镜像,我们已经默认添加到源码的images/m4/文件夹下,所以我们的镜像内emmc的分区1内的m4文件夹下包含了hello_world的镜像,hello_world_ram.bin和hello_world_ddr.bin。

在ram启动M4程序。

$ setenv m4_run 'mmc dev 0; fatload mmc 0:1 0x48000000 m4/hello_world_ram.bin; cp.b 0x48000000 0x7e0000 0x20000; bootaux 0x7e0000 '

$ saveenv

在ddr启动M4程序。

$ setenv m4_run 'mmc dev 0; fatload mmc 0:1 0x80000000 m4/hello_world_ddr.bin; dcache flush; bootaux 0x80000000'

$ saveenv

注1:用户添加自己编译的镜像放到images/m4/文件夹下,编辑生成镜像,烧写后就会在emmc的fat分区内,启动的时候根据编译的为ddr版或ram版选择m4_run的设置方法,并将m4_run命令内的m4镜像名字替换成自己编译的m4镜像的名字。

注2:可以在系统启动后查看fat分区内包含的镜像,也可以通过cp命令添加镜像。

查看镜像:

$ ls /run/media/mmcblk0p1/m4

复制镜像到文件夹:

$ cp /run/media/sda1/m4_flash.bin /run/media/mmcblk0p1/m4/

五、异构多核通信测试

使用RPMsg(Remote Processor Messaging)实现Cortex A53跟Cortex M4进行通信。

RPMsg是一种基于virtio的消息传递总线,它允许内核驱动程序与系统上可用的远程处理器(如Cortex M4)进行通信。下图是一个多核通信架构:

飞凌iMX8MQ的MCUXpresso SDK中有一个demo:rpmsg_lite_pingpong_rtos,它实现了Cortex A53与Cortex M4的数据收发,二者使用了共享内存,并且在Cortex M4上运行了一个FreeRTOS Task。

在Cortex A53端通过内核模块的方式实现该功能,代码位于:drivers/rpmsg/imx_rpmsg_pingpong.c。

下面以 Arm GCC 方式编译示例。

进入以下目录:

$ cd boards/evkmimx8mq/multicore_examples/rpmsg_lite_pingpong_rtos/linux_remote/armgcc

编译debug版本的bin文件:

$ ./build_debug.sh

$ cd debug

$ ls -l

将编译出来的bin文件rpmsg_lite_pingpong_rtos_linux_remote.bin拷贝到U盘(Fat32)的根目录下面,启动开发板停在u-boot命令行。

$ setenv fdt_file ok8mq-evk-rpmsg.dtb

$ saveenv

$ usb start

$ fatload usb 0:1 0x48000000 rpmsg_lite_pingpong_rtos_linux_remote.bin

$ cp.b 0x48000000 0x7e0000 0x20000

$ bootaux 0x7e0000

运行bin文件后,可以在uart2的串口终端看到以下输出:

然后在A53 U-boot命令行输入 boot 启动kernel,此时可以在Cortex M4的串口终端看到以下输出:

然后在Cortex A53的串口终端加载以下内核模块:

$ modprobe imx_rpmsg_pingpong

模块加载之后,Cortex A53开始跟Cortex M4进行数据传输,此时可以在Cortex M4的串口终端看到以下输出:

此时可以在Cortex A53的串口终端看到以下输出:

六、FreeRTOS 应用程序测试

飞凌iMX8MQ板卡内部有一个Cortex M4核,可以在上面运行FreeRTOS 应用程序。

下面以freertos_swtimer demo为例测试FreeRTOS。

进入目录:

$ cd boards/evkmimx8mq/rtos_examples/freertos_swtimer/armgcc

编译debug版本的bin文件:

$ ./build_debug.sh

$ cd debug

$ ls -l

将编译出来的bin文件 freertos_swtimer.bin 拷贝到U盘(FAT32)的根目录下面。将U盘插入开发板USB Host接口,启动开发板停在u-boot命令行。

$ setenv fdt_file ok8mq-evk-rpmsg.dtb

$ saveenv

$ usb start

$ fatload usb 0:1 0x48000000 freertos_swtimer.bin

$ cp.b 0x48000000 0x7e0000 0x20000

$ fbootaux 0x7e0000

此时可以在Cortex M4的串口终端看到以下输出:

 

可以看到终端周期性的打印出Tick字符,说明FreeRTOS 应用程序中的定时器任务正在运行。

原创:iMX8MQ 2020-12-15 19:10:00

(0)

相关推荐

  • 相比加价要3300的小米9,2500元的小米8是否值得考虑?

    记得这几天,评价君还接到一个手机回收平台发来的短信,说小米9 3299元起,现货50台,看来数量不多,似乎机会难得. 但就算3299元有人会出手,还是有很多人坚持等待2999元款.让我们再回顾下小米9 ...

  • 华为Mate 10高空拍照体验:生活需要发现记录,拍照不可或缺

    最近评价君坐飞机,从北向南,大概晚7点起飞,因为提前感觉可以看看夕阳,就选择了靠近右侧中部窗户的位置,果然,虽然地面阴雨连绵,但空中还是有一番风景的. 用的还是Mate 10,老机器,距现在已有一代半 ...

  • OPPO R9s将在本月19日发布,拍照可能有惊喜

    对于正值青春年少的小鲜肉来说,OPPO手机并不陌生,它不像华为三星高端机型的沉稳老气,也不似iPhone手机般高价不可及,尽管OPPO手机鲜有标志性的旗舰配置,但它却因有着一群年轻的明星代言,赢取了不 ...

  • ASI294MM Pro相机超全面测评,对比ASI1600到底怎么样?

    ASI294MM Pro 天文摄影圈子不大,每当有新产品诞生的时候,都会给大家带来不小的冲击.ZWO发布4/3"画幅黑白相机ASI294MM Pro时,网络上立马掀起了轩然大波. 这台相机最 ...

  • k40

    ​Redmi K40,三星E4 FHD+面板,支持60Hz和120Hz(没有别的档位): 触控FTS按道理是和自家之前产品一样来自意法,但没有之前st_fts.ftb那句话,反倒写了focaltech ...

  • 数评随便说:各位一起来看看一加7 Pro真机香不香

    虽然其最近负面新闻不少,但不得不说,开箱的一刹那,感觉还是挺香的. 一加7 Pro采用骁龙855处理器,6GB内存,128GB存储,6.67 英寸90Hz 2K曲面屏,3120*1440分辨率,516 ...

  • 【OpenCV 4开发详解】直方图应用

    直方图不仅能够表示图像像素的统计特性,应用统计的直方图结果也可以增强图像的对比度,在图像中寻找相似区域等.本节中将重点介绍如果通过调整直方图分布提高图像的对比度.利用直方图反向投影寻找相同区域以及将图 ...

  • 知荐 | 基于视觉系统的ADAS横向开发详解

    自动驾驶2级以上包含了对横向控制的不同算法策略,包含对中控制.纠偏控制及预警控制,涉及不同范围的功能,如车道保持辅助LKA/紧急车道保持ELK.交通拥堵辅助/高速集成式巡航TJAICA.车道偏离预警L ...

  • 【OpenCV 4开发详解】形态学应用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【OpenCV 4开发详解】图像腐蚀

     小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>. ...

  • 【OpenCV 4开发详解】图像连通域分析

    小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为 ...

  • 【精品博文】《FPGA设计技巧与案例开发详解》初探(二)之工程文件管理

    对于彬哥书中所提到的工程文件管理,由于只给了一个框架,简要介绍了各个文件夹的作用,进而有许多初学者不知道具体怎么操作,会在群里问这类问题.下面,我将详细介绍一下如何构建彬哥的工程目录. 首先,我还是简 ...

  • 【精品博文】《FPGA设计技巧与案例开发详解(第二版)》上线

    呕心沥血几春秋,携友再创第二版,<FPGA设计技巧与案例开发详解>,在去年经历了<FPGA设计技巧与案例开发详解>第一版的各种风风雨雨后,我们响应广大网友与高校学生的号召,精心 ...

  • 直播电商、直播购物,商城系统开发模式详解

    商城直播系统是在直播系统与商城系统的基础上开发出的一种新的模式,利用直播带货商城源码,可以搭建购物商城直播平台,这样做可以让消费者实现在看视频直播的同时看到自己喜欢的商品直接下单消费的功能. 电商平台 ...