VSCode + GDB + J-Link 单片机程序调试实践

VSCode + GDB + J-Link 单片机程序调试实践

本文介绍如何创建VSCode的调试配置,如何控制调试过程,如何查看修改各种变量。

安装调试插件

  • 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件
    在这里插入图片描述

在这里插入图片描述

创建调试配置

  • 在 Run and Debug 窗口点击 create a launch.json file ,弹出窗口选择 Cortex Debug 。将创建一个默认的配置文件。
    在这里插入图片描述

修改默认配置

  • 修改 executable 字段,填入待调试的程序文件名,注意:必须是 elf 格式,不是 hex 或 bin 。
  • 修改 device 字段,填入 MCU 型号。
  • 可选修改 name 字段,填入易理解的名称,这是区分不同调试配置的名称。
  • 可选添加 svdPath 字段,如果需要查看外设寄存器。
    在这里插入图片描述

启动调试

  • 完成配置后, Run and Debug 窗口将显示调试配置名称,点击绿色三角形 StartDebugging 按钮启动调试,如下图所示。
    在这里插入图片描述

  • 启动调试后,将在窗口上方显示调试工具栏,如下图所示。
    在这里插入图片描述

调试工具栏

  • 第一个按钮为 Reset device 。复位 MCU ,重新从 main 开始执行。
    在这里插入图片描述

  • 第二个按钮为 Continue ,连续执行,即 Run 操作。连续执行期间,该按钮将变成 Pause 按钮,点击Pause 按钮将暂停 CPU 的执行,即Halt 操作。
    在这里插入图片描述
    在这里插入图片描述

  • Step Over 按钮,单步执行,碰到函数,将函数作为一个步骤执行。

  • 若当前焦点在源代码窗口,则执行语句单步。

  • 若当前焦点在反汇编窗口,则执行指令单步。
    在这里插入图片描述

  • Step Into 按钮,单步执行,碰到函数则进入函数。

  • 若当前焦点在源代码窗口,则执行语句单步。

  • 若当前焦点在反汇编窗口,则执行指令单步。
    在这里插入图片描述

  • Step Out ,执行完当前函数剩余语句并返回调用处后暂停。即 Return操作。
    在这里插入图片描述

  • Restart ,重新开始,复位MCU ,重新从 main 开始执行。与 Reset device 按钮等效。

  • 但是,点击过 Restart 按钮后,结束调试时,调试工具栏不会消失,因此推荐使用 Reset device按钮。
    在这里插入图片描述

  • Stop ,结束调试。
    在这里插入图片描述

添加断点

  • 在源代码窗口行号左侧点击添加断点。
    在这里插入图片描述

  • 在 BREAKPOINTS 窗口点击加号图标添加函数断点。
    在这里插入图片描述

查看调用栈

  • CALL STACK 窗口查看当前调用栈,下方函数调用上方函数。
    在这里插入图片描述

查看局部变量和 CPU 寄存器

  • 在 VARIABLES 窗口的 Local 分类下查看函数局部变量。
  • 在 VARIABLES 窗口的 Registers 分类下查看 CPU 寄存器。
  • VARIABLES 窗口还可以查看全部全局变量和当前源文件的静态变量,这里列出的变量太多了,不利查看,要查看全局变量可以将全局变量添加到 WATCH窗口。
    在这里插入图片描述

查看全局变量

  • 选中全局变量,弹出右键菜单,选择 Add to Watch ,将全局变量添加到 WATCH 窗口。
    在这里插入图片描述

  • 也可以在 WATCH 窗口点击加号按钮添加全局变量到 WATCH 窗口。
    在这里插入图片描述

查看外设寄存器

  • XPERIPHERALS 窗口查看外设寄存器。
  • 若未在调试配置中指定 svdPath ,那么外设寄存器窗口将不可见。
    在这里插入图片描述

查看反汇编

  • 在 CPU 被 halt 的状态下,在源代码窗口点击右键选择Open Disassembly View 打开反汇编窗口。
  • 可以拖动反汇编窗口,使其与源代码窗口并排,以便对照。
  • 单步执行时,若焦点在源代码窗口,那么执行语句单步,若焦点在反汇编窗口,那么执行指令单步。
    在这里插入图片描述

在线监视变量

  • 若在调试配置中设置了liveWatch 字段,将支持 Live Watch ,即在线监视变量。
  • 添加到 CORTEX LIVEWATCH 窗口中的变量在CPU 执行期间将定时读取其数值,并在窗口内显示。
  • 其它方式查看变量值时需要将CPU 停下,而 Live Watch 可以在不暂停 CPU 执行的情况下定时更新变量值。
    在这里插入图片描述

查看操作系统任务列表

  • Cortex-Debug 插件包含 XRTOS 窗口,可以自动检测程序是否使用了操作系统,并可以查看所支持的操作系统任务列表,如下图所示, XRTOS 检测到当前程序使用了 uC/OS-II ,并列出了所有任务,包括任务优先级、任务名称、堆栈使用情况。
    在这里插入图片描述

