i.MX8MP M核开发环境02-搭建编译、调试、运行环境

本系列介绍飞凌 OKMX8MPQ-C 开发板如何搭建M核开发、调试核运行环境。

一、VSCODE+IAR 集成开发环境(windows)

VSCode 的文本编辑功能强大,多光标操作,智能补全,格式化,大纲等等功能1,非常顺手。IAR编辑功能偏弱,但编译器稳定可靠。用IAR管理工程,VSCode编辑文本,综合两者优势可以大大提高开发效率,尤其IAR 官方提供VS Code 环境下 IAR Build 和 IAR C-SPY Debug 插件后2,下面介绍如何搭建VSCODE+IAR 集成开发环境。

首先,你应该有一个 IAR 工程,安装好 VSCode。接下来

1.1 安装VSCODE插件

所需要的插件为:

  1. ARM assembly :Arm® assembly highlighting for Visual Studio Code

  2. C/C++ for Visual Studio Code:The C/C++ extension adds language support for C/C++ to Visual Studio Code, including editing (IntelliSense) and debugging features.

  3. IAR Embedded Workbench:This extension provides IAR Embedded Workbench project integration to automatize build and Intellisense support. As IAR works on Windows environment only, the extension is not been tested on different systems.(非官方,可删除)

  4. IAR Build:Build and develop your IAR Embedded Workbench projects from Visual Studio Code (带蓝色标志,IAR System官方)

  5. IAR C-SPY Debugger:Use IAR System's C-SPY Debugger to debug embedded programs using Visual Studio Code, with support for a wide range of embedded devices and debug probes. (带蓝色标志,IAR System官方)

forlinx01_introduction_IDE_01
forlinx01_introduction_IDE_01

1.2 配置相关插件

IAR Build 安装完成后,在侧边栏会出现其图标,点击后配置 IAR Embedded Workbench 位置和工程名称。

forlinx01_introduction_IDE_02
forlinx01_introduction_IDE_02

1.3 VSCODE 其他配置

快捷键设置

  • ”ctrl+shift+b“ 编译快捷键
    • 导航到终端 | 配置默认生成任务 | iar:Build Project
    • 文件 | 首选项 | 快捷键 | 搜索”运行生成任务“,保留 ”ctrl+shift+b“ 快捷键,去除其他选项
  • ”ctrl+shift+c“ 清除 clean
    • 文件 | 首选项 | 快捷键 | 搜索”运行任务“,添加 ”ctrl+shift+c“ 快捷键,并解绑其他冲突设置
  • 滚轮放大编辑区快捷键
    • ”ctrl+shift+p“ 唤起设置,输入"setting ui",打开设置UI界面
    • 输入”mouseWheelZoom“,使能该项配置

通过如上的配置,就可以愉快地使用 VSCode 编辑 IAR 工程代码了。

但是工程管理,比如常用的添加模块,头文件路径,更改调试方式等,就需要去IAR中操作了。一个小技巧是,在VSCODE 文件夹下,找到 .eww 文件,快捷键(”ctrl+alt+o“)使用默认的应用程序(即IAR)打开IAR工程进行管理。

1.5 IAR快速修改工程名称

第一步:修改工程名称

将工程文件夹下后缀为“dep、ewd、ewp、eww”的四个文件重命名为目标名称。

第二步:修改工程内容

用编辑器(记事本或者UE)打开“eww”后缀的文件,修改目的路径的“project.ewp”为目标名称。

第三步:修改编译输出文件

建议在工程文件中,输出设置为相对路径及名称设置为与获取工程名,则只需执行第一、第二步即可,不需手动修改。

更改bin文件名 更改out文件名

二、ARM GCC 编译工具(Ubuntu)

