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

Eclipse + GDB + J-Link 的调试实践

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

对 Eclipse 的要求

  • 所用 Eclipse 应当安装了 Eclipse Embedded CDT 插件。
  • 从 https://www.eclipse.org/downloads/packages/ 下载 Eclipse IDE for Embedded C/C++ Developers ,此版本已经包含所需插件。
    在这里插入图片描述

配置 J-Link 路径

  • 通过菜单 Window>>Preferences 打开全局配置对话框,选择 MCU>>Global SEGGER J-Link Path ,在相应输入框填入 GDBServer 可执行文件名和所在路径。
    在这里插入图片描述

创建调试配置

  • 通过菜单 Run >> Debug configurations… 打开调试配置对话框。
  • 左侧列表中选中 GDB SEGGER J-Link Debugging ,点击左上角 New launch configuration 按钮,新建一个调试配置。
    在这里插入图片描述

调试配置 Main 标签页

  • 确认 Project 名是否正确,若不正确或为空,那么点击右侧 Browse… 按钮选择正确的工程。
  • 确认 C/C++ Application 是否为待调试程序,若不正确或为空,点击右侧 Search Project… 或 Browse…按钮选择待调试程序。
    在这里插入图片描述

调试配置 Debugger 标签页

  • Device name 输入框输入 MCU 型号。
  • 所支持的 MCU 型号可以通过 SEGGER J-Link GDB Server 的 Target Device Settings 对话框查看。
    在这里插入图片描述

调试配置 Startup 标签页

  • 去除 Enable flash breakpoints 选项。
  • 去除 Enable semihosting 选项。
  • 填入 CPU 时钟。
    在这里插入图片描述

调试配置 SVD Path 标签页

  • 若调试驱动程序,需要查看外设寄存器,那么需要指定 SVD file 。
  • 只调试应用层代码,可以忽略。
    在这里插入图片描述

开始调试

  • 配置完成后,点击配置对话框右下角Debug 按钮即可开始调试。
  • 调试配置将保存在 workspace 中,下次需要再次调试时,可以点击菜单Run>>Debug history 中的对应项开始调试,也可以通过工具栏按钮开始调试,见下图。点击调试按钮开始与最近的调试一样的调试,点击调试按钮右侧三角型按钮弹出菜单,可以选择所需的调试配置或菜单。
    在这里插入图片描述

调试控制

  • 开始调试后, Eclipse 将进入调试窗口布局。

  • Eclipse 工具栏将显示调试控制工具,如下图。
    在这里插入图片描述

  • Resume ,连续执行,直到碰到断点或点击暂停按钮。即 Run 操作。
    在这里插入图片描述

  • Suspend ,暂停,连续执行状态下,点击暂停按钮,将在当前位置停止执行。即 Halt 操作。
    在这里插入图片描述

  • Terminate ,结束本次调试。即 Stop 操作。
    在这里插入图片描述

  • Step Into ,单步执行,碰到函数调用语句则进入函数。
    在这里插入图片描述

  • Step Over ,单步执行,若当前语句为函数调用,则函数调用作为单条语句执行,不进入函数。
    在这里插入图片描述

  • Step Return ,执行完当前函数的剩余代码,返回调用处暂停。
    在这里插入图片描述

  • 指令单步模式,点击该按钮切换指令单步和语句单步。进入指令单步后,将自动打开反汇编窗口,再点击 StepInto 或 Step Over 按钮时仅执行一条指令。
    在这里插入图片描述

  • Restart ,复位MCU ,程序从头重新开始执行。
    在这里插入图片描述

添加断点

  1. 在编辑器视图的行号左侧双击,或点击右键弹出菜单选择 Toggle breakpoint 。
  2. 在 Breakpoints 视图,点击右侧三个点弹出菜单选择 Add xxx Breakpoint 菜单,有多种类型的断点,包括Watchpoint 。
    在这里插入图片描述

查看函数调用栈

  • 通过 Debug 视图查看当前调用栈。下方函数调用上方函数。形成一个调用链。
  • Debug 视图可以配合Variables 视图查看每个函数的局部变量,点击选择Debug 视图中不同的函数, Variables 视图将显示与选中函数相应的局部变量。
    在这里插入图片描述

