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 r0p1
      set _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.cpu

tpiu create $_CHIPNAME.tpiu -dap $_CHIPNAME.dap -ap-num 0 -baseaddr 0xE0040000

if {[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 0

set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32f2x 0 0 0 0 $_TARGETNAME

flash 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博客

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RISC-V是一种开源指令集架构,与ARM和x86架构有很大的不同。首先,RISC-V是一种精简指令集(RISC架构,而ARM和x86架构则是复杂指令集(CISC)架构。其次,RISC-V是一种开放的指令集架构,任何人都可以使用和修改它,而ARM和x86则是专有的指令集架构,只有特定的公司可以使用和修改它们。此外,RISC-V的指令集非常简单,只有40多个指令,而ARM和x86则有数百个指令。最后,RISC-V的指令集非常灵活,可以根据不同的应用程序进行定制,而ARM和x86则不太灵活。 ### 回答2: RISC-V是一种基于精简指令集(RISC架构的开源指令集架构(ISA),它是为了解决当前计算机领域所面临的一系列问题而被开发出来的。相比较于ARM和X86架构RISC-V拥有一些独特的特点和优点,本文将详细介绍它们的差别。 首先,RISC-V的指令集架构相对较为简单。相比较于ARM和X86两种较为常见的指令集架构RISC-V的指令集更加精简、规范。它没有过多的指令集,且具有完整的操作系统支持,能够有效地降低开发成本和维护成本。这也意味着其适用于更小、更简单的设备。 其次,RISC-V采用了面向可扩展性的设计原则。这意味着RISC-V的用户可以选择采用其任意的指令集扩展来满足特定的需求,提升计算性能和能力。例如,若需要计算机视觉中的向量点乘,只需使用RVV指令集扩展即可。 第三,与ARM和X86指令集不同,RISC-V的指令集可以自由地使用,没有任何限制。这也意味着其开发人员可以更加自由地定制指令集以满足自己的需求。当然这远不仅仅是给RISC-V制造商带来了竞争优势:这个生态系统还包括许多可以实现自定义指令的开源IP内核,一定程度上应对了不同领域的应用需求。 最后,RISC-V是一个开放的指令集架构,而ARM和X86都是专有的指令集架构。因此,RISC-V可以激发出更多的创新和竞争。这种开源和开放的设计使RISC-V更容易获得社区贡献和广泛支持,同时也使他们能够快速地拓展到新的市场里。 总的来说,RISC-V 确实具有一些ARM和X86所没有的优点。它的开源性、可扩展性、简易性,以及自由的“无限制”使用和定制化都是其优势。虽然目前市场占有率和生态系统发展方面落后于ARM和X86,但RISC-V已经在一些行业内大有作为,有望成为物联网和边缘计算领域的首选架构之一。 ### 回答3: RISC-V、ARM和x86都是计算机架构的代表,在它们之间有着一些重要的差别,以下是详细分析。 处理器精简指令集(RISC-V)是一种精简的指令集架构,其优点包括高效的编译器生成代码,低功耗、低成本和可扩展性。 相比于其他指令集架构RISC-V要求其架构设计要尽可能的精简,同时需要满足通用计算和特定计算的要求。RISC-V在企业,学术和开源社区中均得到了广泛关注。 具有Modular ISA模块化的特性,可以为从嵌入式设备到超级计算,从单片到数据中心的广泛应用领域提供各种优秀解决方案。 ARM指令集架构在各种移动和嵌入式领域被广泛使用。ARM处理器具有高效率,良好的节能性能和灵活性。ARM架构不仅被应用于手机,平板和其他嵌入式设备中,它在工业自动化,医疗设备等领域的应用也在不断扩大。ARM架构的设计理念与RISC相似,但它比RISC提供了更高的灵活性和适应性。 x86指令集架构广泛应用于PC和服务器等领域。 x86设计早在最初的计算机时期就被引入打破主导地位,自从第一款Intel 8086处理器发布以来,x86 CPU架构一直在发展和优化。 它具有庞大的软件生态,因此开发人员可以使用各种编程语言进行编程,从而提供多样化的软件解决方案。x86对多线程和多个核处理器提供极佳的支持。 虽然RISC-V、ARM和x86都是广泛应用于计算领域的处理器架构,但它们之间具有不同的优缺点。一般而言,RISC-V在精简、模块化、可扩展性等方面具有优势,ARM在能效,灵活性,扩展性方面较优,而x86则具有更强的软件生态和多线程支持。因此,这些架构可以根据应用领域提供最优的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值