文章目录
开始调试
常见的调试工具 (JLINK JTAG )
总结:
- J-Link (普适性强)
J-Link是为支持仿真ARM内核芯片推出的JTAG仿真器。JLink充当的作用就是USB转JTAG,支持JTAG和SWD两种模式。 - ST-Link (Stm32首选)
ST-Link是为评估、开发STM8/STM32系列MCU而设计的集在线仿真与下载为一体的开发工具.支持JTAG/SWD/SWIM三种模式。
注意ST-Link有很多版本,v1,v2,v3,还有更常见的简版。 ST-LInk到底有那些版本
下图正是我用的简版stlink
调试协议
- JTAG
JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试,现在多数的器件都支持JTAG协议,ARM、DSP、FPGA等,JTAG接口的单片机用电脑USB下载调试程序,需要用到J-Link(USB转JTAG)。 具体通信引脚参考源文章。
2. SWD
SWD全称是Serial Wire Debug(串行调试)
在高速模式下,SWD比JTAG更可靠一些
3. SWIM
SWIM接口常见于ST的STM8系列单片机
Stm32中用于调试的复用io
- SWD是一种比JTAG更节省引脚资源的调试方法,它只需要两个引脚(SWDIO和SWCLK)就可以实现对目标系统的调试。
- 相比之下,传统的JTAG调试需要至少五个引脚(TCK、TMS、TDI、TDO和TRST)。
认识Keil MDK的调试界面
- ①复位,回到整个程序的入口
- ②全速运行
- ③Step (F7 或 Ctrl+F7)
功能:当你在一个函数调用上使用 Step 命令时,调试器会进入该函数的内部,并开始逐行执行该函数的代码。
应用场景:当你想要深入了解函数内部的工作机制时,使用 Step 命令。 - ④Step Over (F10 或 Ctrl+F10)
功能:当你在一个函数调用上使用 Step Over 命令时,调试器会执行该函数调用(但不会进入函数调用的内部。),然后停留在函数返回后的下一行代码。
应用场景:当你不关心某个函数内部的细节,只想看到函数调用的结果时,使用 Step Over 命令。 - ⑤Step Out(Shift+F11 或 Ctrl+Shift+F11)
功能:Step Out 命令使调试器从当前所在的函数中返回到调用它的函数。
行为:当你在一个函数内部执行时,使用 Step Out 命令会让调试器执行完当前函数的所有剩余代码,并回到调用该函数的地方继续执行。
应用场景:当你已经进入了某个函数内部,并且不再需要继续跟踪该函数的执行细节时,可以使用 Step Out 命令返回到上一层函数。 - ⑥Run to Curserline
可快速跳转到某一行
将光标放置在你希望程序运行到的行上。
点击工具栏上的“Run to Cursor”按钮,或者使用快捷键(通常是Ctrl + R)。
局部变量显示不出地址?
值得注意的是,一般要查看变量地址可以直接在 Watch 窗口直接输入 &变量名 来查看。但是对于局部变量,编译器很可能会使用 CPU 寄存器来实现,比如本例中的 ret 变量就是使用 R4 寄存器实现的,这种情况下是无法查看变量地址的。当然,如果程序中有引用到该变量的地址,编译器是不会使用 CPU 寄存器来实现该局部变量的,会使用 RAM 来实现以便可以引用其地址。
- 当局部变量被存储在寄存器中时,你是无法查看其内存地址的,因为寄存器并不对应于内存地址。
- 如果程序中有引用到局部变量的地址(例如,通过指针访问),编译器不会将这个局部变量分配给寄存器,而是会分配给RAM中的某个位置,以便可以引用其地址。
这是因为指针需要一个实际的内存地址来访问变量。
全局变量无法在watch窗口中显示? cannot evaluate
点击跳转我的博客详细讲解