vscode+gcc+jlink调试mcu程序(用于替代IDE)

2023-11-03

一、前言

几年前写过一篇类似的文章,那时是用于调试rtthread系统:使用 VSCode、arm-none-eabi-gdb、J-Link GDB Server 调试RTThread

当时有关vscode和gcc调试MCU的文章很少,所以只是写了个大概。
最近又遇到了类似的问题,网上搜了一些资料,发现此方面的内容已经比较成熟了,借鉴了一些资料来完善自己这方面的知识。

参考资料:
1、GD32F307VC+WIN10+VSCODE+GCC+JLINK环境build
2、stm32的调试工具:vscode下jlink或stlink下载及调试+设置快捷键

二、Makefile配置

基础Makefile模板使用STM32CubeMX工具生成,为了节约篇幅,只介绍新增的部分。

  • 2.1、使用jlink下载到sram并运行:
    在Makefile中添加以下规则:
$(BUILD_DIR)/jlink_flash_file: $(BUILD_DIR)/$(TARGET).bin
	@-rm -fR $@
	@touch $@
	@echo usb >> $@
	@echo si 0 >> $@
	@echo speed 50000 >> $@
	@echo device $(DEVICE) >> $@
	@echo JTAGConf -1,-1 >> $@
	@echo h >> $@
	@echo rx 1 >> $@
	@echo loadbin $< $(LOADADDR) >> $@
	@echo setpc `od -N4 -t x4 -j4 $(BUILD_DIR)/$(TARGET).bin | head -1 | sed -e 's/0000004//g' -e 's/ //g'| tr -d '\n'` >> $@
	@echo g >> $@
	@echo qc >> $@

jlink: $(BUILD_DIR)/jlink_flash_file
# on gitbash
	"D:\Program Files (x86)\SEGGER\JLink\JLink.exe" -commanderscript $<
# on WSL
#	/mnt/d/'Program Files (x86)'/SEGGER/JLink/JLink.exe -commanderscript $<

其中:

  • jlink_flash_file规则:用于生成JLink.exe使用的配置脚本;

  • DEVICE = CORTEX-M7,MCU使用的是ARM Cortex-M7内核;

  • LOADADDR=0x20000000,程序下载到sram的0x20000000处;

  • setpc ,是jlink的内置命令,用于设置PC指针的值,后边的

    od -N4 -t x4 -j4 $(BUILD_DIR)/$(TARGET).bin | head -1 | sed -e 's/0000004//g' -e 's/ //g'| tr -d '\n'
    

    是通过od命令从bin文件中读取第4-7字节处的程序入口地址。

  • 2.2、使用gdb调试:
    在Makefile中添加以下规则:

JLinkGDBServer:
	"D:\Program Files (x86)\SEGGER\JLink\JLinkGDBServer.exe" -select USB -device CORTEX-M7 -endian little \
	-if JTAG -speed 50000 -noir -LocalhostOnly -nologtofile -port 2331 -SWOPort 2332 -TelnetPort 2333 &

$(BUILD_DIR)/debug.gdb: $(BUILD_DIR)/$(TARGET).bin
	@-rm -fR $@
	@touch $@
	@echo target remote localhost:2331 >> $@
	@echo monitor reset >> $@
	@echo monitor halt >> $@
	@echo load >> $@
	@echo b main >> $@
	@echo c >> $@

debug: $(BUILD_DIR)/debug.gdb JLinkGDBServer
	$(PREFIX)gdb $(BUILD_DIR)/$(TARGET).elf --command=$(BUILD_DIR)/debug.gdb

其中:

  • JLinkGDBServer规则:用于启动JLinkGDBServer.exe;

  • debug.gdb规则:用于生成gdb的配置脚本;

  • 2.3、生成反汇编:
    在Makefile中添加以下规则:

$(BUILD_DIR)/%.dis:$(BUILD_DIR)/%.elf
	@-rm -fR $@
	$(DUMP) --all-headers --demangle --disassemble $< > $@

其中,DUMP=arm-none-eabi-objdump

三、使用方法

