CN / EN
CN / EN

写技术文章

如何在VSCode中调试GR5xx程序

Seiyou

汇顶员工
2024-01-16 15:48:36

0.简介

本文将简单介绍如何借助Cortex-Debug插件在VSCode中对GR5xx上的程序进行调试。

1.环境准备

本文基于VSCode 1.85.0版本编写,请保证安装的VSCode尽可能的新来避免兼容性问题

Cortex-Debug插件依赖J-Link驱动与gcc-arm-none-eabi工具链,请确保已经正确安装了上述内容。安装教程请参考GR5526 GCC用户手册GR551x GCC用户手册

在确保上述依赖正确安装之后,进行Cortex-Debug插件的安装:

在VSCode中,按下Ctrl+P,输入下面的内容并回车来安装插件:

ext install marus25.cortex-debug

安装完成后,在左边会自动弹出插件管理,显示已经安装的Cortex-Debug插件:

至此,环境准备就全部完成了。

2.启动调试

2.1 创建launch.json配置文件

使用VSCode打开项目文件夹,在左边工具栏点击“调试”,进入调试配置界面:

点击创建 launch.json文件的蓝色字样,在弹出的选择调试器下拉框中选择Cortex-Debug

此时Cortex-Debug会自动在.vscode文件夹中创建launch.json文件,并写入模板配置:

接下来修改配置中的内容,下面是模板中几个字段的介绍和修改方法:

  • name:调试项的名字,可以任意修改,名字会在调试与运行窗口中显示,可用于区分调试不同目标。
  • cwd: 运行GDB命令的目录,保持默认即可。
  • executable:调试的可执行文件,在不同的编译器下得到的可执行文件命名不尽相同,下面是GR5xx支持的三种主流编译器得到的可执行文件后缀名与常见位置,请根据实际情况将要调试的可执行文件的路径填入该配置项: 在Keil的编译结果中,该文件的后缀名为.axf,通常位于Keil_5/Objects/文件夹中。 在IAR的编译结果中,该文件的后缀名为.out,通常位于IAR/Debug/Exe/文件夹中。 在GCC的编译结果中,该文件的后缀名为.elf,通常位于GCC/out/lst/文件夹中。
  • request:调试请求类型,可以根据实际情况选择launch(调试前Reset)或者attach(调试前不Reset)。
  • type:调试类型,保持cortex-debug即可,不要修改。
  • runToEntryPoint:入口断点,Launch或Reset后调试器将自动运行到该配置项所设置的函数处停下。绝大多数情况下保持默认值的main即可,如果有特殊需求,可根据需求进行修改(例如调试更加靠前的Reset_Handler)
  • serverType:调试器类型,保持jlink即可。 目前GR5xx SDK只提供了jlink支持,其他类型的调试器需要自行适配,可根据具体情况修改。不同调试器对配置文件的要求也不一样,本文将只介绍JLink相关配置,其他调试器的要求请查阅Cortex-Debug项目Wiki。

除了上述模板内容,使用JLink作为调试器进行调试还有1个参数需要设置:

  • device:调试设备的类型,对于GR5xx设备设置为"cortex-m4"即可。

下面将展示基于示例工程projects/ble/ble_peripheral/ble_app_template_freertos,使用Makefile+GCC进行编译构建得到可执行文件的launch.json内容:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "ble_app_template_freertos",
            "cwd": "${workspaceFolder}",
            "executable": "projects/ble/ble_peripheral/ble_app_template_freertos/GCC/out/lst/ble_app_template_freertos.elf",
            "request": "launch",
            "type": "cortex-debug",
            "runToEntryPoint": "main",
            "servertype": "jlink",
            "device": "cortex-m4",
        }
    ]
}

2.2 启动调试

在按要求配置好launch.json之后,就可以开始调试了。在VSCode左边工具栏找到调试按钮,点击进入运行与调试面板,确保在下拉框中选中刚刚创建的调试目标,点击绿色三角箭头开始调试。或者直接按下快捷键F5:

