【嵌入式开发笔记】OpenOCD到嵌入式调试

最近在把玩一块Risc-V的开发板,使用开发板调试时,需要用到专门的下载器和OpenOCD进行调试。

为了连接这个板子,费了九牛二虎之力。

这里简单记录一下自己的折腾经过吧。

0x00 环境准备

0x0001 调试背景

系统:Virtual Box + Ubuntu 20.04.5 LTS

调试器:蜂鸟调试器(实际上只要兼容的调试器都可以)

这里假设基本的Lib都已经安装了,如果没有安装,对应apt install下就好,这里就不多说了。

0x0002 环境配置

首先下载支持Risc-V,最新版本的OpenOCD,直接去官网下载即可。

链接:芯来工具链_芯来科技 - 专业RISC-V处理器IP及解决方案公司

由于我们要在Linux系统上跑,因此下载Linux版本。如果需要Win下运行,则下载Win版本就好了。

一般来说,官网的OpenOCD会比较新,可能会有更多的器件设备支持。但是也不排除部分厂商会对OpenOCD进行定制,具体采用哪个版本根据实际情况决定。

安装OpenOCD的同时,同步在虚拟机上解压安装交叉编译工具链,.bashrc配置PATH变量然后source一下,这个就不用我多说了吧。

0x0003 硬件连接

把仿真器连接到电脑,另一端连接到板子的JTAG口。

虚拟机上做好USB端口映射,让虚拟机能够通过USB访问仿真器:

如果还有问题,大概率是由于没有打开USB支持导致的。

关闭虚拟机,在USB设置上选择如下操作,允许USB3.0/2.0的支持后重新映射USB即可:

在这里插入图片描述

最后sudo lsusb,不出意外可以看到仿真器的连接情况:

在这里插入图片描述

这里最好记住一下仿真器设备的PID和VID,后续配置仿真器的时候会用到。例如这里是0403:6010

那么硬件连接基本完成。

0x01 OpenOCD配置

OpenOCD实际上只是一个调试工具,这个工具通过什么接口连接开发板,连接时的一些参数(通信速率、操作配置等)等信息,需要通过配置告诉OpenOCD。

接下来我们就来简单讲解一下。

0x0101 OpenOCD的配置逻辑

首先先来讲一下OpenOCD的配置逻辑:

一般来说,OpenOCD的操作都是通过命令形式执行的,类似下面这样:

openocd.exe --command "adapter speed 9600" --command "adapter driver cmsis-dap" --command "transport select jtag" --command "jtag newtap riscv cpu -irlen 5"  --command "target create riscv.cpu riscv -chain-position riscv.cpu"  --command "riscv.cpu configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1"

上述命令中,用多个Command参数设置了通信速率、调试接口和目标等信息。

实际上,—command命令也可以用-c来进行缩写。

当然,我们也可以把这些命令用Script的方式保存,并使用openocd -f [脚本1] -f [脚本2] ... 的方式在执行时指定这些脚本,OpenOCD会自动按照顺序执行这些脚本。

更方便的方式是将这些脚本写成OpenOCD的配置文件openocd.cfg,并在该目录下直接执行openocd即可。

0x0102 配置文件讲解

用个例子简单讲解一下OpenOCD的常用命令。

这些命令可以在https://openocd.org/doc-release/html/Command-and-Driver-Index.html看到。

# 配置调试器的速度和接口
adapter speed     1000
adapter driver  ftdi
# 配置调试器的USB PID和VID,这个可以在lsusb里看到
ftdi_vid_pid 0x0403 0x6010
ftdi_oscan1_mode off

# 配置命令
transport select jtag
ftdi_layout_init 0x0008 0x001b
ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020
ftdi_layout_signal TCK -data 0x0001
ftdi_layout_signal TDI -data 0x0002
ftdi_layout_signal TDO -input 0x0004
ftdi_layout_signal TMS -data 0x0008
ftdi_layout_signal JTAG_SEL -data 0x0100 -oe 0x0100

# 配置芯片和操作,主要是新增target
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1