查看修改局部变量

  • 通过 Variables 视图查看函数局部变量。
  • 当 CPU 进入 Halt 时, Variables视图默认显示函数调用栈顶部函数的局部变量,通过 Debug 视图选择调用栈内的其它函数时, Variables 将显示对应函数的局部变量。
  • 如有必要,可以在 Value 列修改全局变量。
    在这里插入图片描述

查看修改全局变量

  • Expressions 视图查看全局变量。
  • 添加变量到 Expressions 视图的方法:
    • 点击 Expressions 视图右侧的加号,在对话框内填入合法的 C 表达式。
    • 调试模式下,双击选中要查看的全局变量,点击右键菜单,选择 Add Watch Expression 。
    • 点击 Expressions 视图的表示式列表的最
  • 如有必要,可以在 Value 列修改全局变量。
    在这里插入图片描述

查看反汇编

  • 点击工具栏的指令单步或通过菜单 Window>>Show View>>Disassembly 打开 Disassembly 视图。
    在这里插入图片描述

查看 CPU 寄存器

  • Registers 视图查看 CPU 寄存器。
  • 一般情况下,寄存器视图配合指令单步和反汇编视图使用。
  • 如果有需要,可以修改寄存器的值。
    在这里插入图片描述

查看修改外设寄存器

  • Peripherals 视图配合 Memory 视图查看修改外设寄存器。
  • Peripherals 视图中勾选要查看的外设。
  • Memory 视图显示外设寄存器,包括寄存器内的位定义。如有必要,可以修改寄存器值。
    在这里插入图片描述

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

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

相关文章

