0


VsCode搭建交叉编译环境

VsCode搭建交叉编译环境

一、前言

由于最近做的项目治具需要用到APM32的芯片,加上又不赶时间,所以就想着使用经常用的vscode搭建一个交叉编译环境来开发,在此记录一下整个环境搭建、程序编译、debug的过程;整个过程会使用到GitBash或cmd执行指令、gcc交叉编译器进行编译、mingw包执行make指令、openocd进行下载调试,下面逐一介绍具体步骤。

二、工程搭建
2.1、需要一个怎样的工程
  • 像在keil中,预处理、编译、汇编、链接这四大步骤都已封装好了,可以通过点击编译选项全部执行完成,而具体的细节都已经被屏蔽了;一个工程中必不可少的文件就是.ld链接文件、.s启动文件、对应的库文件,而这么多文件都需要指令来进行处理,这个时候就需要借助make来管理工程了,也就是还需要一个makefile文件来管理整个工程;
  • .ld链接文件、.s启动文件、对应的库文件、makefile,这四个文件就是工程中必不可少的了,如果说都由自己从0实现的话,这可太折腾人了,所以就需要借助一个工具(CubeMAX),将需要的四个文件都先初步实现,(注意:CubeMAX是生成STM32工程的,但是APM32也兼容);
  • 这里就不详细介绍CubeMAX搭建工程的详细步骤了,只需要注意最后选择IDE记得选择Makefile。

Description

CubeMAX生成的工程文件目录:

Description

2.2、.ld文件的作用

解释一下.ld文件的作用,总共实现了三大部分的作用,定义了程序的入口位置(Reset_Handler)、定义了堆栈空间的大小和RAM、FLASH的内存范围、定义了SECTIONS段在内存中的分布情况。

Description

2.3、.s文件作用

在.ld文件中已经定义了程序的入口位置 Reset_Handler,所以直接从入口开始分析:

  • 首先让堆栈指针SP指向RAM内存首地址;
  • 再去进行时钟系统初始化;
  • 将数据从FLASH中搬运到RAM中;
  • 初始化全局参数,进入main函数;
  • (中断向量表的地址确定、弱定义、以及一些参数设置,默认为全局参数最先执行)。

Description

2.3、makefile文件作用

makefile中定义了编译规则,指定了编译命令、编译文件、头文件路径、编译参数、链接库等等参数,入口默认从all开始,依次执行对应的依赖文件.elf、.hex、.bin,若文件不存在或时间戳被改变都会重构对应的依赖文件。

Description

三、环境安装
3.1、gcc工具链下载

gcc工具链的下载地址:gcc工具链下载地址,(注意要下载win版本的);下载完成后解压到自己想要放置的文件夹中(记住自己的解压路径,后面需要用到)。

Description

3.2、ming工具链下载
  • mingw选择进入官网下载最新版本的,下载地址:mingw下载地址;

Description

我其实是电脑中本来就安装了mingw的,不是特地为了搭建这个编译环境安装的,而是mingw中恰好有make工具,才选择了mingw的;若有单独的make工具或更加简洁的工具包去实现make工具的功能,也可以不安装mingw;

  • 到./mingw/bin目录中找到mingw32-make.exe,将其复制一份改成make.exe,便于后续输入make就能执行,而不用输入mingw32-make;

Description

  • 将make.exe的路径添加到环境变量Path中,这样每次在命令行中输入make就能根据路径找到对应命令了。

Description

3.3、openocd工具安装

openocd是一个开源的调试器,通过调试仿真器(ST-LINK、J-LINK),就能够对各种嵌入式设备进行下载调试;我是在Github上面下载的源码,下载地址:openocd下载地址,选择对应的win版本,下载完成之后,解压到自己想放置的文件夹中(记住放置路径,后续还需要使用到)。

Description

四、工程编译下载调试
4.1、工程编译
  • 使用VsCode打开使用CubeMAX生成的工程文件,打开命令行终端(若没有GitBash,也可以选择使用默认的PowerShell);

Description

  • 修改Makefile文件,添加编译工具链(也就是前面解压的gcc源码包):
PREFIX = arm-none-eabi-
GCC_PATH = C:/ASoftward_Loc/VSCODE/arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi/bin
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -
  • 修改完Makefile文件后,在命令行终端中输入 make ,再按下回车键,即可开始编译整个工程;

Description

  • 编译成功后,显示的log信息,显示.elf、.hex、.bin文件都已经生成;成功之后会在工程的根目录中生成一个build文件夹,所有编译信息和可执行文件都在build文件夹中。

Description

4.2、工程下载
  • 我已经将下载程序的指令添加到Makefile中(因为指令太长了),后面只需执行make download就能执行对应的指令了。 - stlink.cfg:ST-LINK的接口配置,如果要使用J-LINK,就需要修改此配置文件;- apm32f0x.cf:amp芯片的接口配置文件,是我根据stm32f0x.cfg修改而来,后面再详细讲述;- init:初始化调试器和目标硬件;- halt:暂时微控制器的执行动作;- program … .hex:下载.hex程序;- reset:复位目标芯片;- shutdown:关闭openocd和微处理器的连接;
