当前位置: 首页 > news >正文

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 。
    在这里插入图片描述

相关文章:

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

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置,如何控制调试过程,如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …...

grpc学习golang版( 五、多proto文件示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…...

LeetCode 106 从中序与后序遍历序列构造二叉树

根据中序遍历和后序遍历的性质&#xff0c;还原二叉树&#xff0c;详细见注释 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//空&#xff0c;直接返回nullif(inorder.size() 0) return nullptr;//一个&#xff0c;返回一个nod…...

Vue Router的深度解析

引言 在现代Web应用开发中&#xff0c;客户端路由已成为实现流畅用户体验的关键技术。与传统的服务器端路由不同&#xff0c;客户端路由通过JavaScript在浏览器中控制页面内容的更新&#xff0c;避免了页面的全量刷新。Vue Router作为Vue.js官方的路由解决方案&#xff0c;以其…...

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…...

pmp考试的通过标准是什么?

PMP考试的是否通过并不是依据类似其他考试的数值成绩&#xff0c;是通过考生收到邮件通知后去主动查询具体的页面得知的。查询页除了电子证书的下载方式&#xff0c;还有成绩报告单的选项以及成绩饼状图&#xff0c;具体如下&#xff1a; 页面中显示“PASS”表示考试通过。 显…...

不懂PyQt5垂直布局?只需3分钟即可学会

PyQt5中实现垂直布局&#xff0c;主要使用QVBoxLayout类。该布局管理器将子控件垂直排列&#xff0c;并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…...

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本&#xff0c;文本数据处理的核心是做tokenization&#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理&#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…...

生物分子生物学实验过程的自动化与智能监控系统设计

开题报告&#xff1a;生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展&#xff0c;生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而&#xff0c;传统的生物分子生物学实验过程大多依赖于人工操作&#xff0c;存在操…...

linux的shell脚本编程详解

Shell 脚本是一种用于自动化任务的脚本语言&#xff0c;在 Linux 和其他类 Unix 操作系统中非常流行。它通常用于任务自动化、系统管理和批处理。编写 Shell 脚本并使其自动化编译过程&#xff08;例如使用 gcc 编译 C/C 程序&#xff09;是一种常见的任务。 以下是一个详细的…...

Redis 7.x 系列【11】数据类型之位图(Bitmap)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 基本命令2.1 SETBIT2.2 GETBIT2.3 BITCOUNT2.4 BITPOS2.5 BITFIELD2.6 BITF…...

如何评定旅游卡的品质与服务?

评定旅游卡的品质与服务&#xff0c;可以从以下几个关键方面进行综合考量&#xff1a; 公司实力与资质&#xff1a;选择有实力、资质齐全的公司发行的旅游卡。查看公司背景&#xff0c;确认其是否长期稳定运营&#xff0c;是否具有旅游行业的专业资质&#xff0c;如旅行社许可证…...

适合学生暑假适用的护眼大路灯有哪些?五款好用护眼灯分享!

在护眼领域&#xff0c;护眼大路灯已经成为越来越多人的选择。这种具备实力的工具可以有效地缓解用眼疲劳、改善光线环境&#xff0c;是学生党和办公族的必备神器。然而&#xff0c;市面上的护眼大路灯品牌众多&#xff0c;如何选择一款性价比高、品质优良的产品呢&#xff1f;…...

linux服务器 部署jenkins

在 Linux 服务器上部署 Jenkins 通常包括以下几个步骤&#xff1a; 更新系统软件包&#xff1a; sudo apt update sudo apt upgrade 安装 Java&#xff1a; Jenkins 需要 Java 运行时环境。推荐使用 OpenJDK 11。 sudo apt install openjdk-11-jdk 添加 Jenkins 软件源并导入…...

电商控价:系统监测的必要性与优势

在品牌的发展进程中&#xff0c;会遭遇各种各样的渠道问题&#xff0c;控价乃是其中颇为关键的一环。品牌进行控价的目的无疑是为了妥善治理低价链接&#xff0c;低价链接的发现途径可以是人工&#xff0c;也可以是系统。力维网络在为上百个品牌提供服务的过程中察觉到&#xf…...

港股下半年能恢复上涨趋势吗?

今日港股两大指数涨跌不一&#xff0c;早盘盘初恒指冲高&#xff0c;涨幅一度扩大至1%。截至收盘&#xff0c;香港恒生指数涨0.57%。板块方面&#xff0c;电力、航空、石油、内险股、燃料电池、环保等板块涨幅居前&#xff1b;互动媒体与服务、生物科技、汽车零部件、新经济概念…...

软件测试项目实战:银行贷款业务测试介绍-2

1、利息计算 正常利息贷款本金*借款天数*贷款年利率/360 罚息逾期本金*逾期天数*逾期年利率/360 复利逾期利息*逾期天数*逾期年利率/360 2、贷款五级分类 正常贷款&#xff1a;正常及逾期60天以内 关注贷款&#xff1a;逾期60天及以上&#xff0c;不足90天 次级贷款&#xff1…...

如何将Hive表的分区字段插入PG表对应的时间戳字段?

文章目录 1、背景描述2、场景分析 1、背景描述 数据仓库的建设通常是为业务和决策服务的。在数仓开发的应用层阶段&#xff0c;BI可以直接从主题层/业务层取数&#xff0c;而前端需要根据具体的作图需求通过后端查询数据库 作图的指标需要根据主题层/业务层做查询计算&#xf…...

Spring Boot与MyBatis的集成应用

Spring Boot与MyBatis的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot与MyBatis的集成应用。MyBatis是一款优秀的持久层框…...

在昇腾服务器上使用llama-factory对baichuan2-13b模型进行lora微调

什么是lora微调 LoRA 提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新&#xff0c;从而减少适配下游任务所需要训练的参数。 环境准备 这次使用到的微调框架是llama-factory。这个框架集成了对多种模型进行各种训练的代码&#xff0c;少量修改就可使用。 …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...

spring boot使用HttpServletResponse实现sse后端流式输出消息

1.以前只是看过SSE的相关文章&#xff0c;没有具体实践&#xff0c;这次接入AI大模型使用到了流式输出&#xff0c;涉及到给前端流式返回&#xff0c;所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...