RISC-V/ARM mcu OpenOCD 调试架构解析
Risc-v/ARM mcu OpenOCD 调试架构解析
最近有使用到risc-v的单片机,所以了解了下risc-v单片机的编译与调试环境的搭建,面试时问到risc-v的调试可参看以下内容。
risc-v根据官方的推荐,调试器服务是选择OpenOCD,DopenOCD(开放片上调试器)是一个开源的片上调试器,旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。OpenOCD的功能需要调试仿真器来辅助完成,调试仿真器是一个提供调试目标电信号的小型硬件单元。常用的有JLINK、STLink等一些开发板直接集成了调试仿真器.
基于openOCD的调试架构如下图所示:

PC端可以是GDB编译调试端或者是一个集成的IDE开发环境,它包含了一个OpenOCD的驱动,这个驱动是根据具体芯片有所差别的,OpenOCD提供了一系列调试的接口,芯片厂生产的芯片要支持OpenOCD就需要做自己家的驱动软件,还有一部分的配置文件(xx.cfg)是用来在上层配置具体芯片型号和调试器硬件类型以及flash编程信息的。cfg文件分几种类型如下:
interface :这些用于调试适配器。指定要使用的配置的文件 特定的JTAG,SWD和其他适配器在这里。
board :关于电路板,PWA,PCB,他们有很多名字。主板文件 包含特定于板的初始化项。
target :关于芯片。“target ”目录代表JTAG TAP。在芯片上 OpenOCD应该控制哪个,而不是一个板子。两种常见的目标类型 是ARM芯片和FPGA或CPLD芯片。当一个芯片有多个TAP(也许它同时具有ARM和DSP内核)时, 目标配置文件定义了所有这些。
可见OpenOCD的github: https://github.com/openocd-org/openocd
对比基于ARM内核的调试架构,可以看到基本结构类似,JLINK定义了一个软件调试层面的RDI接口标准,即Remote debug interface. Keil、IAR、ADS这些开发环境按照RDI标准进行定制,即可以支持JLINK调试。RDI底层使用USB传输,当然,其他硬件接口也是可以的。ARM体系原先是支持JTAG硬件调试接口的,随着cortex系列增加SWD调试规范,现在越来越多的调试器选择SWD接口。其接线少,速率高,也比较稳定。JTAG 20个口太占用pin资源了。JLINK V6开始支持SWD,现在V8支持已经足够好了。