# download
OPENOCE_PATH = C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4
download:
    $(OPENOCE_PATH)/bin/openocd \
    -f $(OPENOCE_PATH)/openocd/scripts/interface/stlink.cfg \
    -f $(OPENOCE_PATH)/openocd/scripts/target/apm32f0x.cfg \
    -c init \
    -c halt \
    -c "program ./build/dc_atomi_inhaletool_v1.0.hex" \
    -c reset \
    -c shutdown
  • 将调试器和硬件设备连接成功后,命令行终端中输入 make download 就能直接下载程序,下载命令和下载信息如下所示:
make download
C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/bin/openocd \
-f C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/openocd/scripts/interface/stlink.cfg \
-f C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/openocd/scripts/target/apm32f0x.cfg \
......
** Programming Started **
Info : device id = 0x20006440
Info : flash size = 64 KiB
Warn : Adding extra erase range, 0x08002a74 .. 0x08002bff
** Programming Finished **
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
shutdown command invoked
  • 如何将stm32f0x.cfg修改成apm32f0x.cfg: - 先将上方Makefile文件中的apm32f0x.cfg名称修改成stm32f0x.cfg,再执行make download指令,就会得到如下log信息:make downloadC:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/bin/openocd \-f C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/openocd/scripts/interface/stlink.cfg \-f C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/openocd/scripts/target/stm32f0x.cfg \......Info : clock speed 1000 kHzInfo : STLINK V2J37S7 (API v2) VID:PID 0483:3748Info : Target voltage: 3.253263Warn : UNEXPECTED idcode: 0x0bc11477Error: expected 1 of 1: 0x0bb11477- log信息显示的是,检测到连接的芯片idcode是0x0bc11477,但是.cfg芯片的接口配置文件中的idcode是0x0bb11477,考虑到apm32这款芯片兼容stm32的程序,我估计其它参数都是一样的,所以直接复制一份stm32f0x.cfg文件,将其改名为apm32f0x.cfg,并且将文件内的0x0bb11477全部修改成0x0bc11477,不出所料,改完之后就能成功下载了。
4.3、工程调试
  • 到VsCode插件应用中下载 Cortex-Debug 插件,这是一款能够支持Cortex系列芯片进行可视化Debug的插件;

Description

  • 下载完成后,需要在 Setting.json 文件中设置交叉工具链的路径,此路径的设置用于 Cortex-Debug 插件,因为 Cortex-Debug 插件还需要通过此路径执行启动gdb、读取符号信息等命令;
{"cortex-debug.armToolchainPath":"C:/ASoftward_Loc/VSCODE/arm-gnu-toolchain-13.3.rel1-mingw-w64-i686-arm-none-eabi/bin",}
  • 当工具链的路径配置完成后,就配置调试信息,需要在launch.json中配置; - cwd:指定工作目录路径;- executable:指定可执行文件,.elf带有是带有调试信息的文件;- name:调试时的项目名称;- request:指定请求类型,"launch"表示启动新的调试会话;- type:指定调试器类型;- runToEntryPoint:指调试启动自动运行到指定的函数;- servertype:指定调试器类型;- configFiles:指定的是openocd的配置文件;- showDevDebugOutput:是否输出debug详细信息;
{"version":"0.2.0","configurations":[{"cwd":"${workspaceRoot}","executable":"${workspaceFolder}/build/dc_atomi_inhaletool_v1.0.elf","name":"Debug","request":"launch","type":"cortex-debug","runToEntryPoint":"main","servertype":"openocd","configFiles":["C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/openocd/scripts/interface/stlink.cfg","C:/ASoftward_Loc/VSCODE/xpack-openocd-0.12.0-4-win32-x64/xpack-openocd-0.12.0-4/openocd/scripts/target/apm32f0x.cfg"],"showDevDebugOutput":"raw",}]}
  • 以上配置都完成后,就可以开始进行Debug操作了,如下图所示,便是Debug成功的界面了,在界面中能监控变量参数、设置断点参数、选择步进参数、查看寄存器参数、查看内存参数等等。

Description

4.4、Debug时,Cortex-Debug插件和芯片之间对应关系

关于 Cortex-Debug 插件是怎么样执行的,这一点我也是瞎猜的,不知道对不对,先贴上一个关系示意图吧:

Description

我想的是Cortex-Debug本身只是一个可视化的辅助工具,具体的启动gdb、读取可执行文件的符号信息就是调用"交叉工具链实现的";启动gdb-server、读取寄存器参数、执行步进等操作就是调用OpenOCD实现的。

标签: vscode ide 编辑器

本文转载自: https://blog.csdn.net/weixin_50460833/article/details/142384735
版权归原作者 pkq749 所有, 如有侵权,请联系我们删除。

“VsCode搭建交叉编译环境”的评论:

还没有评论