将 C 代码中的调试文本打印到 Lauterbach TRACE32

Print debug text from C code into Lauterbach TRACE32

是否可以将调试文本从 C 代码(运行 在嵌入式系统上)打印到 Lauterbach TRACE32(通过 Lauterbach 硬件连接)?以前我们都是通过UART(串口)输出,现在不行了

可以将文本从目标应用程序打印到 TRACE32。一些供应商将您搜索的机制称为 JTAG 终端Semihosting (ARM) 或 Hostlink (新思科技)。

这是在 TRACE32 中使用 TERM 命令组处理的。

通常的做法如下:

  • 将 t32term.c、t32term_memory.c 和 t32term.h 添加到您的项目中。您可以在位于 /demo/etc/terminal/t32term.

    的 TRACE32 安装中找到这些文件
  • 使用定义的宏 T32_TERM_BLOCKED=1、T32_TERM_METHOD_MEMORY=1 和 T32_TERM_MEMORY_BLOCKED_SIZE=256 编译 t32term.c 和 t32term_memory.c。例如:

     TERMOPT:=-DT32_TERM_BLOCKED=1 -DT32_TERM_METHOD_MEMORY=1 -DT32_TERM_MEMORY_BLOCKED_SIZE=256
     gcc  $(TERMOPT) -c  -o t32term.o  t32term.c
     gcc  $(TERMOPT) -c  -o t32term_memory.o  t32term_memory.c
    

    当然,除了“gcc”之外,您还必须在此处为您的目标使用具有所有 CPU 特定选项的交叉编译器。

  • 在您的应用程序中使用函数 T32_Term_Puts(const char *str) 将文本缓冲区发送到 TRACE32

  • 要使用 printf() 之类的东西,请在 T32_Term_Puts()vsprintf() 周围编写一个包装函数。一些编译器的 C 库已经提供了一些 printf(),它最终调用了一些弱声明的 puts() 函数,你可以用 T32_Term_Puts().

    覆盖它
  • 在链接期间确保缓冲区 T32_Term_Memory_Tar2HostBufferT32_Term_Memory_Host2TarBuffer 被放入未缓存的内存中。

  • 在TRACE32中使用以下命令:

     SYStem.MemAccess Enable   // Enable memory access to running CPU
     TERM.METHOD BufferE E:T32_Term_Memory_Tar2HostBuffer E:T32_Term_Memory_Host2TarBuffer
     TERM.GATE
    

window TERM.GATE 接收您用 T32_Term_Puts() 发送的数据。 你必须保持打开状态。

TERM.METHOD 指定 TRACE32 如何从您的目标应用程序接收打印数据的方式。 BufferE 方法很常见,适用于所有支持调试器读取内存的 CPU,而 CPU 是 运行。如果无法使用 BufferE,您可能还需要使用其他方法。

对于方法 BufferE,您必须允许调试器访问目标内存,而 CPU 是 运行。这是通过命令 SYStem.MemAccess Enable 完成的。根据您正在调试的 CPU 系列和 TRACE32 的版本,您必须使用关键字 CPUDAPNEXUS 而不是 Enable.

该机制不仅允许您向 TRACE32 发送文本。它还允许您从 PC 运行 TRACE32 打开文件、将数据写入文件、获取系统时间或启动应用程序。

如果您的目标芯片包含 ITM 或 STM 硬件跟踪模块,并且您拥有 Lauterbach 的跟踪硬件(如 CombiProbe 或 PowerTrace),您还可以使用该机制将文本从您的目标应用程序发送到 TRACE32。