# 后续省略...

我们可以看到,这里的代码是对调试器的接口、连接目标、寄存器和操作进行了配置。

不同的芯片、平台和调试器的配置方法不一样,需要结合实际情况修改上述命令。

例如,使用cmsis-dap的JTAG接口,就需要对应配置adapter drivertransport select等命令。

如果不出意外的话,直接在配置文件目录下执行openocd连接就好了。

0x02 GDB连接OpenOCD

上述命令成功执行的情况下(且没有其他Error级别的输出)会有如下关键Log输出:

Info : starting gdb server for riscv.cpu on 3333
Info : Listening on port 3333 for gdb connections

这时候说明调试器和板子已经建立了通信,并且启动了gdb server监听3333端口。

这时候,另起一个终端,执行交叉编译工具中的gdb工具,会进入gdb环境。

使用命令target remotr localhost:3333连接本机的端口,如果没有报错,就可以进行调试、下载等工作。

0x03 遇到问题和解决方法

接下来说说我在配置过程中遇到的一些问题。

出错的时候,要注意观察输出的Log,一般Error里都包含了错误的信息和解决方法。

0x0301 all ones错误

错误信息如下图所示:

这种情况一般是电脑到调试器的通路是正常的,但是调试器到板卡的通路有异常

解决方法很简单,正如错误Log中显示的,这种情况是调试器连接不到目标板卡。一般是检查JTAG的接口配置、时序、目标板是否上电、JTAG到目标板连接是否正常等。

我遇到这个问题的时候排查下来发现是线接反了,根据电路图重新连接之后就没有这个错误了。

0x0302 Unknown flash device

错误信息如图:

这种情况是仿真器连接正常,但是使用OpenOCD连接仿真器操作Flash的时候,OpenOCD不兼容这个Flash,因此无法进一步操作。

解决方法:换OpenOCD。我这边测试的情况是从芯片厂商提供的版本更换到了最新版OpenOCD后,能正常识别到Flash并进行烧录。

但是也可能会有反例,例如最新版OpenOCD没有支持芯片平台的Flash导致报错,这种情况下如果芯片平台自己做了驱动,这时候就要从最新版OpenOCD更换到芯片平台提供的调试工具了。

如果换OpenOCD也不行,那就要考虑是不是要自己下载源码,修改+编译OpenOCD了。

0x04 总结

简单总结一下。

OpenOCD是一个开源的调试工具,可以用这个工具通过不同的调试器对嵌入式平台进行调试。

但是针对不同的芯片平台和调试器,需要使用不同的配置。这个需要结合仿真器和目标芯片平台的信息来调整。

后续如果在调试过程中还遇到什么其他的问题,也会继续整理更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装MongoDB,环境配置

官网下载地址:MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

15.初识接口1 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。它要求所…

2.学习TypeScript 编译选项配置

自动编译 我们可以使用 tsc ...../.ts -w 命令进行ts文件的自动编译 执行后 编译会持续侦听 自动编译 这种方式只能侦听一个文件 对做项目肯定是不现实的,为了解决这个问题,我们需要添加一个tsconfig.json文件,写入一个基础对象 再有tsconfi…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requ…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot:算是“老牌”编程助手了,虽然Copilot在别的编辑器上也有扩展,不过体验最好的还是VS Code,毕竟都是微软家的所以功能集成更好一些;主要提供的是Complete和Chat能力,也就是代码补全…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负,然后下正上负。当二极管接到反向电压,二极管存在寄生电容,电压不能立刻突变,当输入频率变高时&#…

unipp中使用阿里图标,以及闭坑指南

-----------------------------------------------------点赞收藏才是更新的动力------------------------------------------------- unipp中使用阿里图标 官网下载图标在项目中引入使用注意事项 官网下载图标 进入阿里图标网站 将需要下载的图标添加到购物车中 2. 直接下载…

QtCreator配置github copilot实现AI辅助编程