前提条件:需要一个jlink仿真器,并安装好jlink工具软件,本人使用的是这个JLink-Windows工具

  • 3.1、程序下载到sram并运行
    • 1、将jlink插到电脑上
    • 2、使用vscode打开代码,打开终端,使用git_bash,执行:
    make jlink
    
  • 3.2、使用命令行gdb调试程序
    • 1、将jlink插到电脑上
    • 2、使用vscode打开代码,打开终端,使用git_bash,执行:
    make debug
    

四、vscode配置文件launch.json

参考自:使用VSCode编译调试IAR的stm32工程

对于习惯了使用keil、iar等IDE调试程序的人,可能不习惯上述的命令行gdb调试。此时可以借助于vscode来实现类似于IDE调试的界面,只需配置vscode的launch.json即可。本人实际调试的配置如下:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "stm32f4", //程序名
            "type": "cppdbg",
            "request": "launch",
            "targetArchitecture" : "arm", //arm架构
            "program": "${workspaceFolder}/stm32f4_project/build/stm32f4.elf", //编译生成的elf文件
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\Program Files\\gcc-arm-none-eabi-10.3-2021.10\\bin\\arm-none-eabi-gdb.exe", //gdb的安装路径
            //"miDebuggerServerAddress": "localhost:2331",
            "setupCommands" : [
                {
                    "text" : "target remote localhost:2331" //连接目标设备
                },
                {
                    "text" : "monitor reset" //复位目标设备
                },
                {
                    "text" : "monitor halt" //停止目标设备
                },
                {
                    "text" : "file E:/code/stm32f4_project/build/stm32f4.elf" //编译生成的elf文件
                },
                {
                    "text" : "load" //加载elf文件
                },
                {
                    "text" : "b main" //在main函数打断点
                }
            ],
        }
    ]
}

按上述配置后:

  • 1、先在git bash执行下面的命令,打开JLinkGDBServer:
    make JLinkGDBServer
    
  • 2、点击vscode的Run->Start Debugging,即可像IDE一样在vscode中调试代码了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vscode+gcc+jlink调试mcu程序(用于替代IDE) 的相关文章