# 1. 安装 cmake
$ sudo apt-get install cmake
$ cmake --version
cmake version 3.10.2 cmake 的版本要大于 3.0.x 才行。
# 2. 设置 FreeRTOS 环境变量
# 2.1 将 Linux\源码中 OK8MP-linux-sdk.tar.bz2.00 到 OK8MP-linux-sdk.tar.bz2.03文件拷贝到~/work 中,执行如下命令解压:
$ cat OK8MP* > OK8MP-SDK.tar.bz2
$ tar xvf OK8MP-SDK.tar.bz2
# 2.2 设置环境变量
$ cd OK8MP-linux-sdk
$ export ARMGCC_DIR=/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/tools/gcc-arm-none-eabi-10-2020-q4-major
$ export PATH=$PATH:$ARMGCC_DIR
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/tools/gcc-arm-none-eabi-10-2020-q4-major
# 3. 编译
$ cd OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/armgcc
$ ./build_release.sh
-- TOOLCHAIN_DIR: /mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/tools/gcc-arm-none-eabi-10-2020-q4-major
-- BUILD_TYPE: release
-- TOOLCHAIN_DIR: /mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/tools/gcc-arm-none-eabi-10-2020-q4-major
-- BUILD_TYPE: release
-- The ASM compiler identification is GNU
-- Found assembler: /mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/tools/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc
-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/armgcc
Scanning dependencies of target hello_world.elf
[  4%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/hello_world.c.obj
[  9%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/drivers/fsl_rdc.c.obj
[ 14%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/drivers/fsl_audiomix.c.obj
[ 19%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/empty_rsc_table.c.obj
[ 23%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/utilities/str/fsl_str.c.obj
[ 28%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/components/serial_manager/fsl_component_serial_port_uart.c.obj
[ 33%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/utilities/debug_console/fsl_debug_console.c.obj
[ 38%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/components/lists/fsl_component_generic_list.c.obj
[ 42%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/pin_mux.c.obj
[ 47%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/components/serial_manager/fsl_component_serial_manager.c.obj
[ 52%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/board.c.obj
[ 57%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/components/uart/fsl_adapter_iuart.c.obj
[ 61%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/drivers/fsl_uart.c.obj
[ 66%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/utilities/fsl_assert.c.obj
[ 71%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/drivers/fsl_clock.c.obj
[ 76%] Building ASM object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/gcc/startup_MIMX8ML8_cm7.S.obj
[ 80%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/drivers/fsl_common.c.obj
[ 85%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/system_MIMX8ML8_cm7.c.obj
[ 90%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/devices/MIMX8ML8/utilities/fsl_sbrk.c.obj
[ 95%] Building C object CMakeFiles/hello_world.elf.dir/mnt/OK8MP/OK8MP-linux-sdk/OK8MP-FreeRTOS/boards/evkmimx8mp/demo_apps/hello_world/clock_config.c.obj
[100%] Linking C executable release/hello_world.elf
[100%] Built target hello_world.elf
$ cd release/
$ ls
hello_world.bin  hello_world.elf

三、运行、调试和自启动

3.1 使用 u-boot 运行3

  1. 串口线连接,查看设备管理器串口端口号

    a. 安装CH343SER驱动,连接PC和开发板调试端口。

    OKMX8MPQ-C 开发板接口示意图

    b. 打开 PC ”设备管理器“查看串口端口号,以电脑实际识别的端口号为准(==SERIAL-A 为 Linux== 的默认调试串口、 ==SERIAL-B 为 M7== 的调试串口) 。

    设备管理器查看串口端口号
    设备管理器查看串口端口号

  2. 打开 MobaXterm 客户端,连接两个终端,一个连接Linux,一个连接M7。串口设置如下图:

    MobaXterm 中串口设置
  3. 将编译出来的 hello_world.bin 拷贝到 TF(Fat32 分区) 的根目录下面,将 SD 插到开发板上,重
    启开发板, 通过==敲击空格键==进入 u-boot 菜单项,输入 1 进入shell 命令行 。

    switch to partitions #0, OK
    mmc2(part 0) is current device
    a1007 auth ok!
    flash target is MMC:2
    Net:   config yt8521
    eth0: ethernet@30be0000
    Fastboot: Normal
    Normal Boot
    Autoboot in 1 seconds
    
    -------------------------------------
    1: shell
    2: boot linux
    3: Display select
    0: reboot uboot
    -------------------------------------
    
  4. 在 u-boot 命令行执行如下命令:
    对于 debug/release 版本的 bin 文件,它运行在 ==TCM==,执行下列命令:

    fatload mmc 1:1 0x48000000 iuart_interrupt.bin;cp.b 0x48000000 0x7e0000 20000
    fatload mmc 1:1 0x48000000 amk4001.bin;cp.b 0x48000000 0x7e0000 20000 
    bootaux 0x7e0000
    
    

这些命令将镜像文件从SD卡的第一个分区复制到Cortex®-M7’的存储器,并从复位中释放Cortex®-M7。

The Cortex-M7 Core Platform includes the following:
• 32 KB L1 Instruction Cache
• 32 KB L1 Data Cache
• 256 KB TCM

终端执行命令
终端执行命令

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

调试串口输出

3.2 VSCode 在线调试

步骤1:连接 JLINK 和硬件 JTAG 口

步骤2:开发板进入按空格进入Uboot阶段

步骤3:选择进入 IAR C-SPY 调试

步骤4:可进行单步调试、局部变量监控、调用堆栈、寄存器分析

3.4 开机自启动运行

  1. 用网线将开发板(上端网口)和PC连接到交换机上,并串口连接,启动后进入Linux系统,使用ifconfig命令查看开发板ip

飞凌网口连接图
飞凌网口连接图

  1. OKMX8MPQ-C板载2个千兆网卡,插入网线连接网络的情况下, 默认OKMX8MP开发板启动时固定
    eth0 IP地址为192.168.0.232。 配置如下:
    开发板IP: 192.168.0.232
    路由器IP: 192.168.0.1
    子网掩码: 255.255.255.0

    root@OK8MP:~# vi /etc/systemd/network/10-eth.network
    [Match]
    Name=eth0
    KernelCommandLine=!root=/dev/nfs
    [Network]
    Address=192.168.0.232/24
    Gateway=192.168.0.1
    DNS=192.168.0.1
    

    互相ping通

  2. 下载安装winscp并按图中配置

  3. 将固件 bin 文件拷贝到/run/media/img/img/mmcblk2p1 目录下 ,命名为forlinx_m7_tcm_firmware.bin (固定)

    • 可以设置 IAR/ARMCC 生成的文件名为 forlinx_m7_tcm_firmware.bin
    • 也可以修改直接修改生成的文件名为 forlinx_m7_tcm_firmware.bin

​ 拷贝完成后,在A核调试串口中输入【reboot】(==一定要输入reboot,直接电源开关,数据无法保存==)重启 OKMX8MPQ-C 板卡。

通过以上四步,可以实现 SCP 方式在开发 windows 主机和飞凌开发板Linux系统之间共享数据(包括 M 核生成的 bin文件)。当然也可以通过SD卡进入命令行后拷贝。

  1. 重启过程按空格键进入 uboot 命令行控制台 ,按“1”,进入shell,输入以下命令,配置自启动
# 使能 Cortex M7 核固件自启动环境变量
$ setenv load_forlinx_firmware "yes"
$ printenv bootcmd
# 将原来的 bootcmd 值前面加上 loadm7:
`` setenv bootcmd "loadm7;mmc dev ``{mmcdev}; if mmc rescan; then if run loadbootscript;then run bootscript; elif test ${fastboot_dev} = mmc1 && run loadupdate; then run mmcupdate; else if run loadimage; then run mmcboot; else run netboot; fi; fi; fi;"
$ saveenv
# 输入reset启动
$ reset
  1. 关闭自启动 FreeRTOS 固件,在 uboot 命令行终端输入以下内容:
$ setenv load_forlinx_firmware "no" 
$ saveenv 
$ reset

用户可以除/run/media/img/img/mmcblk2p1/forlinx_m7_tcm_firmware.bin 文件关闭 M7 核自启动。

如上第四、五步骤,参考OKMX8MPQ-C_MCU手册_V1.0_2021.08.25 1.4节。

  1. 强大的文本编辑器:VSCode介绍 | w3c笔记 (w3cschool.cn)

  2. IAR重大升级,支持VSCode,ST发布第一个带有处理单元的传感器-面包板社区 (eet-china.com)

  3. i.MX 8M Mini EVK快速入门指南_NXP 半导体

posted @ 2022-11-08 21:39  Oddpage  阅读(745)  评论(0编辑  收藏  举报