C++ 快速行进方法(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设给你一个将一个区域与另一个区域分开的界面,以及告诉你如何移动界面上每个点的速度F。下图中,黑色曲线将内部深蓝色与外部浅蓝色分开,黑色曲线的每个点都给出了速度F。此外,假设速度F始终为正,即前端始终向…

java面试课程-SpringIOC部分源码解析

1.SpringIOC的refresh源码解析 核心: 核心使用的是: 需要完成配置类的解析,各种BeanFactoryProcessor的注册。还有写国际化配置的初始化。Web容器的内部构造。 上面几个方法是refresh方法的内容。注意可以与applicationContext里的内容一起…

第十四章 路由器 OSPF 动态路由配置

实验目的 掌握 OSPF 协议的配置方法: 掌握查看通过动态路由协议 OSPF 学习产生的路由; 熟悉广域网线缆的链接方式; 实验背景 假设校园网通过一台三层交换机连到校园网出口路由器上, 路由器再和校园外的另一台路由器连接。…

【0299】Postgres内核之哈希表(Hash Tables)

0. 哈希表(Hash Tables) 哈希表是 一种用于存储键值对的数据结构。与使用索引号访问元素的基本数组不同,哈希表使用键来查找表条目。这使得数据管理对于用户来说更易于管理,因为按属性对数据条目进行分类比按它们在一个巨大的列表中的数量更容易。 在 C++ 中,我们将哈希…

B站大课堂-自动化精品视频(个人存档)

基础知识 工业通信协议 Modbus 施耐德研发,有基于以太网的 ModbusTCP 协议和使用 485/232 串口通信的 ModbusRTU/ASCII。 Modbus 协议面世较早、协议简洁高效、商用免费、功能灵活、实现简单,是目前应用最广泛的现场总线协议。 我的笔记里边有一些推荐…

Linux源码阅读笔记10-进程NICE案例分析2

set_user_nice set_user_nice函数功能:设置某一进程的NICE值,其NICE值的计算是根据进程的静态优先级(task_struct->static_prio),直接通过set_user_nice函数更改进程的静态优先级。 内核源码 void set_user_nice…

黄子韬vs徐艺洋卫生间风波

【热搜爆点】黄子韬VS徐艺洋:卫生间风波背后的职场与友情界限探讨在这个充满欢笑与意外的综艺时代,《跟我出游吧》再次以它独有的魅力,引爆了一个既尴尬又引人深思的话题——“黄子韬要上徐艺洋的卫生间?”这不仅仅是一句简单的调…

[Labview] Excel读表 输出表单中选中的单元格内容

简而言之 循环外 是读取excel文件,并写入labview表格 循环内 会输出表格中被选中的单元格内容 调用节点:点到行列 事件结构中的另两个事件 如果需要改写单元格内容并储存替换Excel,可见这篇:[Labview] 改写表格内容并储存覆盖Ex…

k8s 中间件

1. zookeeper 是的,Zookeeper 和 Kafka 经常一起使用,Zookeeper 在 Kafka 中扮演了关键角色。以下是 Zookeeper 和 Kafka 在实际项目中的结合使用及其作用的详细说明。 项目背景 假设我们有一个分布式数据处理系统,该系统需要高吞吐量的实…

隐私信息管理体系认证:守护个人信息,筑牢隐私防线

在数字化浪潮汹涌的当下,个人信息安全问题愈发凸显其重要性。随着互联网技术的飞速发展,我们的隐私信息如同裸露在阳光下的沙滩,稍有不慎就可能被不法分子窃取或滥用。因此,构建一个完善的隐私信息管理体系,成为了保障…

UI(四)布局

文章目录 10、Navigator——路由器组件11、Pannel——可滑动面板12、Refresh——刷新组件13、RelativeContainer——相对布局组件14、Scroll——可滚动容器15、SideBarContainer——侧边栏容器16、Stack——堆叠容器17、Swiper——滑动块视图容器18、Tabs和TabContent——页签和…

vue为啥监听不了@scroll

哈喽 大家好 我在vue中写了一个滚动scroll监听事件 然后滚动鼠标 发现进不来我的方法断点 原因: 事件绑定错误:确保你使用scroll正确绑定到了可滚动容器上。 事件冒泡:滚动事件可能被封装在某些组件内部,导致不会冒泡到父元素上…

鸿蒙开发Ability Kit(程序访问控制):【使用粘贴控件】

使用粘贴控件 粘贴控件是一种特殊的系统安全控件,它允许应用在用户的授权下无提示地读取剪贴板数据。 在应用集成粘贴控件后,用户点击该控件,应用读取剪贴板数据时不会弹窗提示。可以用于任何应用需要读取剪贴板的场景,避免弹窗…

时间复利效应才是人生的催化剂

在追求成功的道路上,许多人都在寻找捷径。然而,真正的捷径并非不劳而获的幻想,而是通过长期坚持在某一领域深耕细作,享受时间复利效应带来的巨大收益。本文将探讨如何选择合适的领域并长期坚持下去,以实现成功。 时间…

DpEasy社区版1.4.1 | 针对托管账号进行功能完善

DpEasy 数据库特权账号管理平台社区版 1.4.1 已上线! 本次版本,主要针对托管账号做了新增功能和部分优化。具体如下: | 支持密码纠正 当出现 DpEasy 平台上的托管账号密码与实际账号密码不一致的情况,可以通过「密码纠正」进行…

如何养成爱自己的习惯:吸引世间美好,改变命运

在这个快节奏、高压力的时代,我们常常被各种事务所困扰,内心难以得到真正的宁静。然而,古老的智慧告诉我们,“静”是宇宙万物的根源,是生命恢复的根本。本文将探讨如何养成“静”的习惯,从而吸引世间美好&a…

Elasticsearch集群部署(上)

目录 前言 一. 环境准备 二. 实施部署 三. 安装配置head监控插件 (只在第一台es部署) 四. Kibana部署(当前还是在第一台es部署) 五. 安装配置Nginx反向代理 六. Logstash部署与测试 前言 1. Elasticsearch: 是…

智慧公厕系统改变了人们对服务区公厕的看法

在过去,服务区公厕常常给人留下脏乱差的印象,成为人们在长途旅行途中不愿停留的地方。然而,随着智慧科技的不断发展和应用,智慧公厕系统的出现改变了人们对服务区公厕的看法,为公共卫生设施的提升注入了新的活力。 一、…

YOLOv8-对注意力机制模型进行通道剪枝-同时实现涨点和轻量化【附代码】

文章目录 前言视频效果文章概述必要环境一、训练自己的模型1、 训练命令2、 训练参数解析 二、模型剪枝1、 对训练好的模型将进行剪枝2、 剪枝代码详解1.解析命令行参数2. 定义剪枝函数3. 定义剪枝结构4. 更新注意力机制5. 保存更新后的模型6. 主函数 三、剪枝后的训练运行命令…

【日常记录】【JS】动态执行JS脚本

文章目录 1、第一种方式:eval2、第二种方式:setTimeout3、第三种方式:创建script 标签插入body4、第四种方式:创建 Function5、对比6、 参考链接 1、第一种方式:eval 语法 eval(string)参数 string:一个…