添加 Watchpoint

  • VSCode 图形界面未找到添加Watchpoint 的入口。

  • 可以通过调试器命令行窗口输入调试命令的方式添加Watchpoint 。

  • 在 DEBUG CONSOLE 窗口输入 watch OSRunning 添加Watchpoint 监视 OSRunning被修改的位置。
    在这里插入图片描述

  • DEBUG CONSOLE 输入 info break 可以查看添加的Watchpoint 。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解相似度计算方法及其应用场景

详解相似度计算方法及其应用场景 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨相似度计算方法及其在实际应用中的场景。 什么是相似度计算…

Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令

注意:tac命令是倒置输出文件内容 #### tac - **作用:倒叙访问文件内容** - 格式:tac 参数 文件名 - **例如:** **tac /etc/passwd** #### more 命令 - 作用:翻页查看文件内容,适合内容较多的文件查看…

ingress代理前后端服务跨域

一、前言 ingress对于前后端服务的代理有不同的方式可以实现,前后端服务可以通过不同的域名实现流量的分流策略,不过这需要解决前后端域名不同产生的跨域问题,也可以通过不同的path实现流量的分流策略,该方式不会产生跨域的问题 …

Apipost接口测试工具的原理及应用详解(二)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为…

debian linux E: 无法定位软件包

原因是国内镜像站全寄了,你设国内源没用!,换成官方的然后懂? sudo vim /etc/apt/sources.list添加debian官方源 deb https://deb.debian.org/debian/ bullseye main contrib non-free deb-src https://deb.debian.org/debian/ bullseye mai…

AI 创业者的探索之路——从 Lester Holt 的访谈中汲取灵感

随着人工智能技术的快速发展,越来越多的创业者开始关注这一领域。在最近的一次采访中,Lester Holt 分别与 OpenAI 的 Sam Altman 和 Airbnb 的 Brian Chesky 进行了深入交流,探讨了 AI 技术的发展、应用以及对个人和社会的影响。本文将总结这次访谈中的关键点,并为 AI 创业…

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇11基于stm32的智能水质检测系统 🧿创作不易,拒绝白嫖可私 一、功能介绍 -------------…

昇思MindSpore学习笔记2--快速入门

一、环境准备 安装minspore模块 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.3.0rc1 导入minsporei mport mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.d…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

spring常用方法

1. 读取配置文件信息 方式一: // 获取文件路径 String fileName "application.yaml"; String filePath this.getClass().getClassLoader().getResource(fileName).getPath();BufferedReader bufferedReader new BufferedReader(new FileReader(path)…

《昇思25天学习打卡营第5天 | 网络构建》

《昇思25天学习打卡营第5天 | 网络构建》 目录 《昇思25天学习打卡营第5天 | 网络构建》什么是神经网络模型构建一个用于Mnist数据集分类的神经网络模型定义模型类模型层nn.Flattennn.Densenn.ReLUnn.SequentialCellnn.Softmax 模型参数 想要学习神经网络模型的构建&#xff0c…

Bazel plugin for Visual Studio Code

语法突出显示 Bazel Build Targets 树显示工作区中的构建包/目标BUILD 文件中的 CodeLens 链接可通过单击目标直接启动构建或测试Buildifier 集成以检查和格式化您的 Bazel 文件(需要安装 Buildifier)tasks.json 的 Bazel Task 定义在构建期间调试 .bzl…

C++:静态断言内存对齐

静态断言 C中的断言assert (1)直接参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (2)C的assert是运行时检测发现错误,而不是编译时 (3)C在编译时错误用#error来输出C静态断言 (1)C引入static_assert(表达式, “提示字符串”)来实现编译时的静…

window搭建git环境

1.下载安装window下git专用软件scm 从Git for Windows 官网网站下载,并且一路安装即可 安装成功后通过桌面快捷图标Git Bash点击打开 安装后软件应该会自动帮助配置环境变量,如果没有需要自己配置使用 2.git环境配置 2.1设置姓名和邮箱(github上你注…

封装了一个iOS滚动厨窗效果

效果图 背景 我们要实现如图的厨窗效果,不能通过在tableView底部添加一个背景图片的方式,因为这需要修改整个tableView的背景色为透明,影响到的范围太大,只能将这个效果局限在这个cell 中,然后通过监听tableView的滚动…

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样? 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力,具体信息如下: 1. **薪酬结构**:根据对外经济贸易大学招生就业处发布的2023届校园招…

虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力

来源:虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力 原文链接:虹科技术 | 跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力 欢迎关注虹科,为您提供最新资讯! #PCAN #网关 #CA…

Flask之电子邮件

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…

解决:bert_score无法加载本地模型

相信很多小伙伴平时都使用内网进行工作,这些网络是无法连接huggingface的,使用魔塔加载模型网络断断续续的很容易失败。但是bert_score只接收一个模型名,然后自动在huggingface下载或在本地缓存加载。这个缓存跟huggingface官方缓存是不同的。…

2710.移除字符串中的尾随0

从右到左,找到第一个不为0的,然后返回字符串前面的. class Solution { public:string removeTrailingZeros(string num) {int i num.length();while(true){if (num[i-1]0){i--;}else break;}return num.substr(0, i);} };调用函数,string.f…