使用 openOCD 提取 Cortex-M (STM32F4) 上的 ETB 踪迹

Using openOCD to extract ETB traces on Cortex-M (STM32F4)

STM32F4发现(Cortex-M4)有ETB,一个存储指令轨迹的缓冲区。如何使用 OpenOCD 和片上 st-link 调试器从 ETB 中提取跟踪信息?

我对 SWO/SWD 有点困惑。我应该使用什么?另外,我需要任何额外的硬件来提取痕迹吗?

谢谢

恐怕没听说过 STM32F4 在已实现的子集中包含一个 嵌入式跟踪缓冲区 (ETB) ARM core 及其 CoreSight features。 我认为这是因为 ETB 是一个可选功能,并且 ST 已决定 不 configure/implement 在其 STM32F4 控制器 及其嵌入的 ARM 内核中使用此 ETB 选项。

我查阅了programming/reference一位STM32F4xx家族上位代表的手册和datasheet,没有找到任何关于ETB的信息,这似乎证实了这个假设。


现在,如果要从 MCU 流式传输跟踪数据,ETB 不是唯一的选择:

  • STM32F4 控制器都有一个 指令跟踪宏单元 (ITM),它可以提供软件定义的字符输出流或数据值的快照或在 Data Watchpoint/Trace (DWT) 单元的协助下,在您的断点处或定期收集的程序计数器。 您可以使用 ITM

    • 使用字符输出检测应用程序 (printf())
    • 分析您的申请
    • 通过跟踪程序断点或数据观察点来检查软件的某些 properties/state 流程

    ITM 可通过 SWO 引脚使用,使用任何适配器硬件,如任何版本的 ST-Link、j-Link、uLink-* 等 这是一个合适的跟踪接口,因为它可以在断点处停止 CPU 的情况下工作,因此检查不会破坏系统的实时属性。

  • 许多 STM32F4 控制器(AFAIK,具有 >= 100 个引脚的控制器)包含一个 嵌入式跟踪宏单元 (ETM),它能够跟踪程序计数器( PC) 和 every CPU 周期的数据,因此您可以使用它来跟踪控制器的整个控制流(和数据流),也无需停止它断点。

    要跟踪的大量数据(确保您有空闲的 USB3 端口...)只能通过 GPIOE 组周围的同步端口接口以有用的方式传送(替代函数 TRACECLK+TRACED0/1/2/3 => 总共5个引脚),它连接到ETM旁边的跟踪端口接口单元(TPIU)

    为了使用这项技术,您需要更昂贵的调试适配器变体,如 j-Trace、uLink-Pro 或 Lauterbach。我所知道的最便宜的支持 ETM 的适配器(虽然还没有使用过)是 PDQlogic 的 QTrace,起价约为 379 英镑。其他的价格约为 1-4 k£/k€/k$。


从你的问题听起来的方式告诉我你可能刚刚开始对 STM32 进行编程。因此,我建议您使用内置 ST-Link 的开发板。这是获得(先进行 SWD 调试 运行,然后)SWO 跟踪 运行 的最便宜的解决方案。 Atollic 博客很好地介绍了如何快速做到这一点。