两种内核的调试架构基本换汤不换药,都SEGGER和OpenOCD都提供了标准结构给芯片厂,芯片厂基于自家的芯片实现接口,底层都是通过USB驱动实现PC和调试器的通信,都包含下载算法的思路设计flash 编程方法。
下面就先看看,OpenOCD中的cfg文件配置方法吧,以stm32f4为例:
启动openocd服务,需要指定interface和target(target和board可以选择,最小系统板选target, 板载DRAM, 外部Flash的可以带上board的cfg文件)
openocd -f D:\OpenOCD\share\openocd\scripts\interface\stlink-v2.cfg -f D:\OpenOCD\share\openocd\scripts\board\stm32f4discovery.cfg
配置risc-v内核:
# script for stm32f4x family#
# stm32 devices support both JTAG and SWD transports.
#
source [find target/swj-dp.tcl]
source [find mem_helper.tcl]if { [info exists CHIPNAME] } {set _CHIPNAME $CHIPNAME
} else {set _CHIPNAME stm32f4x
}set _ENDIAN little# Work-area is a space in RAM used for flash programming
# By default use 32kB (Available RAM in smallest device STM32F410)
if { [info exists WORKAREASIZE] } {set _WORKAREASIZE $WORKAREASIZE
} else {set _WORKAREASIZE 0x8000
}#jtag scan chain
if { [info exists CPUTAPID] } {set _CPUTAPID $CPUTAPID
} else {if { [using_jtag] } {# See STM Document RM0090# Section 38.6.3 - corresponds to Cortex-M4 r0p1set _CPUTAPID 0x4ba00477} {set _CPUTAPID 0x2ba01477}
}swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cputpiu create $_CHIPNAME.tpiu -dap $_CHIPNAME.dap -ap-num 0 -baseaddr 0xE0040000if {[using_jtag]} {jtag newtap $_CHIPNAME bs -irlen 5
}set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32f2x 0 0 0 0 $_TARGETNAMEflash bank $_CHIPNAME.otp stm32f2x 0x1fff7800 0 0 0 $_TARGETNAME
flash bank $_CHIPNAME.otp stm32f2x 0x1fff7800 0 0 0 $_TARGETNAME
_WORKAREASIZE 是OpenOcd调试使用的ram空间,一般把flash的编程程序放在这里,然后需要编程的数据也放在这里面。
flash bank $_FLASHNAME stm32f2x 指定flash的名称和驱动,这里如果需要适配自己厂家的芯片的话,flash驱动是需要自己实现的,如果各位小伙伴,以后进入MCU厂,这个flash驱动时必须要会的。关于驱动的写法,阿目有时间再介绍一篇文章,内容比较多。
interface文件中简单配置:
echo "WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg"
source [find interface/stlink.cfg]
只需要配置自己使用是哪个调试硬件平台就好,这是使用的是stlink。
windows powershell 运行界面:


出现上述代表运行正常。其中第一个cfg文件为stlink接口文件 因为用的硬件为stlink,第二个cfg文件为板子对于芯片文件。stm32f407打开另一个cmd或者powershell arm-none-eabi-gdb .\rt-thread.elf
这个时候第一个窗口会显示:

这里的调试截图来源,亲测可用,感谢博主:利用openocd 在windows环境下GDB调试(调试器 stlinkv2)STM32_xpack-openocd 调试stlink-CSDN博客
相关文章:
RISC-V/ARM mcu OpenOCD 调试架构解析
Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机,所以了解了下risc-v单片机的编译与调试环境的搭建,面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐,调试器服务是选择OpenOCD,DopenOCD(开放片上…...
HackTheBox-Mist
整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口,将mist.htb加入到hosts文件后,访问mist.htb Pluck CMS文件读取 在…...
游戏引擎中的声音系统
一、声音基础 1.1 音量 声音振幅的大小 压强p:由声音引起的与环境大气压的局部偏差 1.2 音调 1.3 音色 1.4 降噪 1.5 人的听觉范围 1.6 电子音乐 将自然界中连续的音乐转换成离散的信号记录到内存中 采样 - 量化 - 编码 香农定理:采样频率是信…...
【WPF应用29】WPF中的ComboBox控件详解与应用示例
在Windows Presentation Foundation(WPF)应用程序开发中,ComboBox控件是一个非常重要的基础控件,它提供了一个下拉列表,允许用户从预定义的选项中选择一个值。ComboBox控件结合了文本框和列表框的功能,既能…...
Unity UGUI之Text组件基础认识
Text组件用于在游戏中显示文本。 下面来细看下它的基本信息。 一、基本属性: 如上图所示,即为Text组件的一些基本属性,其中, Text:要显示的文本内容。Font:文本所使用的字体。Font Style(字体…...
LeetCode 2810.故障键盘:双端队列模拟
【LetMeFly】2810.故障键盘:双端队列模拟 力扣题目链接:https://leetcode.cn/problems/faulty-keyboard/ 你的笔记本键盘存在故障,每当你在上面输入字符 i 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。 给你一个…...
ssm015基于java的健身房管理系统的设计与实现+vue
健身房管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间…...
【解决方案】荣耀系统Android8.0 system目录Read-only file system
本来以为直接把Charles证书改成系统证书格式,然后通过mt管理器root之后移动到系统证书目录就行了,结果访问baidu仍然显示网络错误,折腾一晚上。安装为用户证书,又与系统证书冲突。 手机型号:荣耀v10 EMUI:…...
【Web】记录Polar靶场<简单>难度题一遍过(全)
目录 swp 简单rce 蜜雪冰城吉警店 召唤神龙 seek flag jwt login iphone 浮生日记 $$ 爆破 XFF rce1 GET-POST 被黑掉的站 签到题 签到 session文件包含 Dont touch me robots php very nice ezupload cookie欺骗 upload 干正则 co…...
生产制造园区数字孪生3D大屏展示提升运营效益
在智慧园区的建设中,3D可视化管理平台成为必不可少的工具,数字孪生公司深圳华锐视点打造的智慧园区3D可视化综合管理平台,致力于将园区的人口、经济、应急服务等各项业务进行3D数字化、网络化处理,从而实现决策支持的优化和管理的…...
R语言技能 | 不同数据类型的转换
原文链接:R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天,再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢? 我们在使用R语言做数据分析时,会一直对数据进行不同类型的转换,有时候…...
python如何处理文本错误
在python中,如果读取的文本文件不在程序的目录中,会提示FileNotFoundError 如果不能确定文本文件是否在目录中,可以用try except语句 代码如下 from pathlib import PathpathPath(alice.txt) try:contentspath.read_text(encodingutf_8) e…...
Cesium 批量种树
1、准备树种建模 分各种级别建模LOD1-LODN 其中meta.json长这样: Gltf再3Dmax中导出Obj,再通过ObjToGltf的工具转换,参考 https://editor.csdn.net/md/?articleId96484597 2、准备shp点数据。(shp中的点位就是种树的位置) 3、准…...
Docker基础系列之TLS和CA认证
Docker基础系列之TLS和CA认证 文章目录 Docker基础系列之TLS和CA认证1. 引言2. 初识TLS和CA3. 开启TLS和CA认证3.1 生成证书3.2 配置TLS 4. 参考和感谢 1. 引言 我们日常工作当中会遇到这些需求: 监控Docker容器在idea开发工具中连接Docker,直接发布至…...
总结:微信小程序中跨组件的通信、状态管理的方案
在微信小程序中实现跨组件通信和状态管理,有以下几种主要方案: 事件机制 通过事件机制可以实现父子组件、兄弟组件的通信。 示例: 父组件向子组件传递数据: 父组件: <child binddata"handleChildData" /> 子组件: Component({..., methods: { handleChildData(…...
企业能耗数据分析有哪些优势?怎样进行分析?
随着互联网技术的发展,企业在运营中会出现大量的用能数据,但却做不了精准的用能数据分析,导致数据没有得到有效利用,以及产生能源浪费现象。 为什么企业用能分析总是难? 一、用能分析过程复杂 由于用能分析过于复杂…...
containerd配置HTTP私仓
文章目录 1. 🛠️ 基础环境配置2. 🐳 Docker安装3. 🚢 部署Harbor,HTTP访问4. 📦 部署ContainerD5. 🔄 修改docker配置文件,向harbor中推入镜像6. 配置containerd6.1. 拉取镜像验证6.2. 推送镜像…...
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
在Go语言中,类型转换指的是将一个数据类型的值转换为另一个数据类型的过程。Go语言中的类型转换通常用于将一种数据类型转换为另一种数据类型,以满足特定操作或需求。 类型转换的基本语法 在Go语言中,类型转换的基本语法为: ne…...
Chatgpt掘金之旅—有爱AI商业实战篇|文案写作|(三)
演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、前言 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&…...
c++20 的部分新概念及示例代码-Contracts,Ranges
C20 引入了 contracts(契约),这是一种编程范式,它允许程序员在代码中添加先决条件(preconditions)、后置条件(postconditions)和断言(assertions)等契约&…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
