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

news2024/12/22 5:02:24

最近在把玩一块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是一个开源的调试工具,可以用这个工具通过不同的调试器对嵌入式平台进行调试。

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

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

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

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

相关文章

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献(CAJPDF)批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件,格式为es6文件,需使用知网研学软件打开,故需先安装该…

ScottPlot学习的常用笔记-02

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

uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决

要在创建的key上添加配额 点击配额之后进入分配页面,分配完之后刷新uniapp就可以调用成功了。

【Harmony Next】多个图文配合解释DevEco Studio工程中,如何配置App相关内容,一次解决多个问题?

解决App配置相关问题列表 1、Harmony Next如何配置图标? 2、Harmony Next如何配置App名称? 3、Harmony Next如何配置版本号? 4、Harmony Next如何配置Bundle ID? 5、Harmony Next如何配置build号? 6、Harmony Next多语言配置在哪…

vue3实现打印table订单表格

废话少说,直接上代码! /utils/commonFunction.ts 把数字转换成繁体中文封装函数 export default function () {// 把数字转换成繁体中文function convertCurrency(money: any) {//汉字的数字var cnNums new Array("零","壹",&quo…

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode:Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文,将在Visual Studio Code中,安装和使用Markdown插件,以Marktext插件为例。 1.安装Marktext 打开VSCode,侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…

五十个网络安全学习项目——(九)无线网络安全分析

五十个网络安全学习项目——(九)无线网络安全分析 这个系列灵感来源是:50个网络安全项目创意:覆盖新手至专家级,本人打算把这些项目都做一遍,做好记录,也算是对自己的提升。 本文将对WAPI 协议…

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

【Java基础面试题025】什么是Java的Integer缓存池?

回答重点 Java的Integer缓存池(Integer Cache)是为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能 在 -128到127范围内的Integer对象会…

AI广告爆发元年,心动网络能否成下一个Applovin?

如果说2023年标志着AI大模型技术的崛起,那么2024年无疑是AI广告应用爆发的元年。 大洋彼岸的Applovin凭借着智能广告分发引擎完成彻底翻身,股价上涨超过30倍。一跃成为AI领域乃至整个美股市场的明星。 与此同时,心动网络作为同样深耕于游戏…

基于Python3编写的Golang程序多平台交叉编译自动化脚本

import argparse import os import shutil import sys from shutil import copy2from loguru import loggerclass GoBuild:"""一个用于构建跨平台执行文件的类。初始化函数,设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…

java全栈day20--Web后端实战(Mybatis基础2)

一、Mybatis基础 1.1辅助配置 配置 SQL 提示。 默认在 mybatis 中编写 SQL 语句是不识别的。可以做如下配置: 现在就有sql提示了 新的问题 产生原因: Idea 和数据库没有建立连接,不识别表信息 解决方式:在 Idea 中配置 MySQL 数…

MacOS下PostIn安装配置指南

PostIn是一款开源免费的接口管理工具, 下面介绍私有部署版本的MacOS下安装与配置。私有部署版本更适合有严格数据安全要求的企业,实现对数据和系统的完全控制。   1、MacOS服务端安装 Mac安装包下载地址:下载Mac安…

【Apache Doris】周FAQ集锦:第 26 期

SQL问题 Q1 doris 3.0存算分离模式下,建表的时是否需要指定表的副本数 不需要,指定了也会忽略;存算分离模式下,数据副本由远端存储去管控。 Q2 doris 通过dbeaver查询时报错:[SXXXX]… doris的错误码通常都是EXXXX&…

【Mongo工具】Mongo迁移工具之Mongo-shake

Mongo-Shake 简介 Mongo-Shake 是一个基于 MongoDB 操作日志(oplog)的通用服务平台。它从源 MongoDB 数据库中获取操作日志,并在目标 MongoDB 数据库中重放,或者通过不同的隧道发送到其他终端。如果目标端是 MongoDB 数据库&…

【Unity基础】AudioSource 常用方法总结

在 Unity 中,AudioSource 组件用于控制音频的播放和管理。以下是常用的 AudioSource 控制方法及其说明。 1. 播放和暂停音频 Play():开始播放音频,如果是从暂停的地方继续播放,可以直接调用。Pause():暂停当前播放的…

flink SQL实现mysql source sink

接上文:一文说清flink从编码到部署上线 环境说明:MySQL:5.7;flink:1.14.0;hadoop:3.0.0;操作系统:CentOS 7.6;JDK:1.8.0_401。 1.代码实现 1.1 E…

知乎 PB 级别 TiDB 数据库集群管控实践

以下文章来源于知乎技术专栏 ,作者代晓磊 导读 在现代企业中,数据库的运维管理至关重要,特别是面对分布式数据库的复杂性和大规模集群的挑战。作为一款兼容 MySQL 协议的分布式关系型数据库,TiDB 在高可用、高扩展性和强一致性方…

SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频

要使用阿里云视频点播(VOD)实现一个教育网站,其中用户需要成为会员后才能查看视频,这个过程包括上传视频、设置权限控制、构建前端播放页面以及确保只有付费会员可以访问视频内容。 1. 视频上传与管理 创建阿里云账号&#xff…

【前端】 async 和 await 以及 generator生成器函数

一、背景 这一篇随机主要是想记录一下自己学习js中有关异步内容的东西。然后发现有人拿异步跟生成器函数进行比较了一下,因此一起学习了一下。 二、知识点相关内容及实验test 2.1 generator 生成器函数 generator函数的作用:每次访问返回函数中yield…