ETM驱动跟踪时怎么回事?
发布网友
发布时间:2022-05-16 01:25
我来回答
共1个回答
热心网友
时间:2023-10-08 16:42
粗略的讲,ETM的作用就是记录处理器做的事情并送到外面的调试器。
嵌入式跟踪宏单元
由于微控制器带有大量的片内存储器,因此不能简单地通过观察外部管脚来确定处理器核是如何运行的。ETM对深嵌入处理器内核提供了实时跟踪能力。它向一个跟踪端口输出处理器执行的信息。软件调试器允许使用JTAG接口对ETM进行配置并以用户易于理解的格式显示捕获到的跟踪信息。ETM直接连接到ARM内核而不是主AMBA 系统总线。
ETM管脚:
TRACECLK
PIPESTAT[2:0]
TRACESYNC
TRACEPKT[3:0]
EXTIN[0]
面对不断增长的处理器频率,先来看一下跟踪技术的一些最新发展。首先看一下在基于ARM内核的SoC设计里面的片内跟踪模块,也就是常说的ARM嵌入式跟踪宏单元(ARM ETM)。ETM定义了一个物理跟踪端口用来传输程序执行流程的信息,下面是对ETM端口的各个组成信号的简要描述。
TRACECLK: 该信号用来同步收集跟踪信息的硬件(也就是在线调试器)和ETM。所有的IPESTAT和TRACEPKT信号都在TRACECLK信号的边沿上被采样。在不同的ETM运行模式下,该信号可以是ARM内核工作频率的两倍、一半、或者同频。
PIPESTAT(0-2):这三个流水线状态信号表明对应每个TRACECLK时钟周期,处理器指令流水线内部事件的详细信息如指令已经执行、发生跳转等。
TRACEPKT: 程序执行流程通过TRACEPKT信号(依ETM模式不同,可以是4、8,或者 16 针)传递出处理器。对每个非直接跳转,压缩后的跳转目的地址被包含在跟踪报文中。“非直接跳转”是个很宽泛的说法,一般是指跳转的目的地址只能在程序运行的时候才能确定的情况,如通过寄存器加载PC寄存器,预测会发生的跳转指令和异常等。这些程序执行流程信息,和源代码一起,就能够让开发工具重建完整的程序执行流程。源代码既可以通过调试器加载,也可以通过处理器的JTAG接口从内存中读取。
不仅限于程序执行流程,ETM用户还可以有选择地在跟踪端口的输出中包括数据读写信息。在跟踪端口的输出中,可以只有地址信息(以压缩方式)或数据内容,也可以同时包括地址信息(以压缩方式)和数据读写的内容。使能对数据读写信息的跟踪后,这些信息将被cha(敏感词)ru到程序执行流程信息流中的恰当位置上。
TRACEPKT可以是4位、8位、或者16位的格式。跟踪端口越窄,通过跟踪端口传递跟踪信息就需要越多的TRACECLK时钟周期。一般4位的TRACEPKT用来重建完整的程序执行流程已经是足够了。但是,包含数据跟踪信息后可以很快的使这个窄位宽跟踪端口超过负荷。尤其是使能了数据跟踪功能后,连续出现32比特的数据访问就很容易出现这种情况。例如,对一组寄存器执行压栈和出栈操作的时候,为了避免在跟踪端口上出现这种过负荷的情况,可以在ETM和外部的开发工具之间增加一个FIFO缓存。当频繁发生跳转和数据读写指令的时候,这个中间缓存就显得尤为重要了。
跟踪端口的位宽和FIFO的大小都可以有很多种选择,如何正确组合这两个因素非常关键,这将有助于防止跟踪信息的丢失。对于ARM ETM,Lauterbach推荐的最低配置是8位的端口位宽和45字节的FIFO缓存大小。这个组合在绝大多数情况下可以防止跟踪信息的丢失。
上面提到的ETM跟踪方法的优点是记录信息的媒介在CPU内核以外,这就使得CPU外部的开发工具可以包含无限大小的跟踪缓存。如果在线调试器中可以提供512MB的跟踪缓存,对打开Cache并运行在100MHz的ARM926EJ-S理器来说,可以存储1.4秒的信息,大多数嵌入式开发者都认为这个已经足够满足需求了。