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

And*_*kin 2 c trace32 lauterbach

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

Hol*_*ger 5

可以将目标应用程序中的文本打印到 TRACE32。一些供应商将您正在搜索的机制称为JTAG 终端半主机(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
    
    Run Code Online (Sandbox Code Playgroud)

    当然,您必须在这里使用带有所有 CPU 特定选项的目标的交叉编译器,而不仅仅是“gcc”。

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

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

  • 在链接期间确保缓冲区T32_Term_Tar2HostBufferSizeT32_Term_Memory_Host2TarBuffer被放置到未缓存的内存中。

  • 在 TRACE32 中使用以下命令:

     SYStem.MemAccess Enable   // Enable memory access to running CPU
     TERM.METHOD BufferE E:T32_Term_Tar2HostBufferSize E:T32_Term_Memory_Host2TarBuffer
     TERM.GATE
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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