文章目录 1、概述2、配置环境3、演示 1、概述 新时代的浪潮早就已经来临,上不了船的人终将被抛弃,合理使用AI辅助开发、提升效率是大趋势,注意也不要过于依赖。 2024年12月18日,GitHub 官方宣布了一个激动人心的重大消息&#xf…

web实操8-cookie

会话技术 会话: 一次会话中包含多次请求和响应。 客户端浏览器访问服务器的资源,只要客户端或者服务器端不关闭,这始终在一次会话范围内,这一次会话范围内可以包含多次请求并且收到多次相应。 一次会话:浏览器第一…

深度学习之超分辨率算法——SRCNN

网络为基础卷积层 tensorflow 1.14 scipy 1.2.1 numpy 1.16 大概意思就是针对数据,我们先把图片按缩小因子照整数倍进行缩减为小图片,再针对小图片进行插值算法,获得还原后的低分辨率的图片作为标签。 main.py 配置文件 from model im…

Javaweb 在线考试系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Qt for Python (PySide6)设置程序图标和任务栏图标

环境 使用Qt for Python开发Windows应用程序。 Python版本:3.12 Qt版本:PySide6 前言 先上一个简单的测试程序 from PySide6.QtWidgets import QMainWindow,QLabel,QApplication from PySide6 import QtGui import sysclass MainWindow(QMainWindow)…

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson,引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串,效果如下: json字符串 {"1": &q…

Windows平台C++部署 vcpkg 安装protobuf + gRPC实现图像传输

vcpkg 安装 https://github.com/microsoft/vcpkg.git.\bootstrap-vcpkg.bat vcpkg --version参考:Windows安装vcpkg教程(VS2022) protocbuf 安装与编译 vcpkg install grpc:x64-windowsprotocbuf 安装与编译 vcpkg install protobuf proto…

ScottPlot学习的常用笔记-02

ScottPlot学习的常用笔记-02 写在前面Why&Target:这里记一些杂项。上下文&背景 先记一下这几个小时的新收获先说一下,为什么可开发可视工具缩放的问题ScottPlot5.0起步.net Core: WinExe.Net Framework也是可以的 写在前面 Why&Target&…

CTF_1

CTF_Show 萌新赛 1.签到题 <?php if(isset($_GET[url])){system("curl https://".$_GET[url].".ctf.show"); }else{show_source(__FILE__); }?> 和 AI 一起分析 1.if(isset($_GET[url]))检查GET请求中是否存在名为url的参数。 curl 2.curl…

【Spring】Spring框架之-AOP

目录 1. AOP的引入 2. AOP相关的概念 2.1 AOP概述 2.2 AOP的优势 2.3. AOP的底层原理--目前先不具体阐述&#xff0c;后面讲 3. Spring的AOP技术-配置文件方式 3.1 AOP相关的术语 3.2 基本准备工作 3.3 AOP配置文件方式的入门 3.4 切入点的表达式 3.5 AOP的通知类型 …

我的2024年度总结

称着这个周末&#xff0c;写一篇2024年度总结&#xff0c;主要记录我过去一年的成长经历以及自己的一些收获。 过去一年的经历&#xff0c;可谓刻骨铭心&#xff0c;一个是24考研惨败&#xff0c;一个是毕设的准备&#xff0c;一个是省考的陪考&#xff0c;一个是找工作的焦虑…

Java 中的字符串

目录 Java 中的字符串字符串的创建字符串的比较字符串的拼接如何定义一个空的字符串 Java 中的字符串 字符串的创建 在 Java 中&#xff0c;可以通过以下几种方式创建字符串&#xff1a; 1.使用字符串字面量&#xff1a; String str "Hello, World!";2.使用 new…

数说故事聚焦“卖车”场景,推出AI汽车销售转化解决方案

没错&#xff0c;“卖车”我们也在行&#xff0c;为某车企“保住”了新车上市的订单。 深耕汽车行业多年&#xff0c;该车企10月份刚发布一款新能源车&#xff0c;其前期已经拥有了大量的保有客户和线上多渠道获取的潜在客户&#xff0c;然而&#xff0c;仍面临两大难题&#x…