树莓派Pico C/C++ OpenOCD调试环境搭建(Windows)
树莓派Pico C/C++ OpenOCD调试环境搭建(Windows)
参考资料和背景
从上次树莓派Pico C/C++ 开发环境搭建(一键完成版)后,一直想找个合适调试器,最后测试了多种方案,还是使用另一块树莓派pico作为picoprobe 来调试比较方便,其中参考的博客有以下两篇
使用picoprobe调试树莓派PICO(附调试包) - 知乎
Raspberry Pi Debug Probe - Waveshare Wiki
不过完全按照上面两个博客来搭建,可能有bug,至少在我的电脑上行不通😂,所以才有了这篇博客。
openocd调试原理
这里需要说明下 openocd到底是个什么东西,和gdb、cmsis-dap、dap-link之间的关系。
- openocd: 通常情况下,我们都是使用openocd server,启动openocd作为服务,用于连接通用的调试器gdb和我们插入电脑的硬件调试器(各种link)。
- gdb:这个应该不用说,C语言常用的调试器,功能强大。
- cmsis-dap:是arm推出的标准调试接口,支持SWD协议和JTAG协议,可以认为cmsis-dap是一个库,用于写调试器的库。使用这个库最通用的硬件就是dap-link。
只是我们平时使用的ide将openocd和gdb这两个东西结合在一起了。像keil,我们只需要直接在在debug窗口看看有没有我们的调试插入,选择调试的ID就可以了。
所以,使用openocd调试的过程,大概就是
- 将调试器接入(这里使用的是picoprobe),并安装对应的驱动。
- 启动openocd,他会监听loaclhost:3333这个端口,这个端口用于给调试器访问,如gdb。
- 启动gdb给我们要调试的目标开发板(这里是pico)刷写入elf文件,并开始调试。
搭建openocd调试教程
首先第一步插入硬件调试器
我们需要有一个硬件调试器,所以我们需要制作一个picoprobe,只需要连接上一个树莓派pico,将下面的uf2文件拖入即可。
uf2文件可以从树莓派pico-debug-probe的仓库中获取(这里尽量不要使用最新的release版本,据我测试,最新的release版本插入电脑作为cmsis-dapv2设备),而使用较低的版本会显示pico-probe,显示为cmsis-dap设备会对openocd的版本要求比较高。如果不确定用那个,也可以直接下载我文末的压缩包(免积分!!!)里面有一个uf2文件。
注意,如果电脑没有显示上图的Picoprobe设备的话,而是在设备上有个⚠的话,需要先安装下驱动,在文末压缩包里的drivers文件下有一个 zadig-2.7.exe文件,运行安装就可以。
启动openocd server
因为是在windows下的环境,所以自然需要windos下的openocd,但一个尴尬的情况是,在linux下基本上找不到的软件就直接下载源码进行编译了,但windows下编译很麻烦,所以,这里提供一个网站可以直接下载编译好能够在windows下运行的openocd软件。
Download OpenOCD for Windows
我这里直接下载最新版了,不想下载的文末的压缩包也有。
之前那篇博客一键安装好的环境中有openocd文件,但那个应该不是window下可运行的openocd,至少我试着运行失败了😭。
而关于,需不需要将openocd文件夹添加到环境变量,这个就因人而异了,我对于这些可能用到多个版本的软件,我自己更习惯在命令行中使用时直接指定绝对路径(我一般也会在下载时把它放在一个比较短的路径中,方便使用)。
在下载的openocd压缩包解压后的文件中打开powershell,运行以下命令
.\bin\openocd.exe -f .\share\openocd\scripts\interface\picoprobe.cfg -f .\share\openocd\scripts\target\rp2040.cfg -c "adapter speed 5000"
出现上图就说明openocd已经成功连接到我们插入电脑的picoprobe了,并且在监听3333端口。
这里说下上面命令啥意思吧
.\bin\openocd.exe
指定运行的软件路径
-f .\share\openocd\scripts\interface\picoprobe.cfg
指定使用的调试器的配置文件,这里使用picoprobe
-f .\share\openocd\scripts\target\rp2040.cfg
指定我们调试的目标板,这里我们调试rp2040,也就是pico
-c "adapter speed 5000"
指定通信速率
启动gdb开始调试
在上次搭建好的环境下找到build文件夹,运行微雪电子博客中命令,大概可以看到以下输出
同样解释下命令吧
arm-none-eabi-gdb .\ProjectTest.elf
启动gdb调试器,需要注意,后面跟的这个文件必须在该文件夹下有,所以一般就是上次搭建环境中的build文件夹打开powershell就可以了。GDB启动后的命令
target remote localhost:3333
调试目标不是本机,连接到openocd server
load
加载(刷写)elf文件进pico板子
monitor reset init
重启两个核到debug
continue
这个就是调试中的continue,执行到下一个断点处,但我没打断点,所以代码会一直运行,板子上的灯会开始闪烁。
联合VSCode
上面这样调试还有有些麻烦的,需要先在命令行中启动openocd Server,然后找到elf文件所在的文件夹启动gdb,还需要熟悉gdb的调试指令。通常这个时候就需要搬出“宇宙最强IDE”——VScode🤣🤣
首先,我们要使用Vscode帮助我们完成上面的工作。
原理
运行GDB这个工作需要用插件 Cortex-Debug
来帮我们完成,通过在launch.json中配置调试器type为Cortex-Debug就可以了(当然要先安装这个插件🧐)。
然后,我们还需要一个在启动调试前,先启动openocd server。这里我使用一个tasks.json,并在launch.json中引用它,实现这个功能。
具体操作步骤
-
安装Cortex-Debug这个插件,在vscode打开树莓派pico工程目录,打开.vscode目录下的
luanch.json
没有的话,就新建一个,写入如下{"version": "0.2.0","configurations": [{"name": "Pico Debug","type": "cortex-debug","preLaunchTask": "Start OpenOCD Server", // 引用tasks.json中的任务"cwd": "${workspaceRoot}","executable": "${command:cmake.launchTargetPath}","request": "launch","servertype": "external","gdbPath": "arm-none-eabi-gdb","gdbTarget": "localhost:3333","svdFile": "${env:PICO_SDK_PATH}/src/rp2040/hardware_regs/rp2040.svd","runToMain": true,"postRestartCommands": ["break main","continue"]}] }
-
在.vscode下打开
task.json
文件,没有的话,也是新建一个就可以,写入如下:(注意下自己openocd的路径){"version": "2.0.0","tasks": [{"label": "Start OpenOCD Server","type": "shell","command": "D:\\OpenOCD\\OpenOCD20240916\\bin\\openocd.exe","args": [ //自己不喜欢加环境变量,所以都使用绝对路径,更换成自己的openocd路径就可以"-f", "D:\\OpenOCD\\OpenOCD20240916\\share\\openocd\\scripts\\interface\\picoprobe.cfg","-f", "D:\\OpenOCD\\OpenOCD20240916\\share\\openocd\\scripts\\target\\rp2040.cfg","-c", "adapter speed 5000"],"isBackground": true,// 移除或简化problemMatcher(避免语法冲突)"problemMatcher": [] // 留空或直接删除该字段}] }
可能出现的警告
如上图,openocd server已经成功启动了,但终端退出要执行gdb时出现的一个警告,选择Debug Anyway
就可以。
可以看到调试器成功启动了,而且信息很丰富,可以开始愉快的玩耍了😉
调试压缩包链接:https://download.csdn.net/download/weixin_51915497/90604382
相关文章:
树莓派Pico C/C++ OpenOCD调试环境搭建(Windows)
树莓派Pico C/C OpenOCD调试环境搭建(Windows) 参考资料和背景 从上次树莓派Pico C/C 开发环境搭建(一键完成版)后,一直想找个合适调试器,最后测试了多种方案,还是使用另一块树莓派pico作为picoprobe 来调试比较方便,其中参考的…...
【图像生成之21】融合了Transformer与Diffusion,Meta新作Transfusion实现图像与语言大一统
论文:Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model 地址:https://arxiv.org/abs/2408.11039 类型:理解与生成 Transfusion模型是一种将Transformer和Diffusion模型融合的多模态模型,旨…...
《人件》第二章 办公环境
二、办公环境 电话铃不停的响,打印机维修人员顺道过来聊聊天,复印机不工作了,人事部不停催促更新的能力调查表,下午3点之前就要提交时间表…然后一天就这样过去了。 2.1 家具警察 人们怎么使用空间、需要的桌子空间多大、花多少小…...
哈希表系列一>存在重复元素II 存在重复元素I
目录 题目:解析:存在重复元素 II-->代码:存在重复元素-->代码: 题目: 链接: link 链接: link 解析: 存在重复元素 II–>代码: class Solution {public boolean containsNearbyDuplic…...
文献总结:AAAI2025-UniV2X-End-to-end autonomous driving through V2X cooperation
UniV2X 一、文章基本信息二、文章背景三、UniV2X框架1. 车路协同自动驾驶问题定义2. 稀疏-密集混合形态数据3. 交叉视图数据融合(智能体融合)4. 交叉视图数据融合(车道融合)5. 交叉视图数据融合(占用融合)6…...
LeetCode --- 444 周赛
题目列表 3507. 移除最小数对使数组有序 I 3508. 设计路由器 3509. 最大化交错和为 K 的子序列乘积 3510. 移除最小数对使数组有序 II 一、移除最小数对使数组有序 I & II 由于数组是给定的,所以本题的操作步骤是固定的,我们只要能快速模拟操作的过…...
单片机Day05---静态数码管
目录 一、原理图:编辑 二、思路梳理: 三:一些说明: 1.点亮方式: 2.数组: 3.数字与段码对应: 四:程序实现: 一、原理图: 二、思路梳理: …...
kernel32!GetQueuedCompletionStatus函数分析之返回值得有效性
第一部分://#define STATUS_SUCCESS 0x0返回值为0 } else { // // Set the completion status, capture the completion // information, deallocate the associated IRP, and // attempt to write the…...
gazebo 启动卡死的解决方法汇总
1. 排查显卡驱动是否正常安装 nvidia-smi # 英伟达显卡--------------------------------------------------------------------------------------- | NVIDIA-SMI 535.230.02 Driver Version: 535.230.02 CUDA Version: 12.2 | |------------------------…...
硬件设计-MOS管快速关断的原因和原理
目录 简介: 来源: MOS管快关的原理 先简单介绍下快关的原理: 同电阻时为什么关断时间会更长 小结 简介: 本章主要介绍MOS快速关断的原理和原因。 来源: 有人会问,会什么要求快速关断,而…...
塔能科技解节能密码,工厂成本“效益方程式”精准破题
在全球积极推进可持续发展战略的当下,各行业都在努力探索节能减排、绿色发展的新路径,对于工厂而言,节能早已不是锦上添花的选择,而已成为关乎企业生死存亡与长远发展的核心要素,是实现可持续运营的必由之路。塔能科技…...
swift ui基础
一个朴实无华的目录 今日学习内容:1.三种布局(可以相互包裹)1.1 vstack(竖直):先写的在上面1.1 hstack(水平):先写的在左边1.1 zstack(前后)&…...
格式工厂 v5.18最新免安装绿色便携版
前言 用它来转视频的时候,还能顺便给那些有点小瑕疵的视频修修补补,保证转出来的视频质量杠杠的。更厉害的是,它不只是转换那么简单,还能帮你把PDF合并成一本小册子,视频也能合并成大片,还能随心所欲地裁剪…...
CSPM认证对项目论证的范式革新:从合规审查到价值创造的战略跃迁
引言 在数字化转型浪潮中,全球企业每年因项目论证缺陷导致的损失高达1.7万亿美元(Gartner 2023)。CSPM(Certified Strategic Project Manager)认证体系通过结构化方法论,将传统的项目可行性评估升级为战略…...
TcxCustomCheckComboBoxProperties.EditValueFormat 值说明
TcxCheckStatesValueFormat 类枚举复选框状态对 edit 值的可能解释。以下选项可用。 价值 意义 cvf字幕 编辑值是一个字符串,其中包含两个由分号分隔的子字符串。分号前的子字符串包含灰显项目的标题列表。分号后面的子字符串包含已选中项目的标题列表。请注意&a…...
Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试
Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…...
【C语言】预处理(下)(C语言完结篇)
一、#和## 1、#运算符 这里的#是一个运算符,整个运算符会将宏的参数转换为字符串字面量,它仅可以出现在带参数的宏的替换列表中,我们可以将其理解为字符串化。 我们先看下面的一段代码: 第二个printf中是由两个字符串组成的&am…...
IIC通信协议
一、概述 IIC协议:是一种各种电子设备之间进行数据交换和通信的串行,半双工通信协议,主要用于近距离,低速的芯片之间的通信。 I2C协议采用双线结构传输数据,由一个数据线&#…...
SpringBoot原生实现分布式MapReduce计算(无第三方中间件版)
一、架构设计调整 核心组件替换方案: 注册中心 → 数据库注册表任务队列 → 数据库任务表分布式锁 → 数据库行级锁节点通信 → HTTP REST接口 二、数据库表结构设计 -- 节点注册表 CREATE TABLE compute_nodes (node_id VARCHAR(36) PRIMARY KEY,last_heartbea…...
02-libVLC的视频播放器:播放音视频文件以及网络流
libvlc_new(0, nullptr)功能:创建并初始化libVLC的核心实例,是使用所有libVLC功能的前提。 参数:第一个参数:参数数量(通常设为0)第二个参数:参数列表(通常为nullptr,表示使用默认配置)返回值:成功返回libvlc_instance_t*指针,失败返回nullptr。注意事项:可通过参…...
Autoware源码总结
Autoware源码网站 项目简介 教程 Autoware的整体架构如下图,主要包括传感器sensing、高精地图map data、车辆接口vehicle interface、感知perception(动态障碍物检测detection、跟踪tracking、预测prediction;交通信号灯检测detection、分类c…...
PowerBI 条形图显示数值和百分比
数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品,会被筛选,所以用ALLSELECTED来获取当前筛选条件下,Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…...
Sa-Token 自定义插件 —— SPI 机制讲解(一)
前言 博主在使用 Sa-Token 框架的过程中,越用越感叹框架设计的精妙。于是,最近在学习如何给 Sa-Token 贡献自定义框架。为 Sa-Token 的开源尽一份微不足道的力量。我将分三篇文章从 0 到 1 讲解如何为 Sa-Token 自定义一个插件,这一集将是前沿…...
基于 Termux 在移动端配置 Ubuntu 系统并搭建工作环境
本套方案主要参考了以下内容,并根据自身体验进行了修改。 【教程】用Termux搭建桌面级生产力环境Termux安装完整版Linux(Ubuntu)详细步骤 前言 自己的电脑太重,有时候外出不想带,平板生产力有有限。所以一直在折腾用平板替代电脑的事情。之前…...
JAVA SDK通过proxy对接google: GCS/FCM
前言:因为国内调用google相关api需要通过代理访问(不想设置全局代理),所以在代理这里经常遇到问题,先说一下结论 GCS 需要设置全局代理或自定义代理选择器, FCM sdk admin 在初始化firebaseApp时是支持设置的。 GCS: 开始时尝试在…...
JAVA EE_多线程-初阶(三)
我对未来没有底气 我也不知道当下该如何做 那就活着,活着就能把日子过下去 ---------陳長生. 1.多线程案例 1.1.单例模式 单例模式是常见的设计模式之一 设计模式:一些编程大佬制定的一些通用代码,再特定的场景下能套用进去,即…...
@PKU秋招互联网产品经理求职分享
从校园到职场 非常荣幸能够在毕业后两年半再次回到燕园。今天,我主要想和大家分享一下我在互联网行业的求职和工作经验。从最初面对职场的迷茫,到现在能够从容应对职场各种挑战,这一路走来积累了不少心得。互联网行业变化迅速,持续…...
uniapp日常总结--uniapp页面跳转方式
uniapp日常总结--uniapp页面跳转方式_uniapp 跳转-CSDN博客...
【能源节约管理系统行业树组件优化总结】
能源节约管理系统行业树组件优化总结 问题背景 在能源节约管理系统中,我们需要一个行业选择组件,以树形结构展示国民经济行业分类数据。由于行业数据量大且层级多,我们采用了懒加载的方式实现。然而,在编辑和详情模式下…...
青少年编程考试 CCF GESP图形化编程 二级认证真题 2025年3月
图形化编程 二级 2025 年 03 月 一、单选题(共 10 题,每题 3 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁片《哪吒 2》票房惊人,入了全球票房榜…...
【Hadoop入门】Hadoop生态之Flume简介
1 什么是Flume? Flume是Hadoop生态系统中的一个高可靠、高性能的日志收集、聚合和传输系统。它支持在系统中定制各类数据发送方(Source)、接收方(Sink)和数据收集器(Channel),从而能…...
十六、Linus网络编程基础
1、Linux 网络的历史发展 早期阶段(1991–1995) 1991年:Linus Torvalds 发布 Linux 内核的初始版本(0.01),此时内核不支持网络功能,仅是一个单机操作系统。1992年:受 BSD …...
【激活函数:神经网络的“调味料】
1. 激活函数:神经网络的“调味料” 想象你在做菜: 没有激活函数:就像只用水煮食材,味道单调(只能拟合线性关系)。加入激活函数:像加了盐、糖、辣椒,让菜有酸甜苦辣(非线…...
006.Gitlab CICD流水线触发
文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活,常见的有如下几类触发方式: …...
服务器远程端口详解
服务器远程端口详解 一、服务器远程端口的概念与作用 1. 端口的基本定义 服务器远程端口是计算机网络中用于标识不同应用程序或服务的逻辑接口。通过TCP/IP协议栈的"Socket"机制,计算机可以通过软件方式与其他设备建立通信通道。每个端口对应一个16位无…...
如何在 Vue 3 中实现百度地图位置选择器组件
如何在 Vue 3 中实现百度地图位置选择器组件 前言 在开发前端应用时,地图选择器是一个非常常见的需求。尤其是在一些需要用户选择地址的场景,如电商平台、旅游网站、酒店预定等,百度地图组件能提供准确的地理位置服务。在本文中,…...
es6学习02-let命令和const命令
一、let命令 1.let块级作用域: let关键字 VS var关键字 2.for循环计数器很适合let命令 var:整个for循环中一直都是同一个i在做1,最后输出的就是10; let:每循环一次都是多一个i的赋值,最后输出是可以调出…...
电路方案分析(二十)TPS63xxx系列DC/DC电源EMI PCB设计方案
tips:资料来自网络,仅供学习使用。[TOC](TPS63xxx系列DC/DC电源EMI PCB设计方案) 1.概述 通过TPS63xxx系列DC/DC电源模块来分析降低直流/直流降压/升压转换器辐射 EMI 的来源以及相关PCB设计。 下面都以最常用的TPS63070为例说明: 典型应用…...
DeepSeek大语言模型部署指南:从基础认知到本地实现
目录 一、DeepSeek简介:开源领域的新兴力量 1.1 公司背景与发展历程 1.2 核心产品DeepSeek-R1的技术特点 1.3 行业影响与伦理挑战 二、官方资源获取:全面掌握DeepSeek生态 2.1 官方网站与API服务 2.2 开源代码库资源 2.3 模型部署工具Ollama简介…...
09-设计模式 企业场景 面试题-mk
你之前项目中用过设计模式吗? 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类图设计如下: 上面的对象都是ne…...
达梦数据库-学习-18-ODBC数据源配置(Linux)
一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…...
解决VS2022中scanf报错C4996
这个的原因是因为新版的VS认为scanf不安全,要去使用scanf_s,但在C语言中就需要scanf,所以我们只要以以下步骤解决就可以了。 只要加入宏定义即可 #define _CRT_SECURE_NO_WARNINGS 因为本人已经很少写小案例了,所以就用这个办法…...
Python(11)Python判断语句全面解析:从基础到高级模式匹配
目录 一、条件逻辑的工程价值1.1 真实项目中的逻辑判断1.2 判断语句类型矩阵 二、基础判断深度解析2.1 多条件联合判断2.2 类型安全判断 三、模式匹配进阶应用3.1 结构化数据匹配3.2 对象模式匹配 四、判断语句优化策略4.1 逻辑表达式优化4.2 性能对比测试 五、典型应用场景实战…...
Quartus II的IP核调用及仿真测试
目录 第一章 什么是IP核?第二章 什么是LPM?第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL?第一节 设置ALTPLL(嵌入式锁相环)模块参数第二节 仿真 第四章 什么是RAM?第一节 RAM_1PORT的调用第…...
如何修改服务器TTL值
Windows默认返回的TTL值为128,Linux为64,我们怎么修改这个值呢? 目录 一. Windows 二. Linux 临时更改 永久更改 一. Windows WinR输入regedit,打开注册表 路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro…...
大模型LLM表格报表分析:markitdown文件转markdown,大模型markdown统计分析
整体流程:用markitdown工具文件转markdown,然后大模型markdown统计分析 markitdown https://github.com/microsoft/markitdown 在线体验:https://huggingface.co/spaces/AlirezaF138/Markitdown 安装: pip install markitdown…...
劫持SUID程序提权彻底理解Dirty_Pipe:从源码解析到内核调试
DirtyPipe(CVE-2022-0847)漏洞内核调试全流程指南 本文主要面向对内核漏洞挖掘与调试没有经验的初学者,结合 CVE-2022-0847——著名的 Dirty Pipe 漏洞,带你从零开始学习 Linux 内核调试、漏洞复现、原理分析与漏洞利用。该漏洞危害极大,并且概念简单明了,无需复杂前置知…...
React 组件样式
在这里插入图片描述 分为行内和css文件控制 行内 通过CSS中类名文件控制...
嵌入式人工智能应用-第三章 opencv操作3 图像平滑操作 下
5 高斯噪声(Gaussian Noise) 高斯噪声(Gaussian Noise)是一种符合正态(高斯)分布的随机噪声,广泛存在于传感器采集、信号传输等场景中。以下是关于高斯噪声的详细说明、添加方法及滤波方案。 …...
OSPF的接口网络类型【复习篇】
OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型(工作方式)计时器BMA(以太网)broadcast ,需要DR/BDR的选举hello:10s…...