我有一个 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 库中,在 BKPT 指令的函数 _sys_open 中:
_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 软件和硬件不应该已经为此配置了吗?是否有一些技巧可以使 debug 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 变体。]