Debugging 通过Cortex-M3 CPU上的printf进行输出调试,在BKPT指令+;关于JTAG和sw端口的混淆

Debugging 通过Cortex-M3 CPU上的printf进行输出调试,在BKPT指令+;关于JTAG和sw端口的混淆,debugging,embedded,arm,cortex-m3,jtag,Debugging,Embedded,Arm,Cortex M3,Jtag,我有一个Keil ULINK2 USB仿真器盒连接到我的主板上的连接器上,它与板上的Cortex-M3 CPU(TI/Stellaris/LuminaryMicro LM3S系列)配合良好。在这些CPU上,JTAG和SWJ-DP端口似乎共享相同的引脚(从而共享板上的连接器)。一个似乎没有ITM(printf)功能,另一个有 以前的固件人员一直使用stdio到UART(串行端口),但我需要释放串行端口,以便调试消息不会干扰发送/接收到串行端口的其他数据,因此我需要将跟踪消息转到其他位置。不幸的是,

我有一个Keil ULINK2 USB仿真器盒连接到我的主板上的连接器上,它与板上的Cortex-M3 CPU(TI/Stellaris/LuminaryMicro LM3S系列)配合良好。在这些CPU上,JTAG和SWJ-DP端口似乎共享相同的引脚(从而共享板上的连接器)。一个似乎没有ITM(printf)功能,另一个有

以前的固件人员一直使用stdio到UART(串行端口),但我需要释放串行端口,以便调试消息不会干扰发送/接收到串行端口的其他数据,因此我需要将跟踪消息转到其他位置。不幸的是,我在这个板上只有一个串行端口。我认为这个CPU中的ITM(跟踪)特性意味着我可以将调试printf消息直接发送到我的调试器/IDE(Keil uVision)。TI/Stellaris CPU文档将此功能称为“串行线JTAG调试端口(SWJ-DP)”,我已经读过,对其的支持肯定是Keil uVision IDE中实现的功能

在我的代码中添加printf消息会导致我的代码在开始调试时锁定。锁定似乎在链接到我的应用程序的RTL库中,在函数_sys_open中,在BKPT指令中:

                 _sys_open:
  0x00009D7A B50E      PUSH     {r1-r3,lr}
  0x00009D7C E9CD0100  STRD     r0,r1,[sp,#0]
  0x00009D80 F7FFFC0F  BL.W     strlen (0x000095A2)
  0x00009D84 9002      STR      r0,[sp,#0x08]
  0x00009D86 4669      MOV      r1,sp
  0x00009D88 2001      MOVS     r0,#0x01
>>0x00009D8A BEAB      BKPT     0xAB
  0x00009D8C BD0E      POP      {r1-r3,pc}
上述内容似乎是
\uu rt\u lib\u init\u stdio\u 1
调用的代码的一部分

发生了什么事?我不知道BKPT做什么。我假设它会引发一个软件断点,然后该断点应该由调试器处理?Keil/ARM ULINK2软件和硬件是否已经为此进行了配置?让调试printf与keiljtag/sw端口一起工作有什么诀窍吗

我不确定sw和JTAG端口之间的区别是什么。sw的确切含义是什么?我认为它指的是板上JTAG物理连接器的两种可能模式之一,其中JTAG是一种经典但更有限的模式,没有跟踪支持,sw模式在不向JTAG连接器布局添加任何管脚的情况下添加跟踪支持?但这是嵌入式系统,在这里,神秘是常态。我是Cortex-M3开发的新手,从旧的ARM7TDMI时代起,很多东西对我来说都是新的。但是Keil uVision打印出这样一条消息:“ITM仅与SW端口一起工作,而不与JTAG一起工作”。SW是否是必须在板上设计的不同物理端口?(我使用的是定制设计的应用程序板,而不是开发启动板。)


[谷歌搜索让我了解到这样一个事实,即
\u sys\u open
和一些pragma
\u使用\u no\u semihosting\u swi
和其他一些与这个谜题密切相关的东西,ROM中的BRKPT指令可能是swi('software-interrupt')ARM指令上的某种ARM变体。]

我用IAR EWW ARM工具链完成了这一操作,但“半托管”一词让我相信Keil的方法是类似的。在指定要链接到的标准库以使用半宿主时,应该有一个选项。这将在另一个库中编译/链接,该库通过JTAG端口将printf/putc重定向到调试器

因此,请查看Uvision IDE或make脚本中的项目选项。在IAR链接器命令行中,这是“-semihosting”,但对于Keil工具可能不同


BKPT是工具插入源代码以触发调试器的指令。这是当调试器不支持HW断点(或者您已经使用了全部断点)时,IDE使您能够向代码中添加断点的方式

我没有理解stdio没有实现,但是您必须提供自己的实现,通常在名为“retarget.c”的文件中完成。文件名是纯粹的约定,但在Keil的uVision/RTLIB文档中有很好的文档记录(事实证明),SW是一个双线接口,提供对设备上调试端口的访问

Arm在这里有一个关于它的.pdf文件:


要解决Keil uVision中的此问题,请转到项目选项。在目标选项卡/代码生成中,选中使用MicroLIB复选框。

是。这就是半托管的意思!Printf-redirected-through-JTAG。您应该知道,使用MicroLib还将影响更微妙的事情,例如软浮点操作的实现(如果您的核心没有FPU)将不符合IEEE-754标准。请查看此处以了解更多信息