此时插件会自动运行JLinkGDBServerarm-none-eabi-gdb并设置相关参数,等待一小段时间,当程序运行到main()函数时,由于之前配置的入口断点,调试器会自动停在main()函数的第一行:

至此,VSCode调试GR5xx程序的整个流程已经完全跑通了,下面将针对一些VSCode调试与Cortex-Debug的常用功能做简单介绍。

3. 常用功能

3.1 基本功能

在开始调试后,运行和调试窗口会显示下面的内容:

最上方的是变量窗口,用于显示调试过程中的变量,在窗口中又区分了本地变量(Local)全局变量(Global)静态变量(Static)寄存器(Register)。点击其中一项可以展开查看具体内容,例如查看寄存器的值:

点击右上角的0x图标,可以将值的显示切换到16进制,更加符合调试习惯:

变量窗口下面的是监视窗口。在监视窗口中我们可以编写表达式,在暂停时将直接显示表达式的值,这对于调试结构体来讲是非常有用的。例如这里填入中g_calendar_time.sec,运行一段时间,点击暂停,就可以看到对应的值产生了变化:

img-20240115192104.png

监视窗口下面的是调用堆栈窗口。暂停时,该窗口将显示当前运行点的整个调用栈,例如当程序运行到wfe_func()中暂停时,如图所示:

单击每一项都可以直接跳转到源码的对应位置。

最后是断点窗口。所有的断点都会显式在此处,可以在该窗口添加断点,可以在编辑窗口中添加:

在VSCode中也可以使用单步调试。在进入调试模式后,编辑窗口中间上边沿会显示调试按钮工具条:

从左到右依次是:

  • Reset设备
  • 继续(程序运行时则为暂停)
  • 逐过程
  • 单步
  • 单步跳出
  • 重启
  • 断开连接

这些操作也可以使用快捷键完成:

  • F5 继续
  • F6 暂停
  • F10 逐过程
  • F11 单步
  • Shift+F11 单步跳出

3.2 GDB命令行

VSCode的调试是基于GDB进行的,所以自然也支持直接通过GDB命令进行调试。按下Ctrl+Shift+P打开命令输入框,输入调试控制台Debug Console,找到
查看:切换调试控制台选项,或直接使用快捷键Ctrl+Shift+Y,打开调试控制台

在这里就可以直接使用GDB命令进行调试了,例如我想从0x00800000读取一个4字节:

3.3 数据断点

在VSCode中调试同样支持数据断点调试。在任意位置暂停后,在变量窗口中找到要监测的变量,右键:

其中“值读取时中断”,“值更改时中断”,“值访问时中断”就是数据断点。点击添加后在断点窗口中就能看到添加的数据断点,并且在该变量的值被修改(或读取,访问)时就会停下。

从图中可以看到,当g_calendar_time的值被读取时,运行停止了。此时在VSCode在调用堆栈窗口可以看到是由Data Breakpoint引起的暂停,且暂停的位置就是g_calendar_time值的位置。

3.4 FreeRTOS插件

得益于JLink GDB Server提供的Thread Aware Debugging能力,VSCode + Cortex-Debug可以直接在调试器中显示RTOS相关的信息。这里以FreeRTOS为例进行介绍,其他RTOS的支持情况请自行查阅SEGGER官网

launch.json中添加如下配置:

让Cortex-Debug调试时加载JLink的FreeRTOS插件。此时再调试使用了FreeRTOS的项目,当程序运行到FreeRTOS调度器启动之后暂停,此时在左侧的调用堆栈窗口就会额外显示当前所有Task的状态:

显示内容包括所有Task的优先级,状态,以及在Task切换之前的调用栈,对于使用FreeRTOS的项目来讲是非常有用的一个功能。


VSCode的调试功能非常强大,文中介绍的仅仅是冰山一角,其他的实用功能可以通过阅读VSCode官方的Debugger指南,或者查阅网上的其他资料。

1收藏

1赞成

您的评论
我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注