本系列介绍飞凌 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插件
所需要的插件为:
-
ARM assembly :Arm® assembly highlighting for Visual Studio Code
-
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.
-
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.(非官方,可删除) -
IAR Build:Build and develop your IAR Embedded Workbench projects from Visual Studio Code (带蓝色标志,IAR System官方)
-
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](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955715-840870966.png)
1.2 配置相关插件
IAR Build 安装完成后,在侧边栏会出现其图标,点击后配置 IAR Embedded Workbench 位置和工程名称。
![forlinx01_introduction_IDE_02](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955671-1163837684.png)
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 工程代码了。
![](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213956552-244622221.gif)
但是工程管理,比如常用的添加模块,头文件路径,更改调试方式等,就需要去IAR中操作了。一个小技巧是,在VSCODE 文件夹下,找到 .eww
文件,快捷键(”ctrl+alt+o“)使用默认的应用程序(即IAR)打开IAR工程进行管理。
![](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955709-757533002.png)
1.5 IAR快速修改工程名称
第一步:修改工程名称
将工程文件夹下后缀为“dep、ewd、ewp、eww”的四个文件重命名为目标名称。
![](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955845-1438776050.png)
第二步:修改工程内容
用编辑器(记事本或者UE)打开“eww”后缀的文件,修改目的路径的“project.ewp”为目标名称。
![](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955909-946242249.png)
第三步:修改编译输出文件
建议在工程文件中,输出设置为相对路径及名称设置为与获取工程名,则只需执行第一、第二步即可,不需手动修改。
更改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
3.1 使用 u-boot 运行-
串口线连接,查看设备管理器串口端口号
a. 安装CH343SER驱动,连接PC和开发板调试端口。
b. 打开 PC ”设备管理器“查看串口端口号,以电脑实际识别的端口号为准(==SERIAL-A 为 Linux== 的默认调试串口、 ==SERIAL-B 为 M7== 的调试串口) 。
设备管理器查看串口端口号 -
打开 MobaXterm 客户端,连接两个终端,一个连接Linux,一个连接M7。串口设置如下图:
-
将编译出来的 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 -------------------------------------
-
在 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
![终端执行命令](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955773-719066522.png)
在 M7 的调试串口工具上可以看到打印信息如下 :
3.2 VSCode 在线调试
![](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955814-457349236.gif)
步骤1:连接 JLINK 和硬件 JTAG 口
步骤2:开发板进入按空格进入Uboot阶段
步骤3:选择进入 IAR C-SPY 调试
步骤4:可进行单步调试、局部变量监控、调用堆栈、寄存器分析
3.4 开机自启动运行
- 用网线将开发板(上端网口)和PC连接到交换机上,并串口连接,启动后进入Linux系统,使用ifconfig命令查看开发板ip
![飞凌网口连接图](/i/l/?n=22&i=blog/2689124/202211/2689124-20221108213955906-1433321929.png)
-
OKMX8MPQ-C板载2个千兆网卡,插入网线连接网络的情况下, 默认OKMX8MP开发板启动时固定
eth0 IP地址为192.168.0.232。 配置如下:
开发板IP: 192.168.0.232
路由器IP: 192.168.0.1
子网掩码: 255.255.255.0root@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通
-
下载安装winscp并按图中配置
-
将固件 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卡进入命令行后拷贝。
- 重启过程按空格键进入 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
- 关闭自启动 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节。
-
强大的文本编辑器:VSCode介绍 | w3c笔记 (w3cschool.cn) ↩
-
IAR重大升级,支持VSCode,ST发布第一个带有处理单元的传感器-面包板社区 (eet-china.com) ↩
-
i.MX 8M Mini EVK快速入门指南_NXP 半导体 ↩