首页 > 解决方案 > 将 C 代码中的调试文本打印到 Lauterbach TRACE32

问题描述

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

标签: ctrace32lauterbach

解决方案


可以将目标应用程序中的文本打印到 TRACE32。一些供应商将您正在搜索的机制称为JTAG TerminalSemihosting (ARM) 或Hostlink (Synopsys)。

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

通常的做法如下:

  • 将 t32term.c、t32term_memory.c 和 t32term.h 添加到您的项目中。您可以在 <t32>/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_Tar2HostBuffer并被T32_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
    

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

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

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

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

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


推荐阅读