c - 将 C 代码中的调试文本打印到 Lauterbach TRACE32
问题描述
是否可以将 C 代码(在嵌入式系统上运行)中的调试文本打印到 Lauterbach TRACE32(通过 Lauterbach 硬件连接)?以前我们通过UART(串行连接)输出它,但现在它不可用。
解决方案
可以将目标应用程序中的文本打印到 TRACE32。一些供应商将您正在搜索的机制称为JTAG Terminal、Semihosting (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 的版本,您必须使用关键字CPU
,DAP
或者NEXUS
代替Enable
.
该机制不仅允许您将文本发送到 TRACE32。它还允许您从运行 TRACE32 的 PC 打开文件、将数据写入文件、获取系统时间或启动应用程序。
如果您的目标芯片包含 ITM 或 STM 硬件跟踪模块,并且您拥有来自 Lauterbach 的跟踪硬件(如 CombiProbe 或 PowerTrace),您还可以使用该机制将文本从目标应用程序发送到 TRACE32。
推荐阅读
- javascript - 如何将 momentjs 日期时间转换为字符串,反之亦然
- angular - 将大数据从 AgGrid 复制到剪贴板
- php - Magento 2 - 单击按钮缓存清理目录图像时出现错误消息
- php - 更新/删除多个检查数据
- android - 错误通知:给定区域必须与位图的尺寸相交
- excel - 通过 VBA 关闭应用程序错误仅适用于某些系统
- ios - Swift iOS Intent 扩展:无法读取数据,因为它的格式不正确
- sql - 年度销售额比较的 CASE 表达式?
- java - Java 中 void lambda 的函数纯度
- google-cloud-monitoring - 图表统计视图中的 Stackdriver 相似度