随机推荐

  • socket.gaierror: [Errno -2] Name or service not known

    执行socket gethostbyname socket gethostname 报 socket gaierror Errno 2 Name or service not known 错误 分析记录如下 更正前 执行命令vi etc h
  • redis主从复制+sentinel集群

    Redis主从介绍 主从服务就是用户在主服务器写入数据后 从服务器在写一份数据 一般用在如下场景 1 辅助实现备份 2 高可用 主从复制只是redis高可用的前提 3 异地容灾 4 分摊负载 redis主从特点介绍 1 redis使用异步复
  • windows下在anaconda中安装tensorflow和keras

    windows下在anaconda中安装tensorflow和keras 一 在anaconda中创建一个新的python环境并安装tensorflow 1 创建环境名为tensorflow python38的python环境 python
  • 微信小程序wx.getUserProfile接口获取用户信息的使用

    前言 调整原因 很多开发者在打开小程序时就通过组件方式唤起getUserInfo弹窗 如果用户点击拒绝 无法使用小程序 这种做法打断了用户正常使用小程序的流程 同时也不利于小程序获取新用户 调整策略 推荐使用 wx getUserProfi
  • 【Seata】03 - Seata AT 模式全局锁相关知识简单整理

    文章目录 前言 参考目录 版本说明 分析整理 1 全局锁的引入说明 2 全局锁相关源码整理 2 1 流程简图 2 2 事务分支注册前的 SQL 相关操作 2 3 注册分支 获取全局锁 前言 上一篇文章介绍了 AT 模式的调用流程 但是有个比
  • Unity位置动画

    1 场景中创建一个Cube 2 为这个Cube添加Animator组件 3 选中这个Cube 然后选择Window Animation 打开animation窗口 下面就开始K关键帧了 很简单 两步走 1 选中这个Cube对象 在第0帧 移
  • Java读取.zip文件为ZipInputStream,并读取压缩文件。

    最近遇到一个需求 要调取接口获取一个zip文件流 解析zip包 读取启动的文件内容来进行业务处理 以下是处理读取zip压缩包方法 话不多说直接上代码 读取zip文件流 解析压缩文件 public static void main Strin
  • 【blockly教程】第一章 Google Blockly教学应用手册

    1 1 Google Blockly概述 美国计算科学教育一直认为计算机作为当今各个领域的基础技术工具 有必要让学生尽早的了解和学习计算机工作原理 理解基础的编程思维 在2006年周以真教授提出计算思维概念 这很大程度上促进了人们对计算机编
  • POI getDataFormat() 格式对照

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 参照org apache poi ss usermodel BuiltinFormats的说明 Open Declaration org apache poi ss use
  • C#获得DataGrid单元格的值

    WPF中的DataGrid控件类似于WindowsForm中的DataGridView 但是DataGridView中的单元格值获取非常简单直观 如下 string cellvalue datagridview Rows rowindex
  • RuntimeError: CUDA error: device-side assert triggered

    RuntimeError CUDA error device side assert triggered解决办法 这是由于数据标签默认是从0开始的 比如标签类别为5类 默认是 0 1 2 3 4 而自己是 1 2 3 4 5 只需要在标签数
  • Scala的基础语法(超详细版)

    Scala的基础语法 文章目录 Scala的基础语法 1 声明值和变量 2 数据类型 3 算术和操作符重载 4 控制结构语句 4 1条件分支语句 4 2循环语句 5 方法与函数 5 1方法 5 2 函数 5 3 方法转换成函数 1 声明值和
  • python爬虫-北京租房可视化分析

    目的 使用scrapy框架爬取租赁信息 对数据进行处理利用python中的seaborn matplotlib库进行可视化分析 最后查看昌平区待租量排前十小区对应地铁站点 及其平均租房价格 1 爬虫 使用scrapy框架爬取beike租房信
  • chatGPT做算法题

    今天突发奇想 自己编了一道算法题让newbing和chatgpt做 问newbing后 没搜索到相关内容 回复无法理解题目 问chatGPT后给出了回答 见下图 一开始我很震惊 算法居然如此简洁 我知道这个题可以用动态规划解 但是算法也没有
  • CocosCreator查找图片引用

    相信大家可能需要查找图片在哪个Prefab中使用到 于是我们像下图这样查找一下 查找的时候CocosCreator会给出我们查找的图片资源的uuid 比如 我的uuid 33a791ca 5a28 4c2a b451 7c6b8f9a037
  • 简单C语言两数相加

    在C语言中 相加两数是一个基本的要求 但其实也有复杂操作 比如高精度加法 或者链表相加 还要考虑进位 都是比较难的 那么今天我们来聊一聊简单的problem a b 先发代码 include
  • hiveSQL基本语句三-----连接查询--inner join、left join、full join、union all、union

    一 inner join 连接2个表 取出公共部分 必须重命名 on后连接条件键值唯一 连接前注意去重 提高效率 inner可省略 select from user list 1 as a inner join user list 2 as
  • keras图像风格迁移

    风格迁移 在内容上尽量与基准图像保持一致 在风格上尽量与风格图像保持一致 1 使用预训练的VGG19网络提取特征 2 损失函数之一是 内容损失 content loss 代表合成的图像的特征与基准图像的特征之间的L2距离 保证生成的图像内容
  • 创客教育的法则

    认为创客教育顾名思义是创造客户价值的意思 那可就错了 创客是教育培训行业里的一个专用名词 属于新型创新的模式 格物斯坦提醒 想要进行创客教育的学生 老师以及家长们 要谨慎选择合适的创客教育培训机构 这样才能万无一失 核心注重课程体系的自主研
  • vscode+gcc+jlink调试mcu程序(用于替代IDE)

    一 前言 几年前写过一篇类似的文章 那时是用于调试rtthread系统 使用 VSCode arm none eabi gdb J Link GDB Server 调试RTThread 当时有关vscode和gcc调试MCU的文章很少 所以