目录
前言
在嵌入式系统开发的世界里,仿真器和调试器是两个不可或缺的工具,它们帮助开发者跨越从代码编写到硬件运行的鸿沟。特别是在ARM架构的微处理器或微控制器上进行开发时,仿真器和调试器的使用尤为重要。仿真器提供了一个模拟的环境,允许开发者在没有实际硬件的情况下测试和调试代码。而调试器则提供了一种连接到实际硬件的方式,使开发者能够实时地观察和操控运行中的程序。本文将详细介绍ARM仿真器和调试器的基本概念、特点以及它们在嵌入式系统开发中的应用。
仿真器
ARM仿真器是用于模拟ARM架构微处理器或微控制器的工具,以便开发和测试嵌入式系统软件。这些仿真器允许开发人员在计算机上模拟ARM处理器的执行,而无需实际的硬件设备。ARM仿真器通常包含以下特点:
- 指令级仿真: 提供对ARM指令级别的仿真,使开发人员能够逐步执行和调试他们的代码。这有助于发现和纠正程序中的错误。
- 硬件级仿真: 一些仿真器提供对ARM处理器内部结构的硬件级仿真。这样的仿真器允许开发人员查看和理解处理器的内部状态,包括寄存器、缓存和其他关键硬件组件。
- 外设仿真: 能够仿真与ARM处理器相关的外设和设备,例如UART、SPI、I2C等。这使得开发人员可以在仿真环境中测试与外围设备交互的代码。
- 调试功能: 提供强大的调试功能,如断点、单步执行、观察寄存器和内存等。这些功能使开发人员能够更容易地定位和修复代码中的问题。
- 多核仿真: 一些高级仿真器支持多核处理器的仿真,以模拟多核系统中的并发执行和通信。
- 性能分析: 一些仿真器还提供性能分析工具,以帮助开发人员了解他们的代码在模拟环境中的执行性能。
注:目前市面上最流行的是普中ARM仿真器V9版,可以配合Keil、IAR、ADS、OpenOCD等开发环境进行仿真。通常ARM仿真器也可以进行烧录操作,但是尺寸较大,价格较贵。早期没有办法让硬件MCU单步执行,只能通过特殊的方式模拟真实运行环境进行代码调试。
但是,目前主流的MCU (ARM全系, C51等等)都已内部支持了SW/JTAG调试,因此,仿真需求逐渐被真机调试所替代,企业开发越来越少用到仿真。而是通过调试器进行断点调试,单步执行。
调试器
ARM调试器是一种用于调试ARM架构微处理器或微控制器的工具,它通常与硬件调试接口(如JTAG或SWD)结合使用,允许开发人员观察、分析和调试他们的代码。以下是一些ARM调试器的特点:
- 硬件调试接口支持: ARM调试器通常支持标准的硬件调试接口,如JTAG(Joint Test Action Group)或SWD(Serial Wire Debug),用于连接目标系统的调试端口。
- 实时调试: 提供实时调试能力,允许开发人员在目标系统上观察代码执行的情况,包括寄存器状态、内存内容以及各种外设和设备的状态。
- 断点支持: 允许设置断点,使程序在指定的条件下停止执行。这有助于定位和修复代码中的问题。
- 单步执行: 提供单步执行功能,允许开发人员逐一执行代码,更详细地分析程序的执行过程。
- 观察寄存器和内存: 可以观察和修改处理器寄存器的值,同时查看和编辑目标系统的内存内容。
- 调试信息支持: 对于使用高级编程语言(如C或C++)编写的程序,调试器通常支持调试信息,帮助开发人员直观地理解源代码和目标代码之间的对应关系。
- 多核调试: 针对多核处理器的系统,一些调试器支持同时调试多个处理核心,使开发人员能够分析多核系统的交互和并发行为。
- 性能分析: 一些高级调试器提供性能分析工具,帮助开发人员识别代码中的性能瓶颈,并进行优化。
- RTOS(实时操作系统)调试: 对于嵌入式系统,一些调试器具备RTOS调试功能,能够与实时操作系统集成,帮助开发人员分析系统的实时行为。
编者按:
调试并非开发的必备环节,通常是在解决棘手的bug时,使用的技巧。但是代码单步执行,断点调试的思想要进行吸收,高手从来不依赖于工具,因为整个代码运行流程应该已经在脑中跑了很多遍,哪里可能出问题,一个简单的log日志通常即可辨明。
要学会摆脱对工具的依赖,从更高的维度定位问题,分析问题,解决问题!
调试接口
调试接口通常配合串口(COM)进行数据打印,目前使用的最多的接口是SWD,因为其接线简单,使用方便大部分MCU都支持。这里表格里的引脚省略了 VCC和GND。实际开发时,要根据需要对MCU电路板进行供电接线。
SWD | JTAG | |
全称 | Serial Wire Debug | Joint Test Action Group |
联系 | 较新的调试接口,用于ARM处理器架构 | 较老的调试和测试接口标准 |
区别 | 相对简单,适合资源有限的系统 | 功能较为复杂,可以用于多个设备的调试和测试 |
引脚 | 通常只需要2根 SWDCLK(Serial Wire Clock):用于时钟信号 | 通常需要5根或更多 TMS(Test Mode Select):测试模式选择 TDI(Test Data Input):测试数据输入 TDO(Test Data Output):测试数据输出 TRST(Test Reset):测试复位 |
出品 | ARM | IEEE的Joint Test Action Group (JTAG) |
可以在Keil的Debug中根据你的接线,切换不同的Port (默认的SW即SWD)
调试协议
查看Keil支持的调试协议
其中最常用的有 ST-Link、DAP-Link、J-LINK ,支持这些协议的设备都可以在某宝直接买到。
市面烧录调试器
目前推荐使用DAP-Link加COM串口调试功能的烧录器,DAP-Link是开源协议没有法律风险,烧录和调试都可以实现,其次有RX、TX的串口引脚,方便日志打印、发送测试串口数据。价格上也十分诱人。
J-LINK
ST-LINK V2官方版
ST-LINK V2平替版
DAP-LINK 开源版(推荐)
DAP-LINK 增强版 (推荐)
调试流程
编译项目
点击编译所有文件
准备调试
设置优化级别为-O0 (不优化)
开始调试
点击进入调试模式,此时keil会将最新的固件进行烧录,并进入调试模式
设置断点并执行代码
先在需要的地方设置断点,然后点击执行代码,代码即可在运行到红点所在行时停止(注:停下时,断点所在行并没有执行)。此时我们可以查看断点所在函数的局部变量以及所有全局变量的值。
注意:
如果需要在运行时查看变量的值,而不是断点时才能显示。则需要把变量声明放到函数外,成为全局变量。否则会出现其数值为cannot evaluate
或 <not in scope>
的现象
重置CPU
点击该图标,可将所有变量及CPU寄存器重置,类似于重启设备
退出调试
再次点击刚刚那个调试图标即可退出调试模式
总结
仿真器和调试器是ARM嵌入式系统开发中的两大重要工具,它们共同构成了开发者与代码和硬件之间的桥梁。仿真器通过模拟ARM处理器的行为,使得开发者能够在软件环境中测试代码,而无需担心硬件的不可用性。调试器则通过物理连接至ARM处理器,允许开发者实时地观察和控制程序的执行,从而更快地定位和解决问题。无论是仿真器的指令级仿真、硬件级仿真,还是调试器的断点支持、单步执行,这些功能都在极大地提高开发效率和代码质量方面发挥了关键作用。随着技术的发展,仿真器和调试器也在不断地进化,以适应更复杂、更高性能的ARM处理器的需求,为嵌入式系统开发者提供更加高效和便捷的开发体验。
标签:仿真,开发人员,--,ARM32,仿真器,断点,ARM,调试,调试器 From: https://blog.csdn.net/xuewenyu_/article/details/139704929