4

我有一个 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 变体。]

4

4 回答 4

6

这对我来说是一个失败,无法理解 stdio 没有实现,而是您必须提供自己的实现,通常在一个名为“retarget.c”的文件中完成。文件名是纯粹的约定,但在 Keil 的 uVision/RTLIB 文档中有很好的记录(事实证明)

于 2010-07-13T19:34:24.623 回答
3

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

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

BKPT 是工具插入源代码以触发调试器的指令。当调试器不支持硬件断点(或者您已经使用了完整的断点)时,IDE 就是这样让您向代码添加断点的。

于 2010-07-13T12:21:03.193 回答
2

SW 是一个两线接口,可以访问设备上的调试端口。

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

http://www.arm.com/files/pdf/Low_Pin-Count_Debug_Interfaces_for_Multi-device_Systems.pdf

于 2010-08-10T03:38:10.710 回答
2

要在 Keil uVision 中处理这个问题,只需转到项目选项。在 Target 选项卡/Code Generation 中选中 Use MicroLIB 复选框。

于 2010-12-29T16:08:38.047 回答