1. 环境搭建
本节了描述了使用VSCode + ARM_toolchain + Jlink server(or OpenOCD)开发的环境
demo附后
1.1 软件安装
1.1.1 软件与工具清单
- 基本工具
- vscode:编辑器,基本环境,安装cortex-debug组件
- GNU Arm Embedded Toolchain: 不建议下载最新版,笔者下载的是GNU Arm Embedded Toolchain 9-2020-q2-update这个版本,最新版本会有问题,暂未解决
- Mingw-w64 GCC for Windows 64 & 32 bits:安装(或解压缩)完毕, 会得到一个bin目录(后面要添加系统环境变量里面Path)。安装之后添加环境变量之后,可以将bin目录下的mingw32-make.exe重命名为make.exe,后续即可直接使用make命令。
- 使用openocd时:
- openocd:一个开源的片上调试器(Open On-Chip Debugger),OpenOCD建议直接下载编译好的可执行文件
- zadig:用来装jlink 的USB驱动的,Jlink插上就能装驱动,但是直接装的OpenOCD识别不到。不用JLink可视这条。
- 使用cmake构建工程时:
1.1.2 安装,添加环境变量
Arm工具链安装目录下的bin文件夹和openOCD安装目录下的bin文件夹都添加到PATH环境变量中。可打开powershell,分别键入如下命令,若看到版本信息,则说明安装成功
arm-none-eabi-gcc --v
arm-none-eabi-gdb --v
openocd --version
make -v
cmake -version
1.2 编译
编写好Makefile或者配置Cmake的脚本进行make编译整个工程,需要编译出*.elf文件用以调试
1.3. debug-使用Jlink GDB Server
1.3.1 svd文件
SVD是一个组件,它包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件。简单来说,VS Code可以通过它来知道外设寄存器的地址分布,从而把寄存器内容展示到窗口中。
1.3.2 配置VS Code的调试功能
代码编译完成后,按下ctrl+shift+d,若工程中没有launch.json文件,出现下图,点击创建launch.json文件,选择cortex-debug
在json文件中输入如下内容
{
"configurations": [
{
"name": "${workspaceRootFolderName}",
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}/${workspaceRootFolderName}/${workspaceRootFolderName}.elf",
"request": "launch",
"type": "cortex-debug",
"device": "MM32F3277G9P",
"runToEntryPoint": "main",
"showDevDebugOutput": "raw",
"servertype": "jlink",
"svdFile": "MM32F3270.svd",
}
]
}
解释几个选项:
- “executable”:编译出的二进制文件,也就是最终烧录到单片机中的,这里是elf文件。根据芯片的不同,可能产生不同的名称和后缀
- “request”:可以选launch或attach。launch是指启动调试时同时开始执行程序;attcah是指程序已经在运行了,然后开始调试。未测试过attach。
- “type”:调试的类型,选cortex-debug,这是我们装的插件。
- “device”:目标芯片,如果使用J-LINK GDB Server时必须要设置。
- “svdFile”:svd文件的路径。
- “servertype”:要选择的gdb server。
- “name”:工程名字
保存后,按下F5即可自动烧录并且debug。
1.4 debug-使用openocd
(TBD)
2 armccV5与arm_noneabi_gcc对比
以下对比在编译内容与文件相同的情况下,除启动文件不同。优化等级均为0
2.1 编译出的文件大小
- armcc编译出的文件
- arm_noneabi_gcc编译出的文件
可明显看出无论是调试文件,十六进制文件与二进制文件,gcc编译出的文件大小均比armcc大
2.2 log信息
- armcc
- 烧写的时,占用FLASH的段为: Code + RO-data + RW-data = 7924
- 程序运行时,芯片内部RAM占用的空间为:RW-data + ZI-data = 2160
- arm_noneabi_gcc
- 烧写的时,占用FLASH的段为: FLASH = text + data = 30720
- 程序运行时,芯片内部RAM占用的空间为:RAM = bss + data = 3940
使用gcc开启多核编译时编译效率比armccv5高,但编译后的文件体积更大,胜在免费
若有不对,望指正
demo下载