代码之家  ›  专栏  ›  技术社区  ›  Warren P

在Cortex-M3 CPU上通过printf进行输出调试,BKPT指令暂停,JTAG和sw端口混淆

  •  3
  • Warren P  · 技术社区  · 16 年前

    JTAG 我的主板上的连接器,与板上的Cortex-M3 CPU(TI/Stellaris/LuminaryMicro LM3S系列)配合良好。似乎JTAG和SWJ-DP端口在这些CPU上共享相同的引脚(因此也是板上的连接器)。一个似乎没有ITM(printf)功能,另一个有。

    在我的代码中添加printf消息会导致我的代码在开始调试时被锁定。锁定似乎在链接到我的应用程序的RTL库中,在函数\u sys\u 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 .

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

    [谷歌搜索让我了解到 _sys_open __use_no_semihosting_swi 在这个谜团中还密切涉及到其他一些东西,ROM中的BRKPT指令可能是SWI(“软件中断”)ARM指令上的某个ARM变体。]

    4 回复  |  直到 16 年前
        1
  •  6
  •   Warren P    16 年前

    我没有理解stdio没有实现,但是您必须提供自己的实现,通常在名为“retarget.c”的文件中实现。文件名是纯约定的,但在Keil的uVision/RTLIB文档中有很好的文档记录(事实证明)

        2
  •  3
  •   sbass    16 年前

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

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

    BKPT是工具插入源代码以触发调试器的指令。这就是IDE如何在调试器不支持HW断点(或者您已经使用了完整的断点)时向代码中添加断点。

        3
  •  2
  •   Captain NedD    16 年前

    SW是一个双线接口,提供对设备上调试端口的访问。

    Arm在这里有一个.pdf文件:

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

        4
  •  2
  •   skozbial    15 年前

    推荐文章