我有一个 Keil ULINK2 USB 仿真器盒连接到JTAG我的主板上的连接器,与板载 Cortex-M3 CPU(TI/Stellaris/LuminaryMicro LM3S 系列)配合良好。看起来 JTAG 和 SWJ-DP 端口在这些 CPU 上共享相同的引脚(以及板上的连接器)。一个似乎没有 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}
上面似乎是调用的代码的一部分__rt_lib_init_stdio_1
.
到底是怎么回事?我不知道BKPT是做什么的。我认为它会引发一个软件断点,然后应该由调试器处理? Keil/ARM ULINK2 软件和硬件不应该已经为此进行配置吗?是否有一些技巧可以使调试 printf 与 Keil JTAG/sw 端口一起工作?
我不确定 sw 和 JTAG 端口之间有什么区别。 sw到底意味着什么,我相信它指的是板上JTAG物理连接器的两种可能模式之一,其中JTAG是经典但更有限的模式,没有跟踪支持,sw模式增加了跟踪支持,而不向JTAG添加任何引脚连接器布局?但这是嵌入式系统,神秘是常态。我是 Cortex-M3 开发的新手,自从 ARM7TDMI 时代以来,很多东西对我来说都是新的。但 Keil uVision 打印出以下消息:“ITM 仅适用于 SW 端口,不适用于 JTAG”。 SW 是您必须在主板上设计的不同物理端口吗? (我使用的是定制设计的应用板,而不是开发入门板。)
[谷歌搜索让我了解到这样一个事实_sys_open
和一些杂注__use_no_semihosting_swi
还有其他一些东西与这个难题密切相关,ROM 中的 BRKPT 指令可能是 SWI(“软件中断”)ARM 指令的某种 ARM 变体。]