此文为翻译,原文在这里
DS-5 5.20中添加了一个新功能,从FVP(Fixed Virtual Platform)中获取指令Trace,这可以让你获取在模型上运行程序的Trace。DS-5中包含ARMv8(旗舰版) FVP,如果你想试试,可以下载DS-5旗舰版的30试用版。
Trace有什么用?
Trace是用来收集软件在处理器上执行的所有信息。在实际硬件上,Trace是对系统没有影响的,这意味着它不会让CPU变慢。原始的Trace数据是高度压缩的,必须解码后才能理解。我们可以用DS-5翻译Trace得到的机器码,帮我们了解一个函数在系统运行时占用的时间百分比。ARM Debug/Trace架构叫CoreSight,但CoreSight并没有在Fast Model和FVP中实现。
从系统建模到现场失败分析,Trace在芯片设计的各个阶段都会被使用,特别在裸机调试和Linux内核调试中非常有用。
ARM的Fast Model和FVP是指令精确的,添加指令Trace是对DS-5目前调试功能的自然扩展,这让在模型上编写/调试软件和真实硬件上更相似。Fast Model和FVP并不是时钟精确的模型,所以在模型上执行某个函数所需要的时间和在芯片上执行的耗时并不一样,但是趋势一致。DS-5旗舰版自带的FVP的调试配置文件已经在DS-5中集成,所以使用起来很容易。目前DS-5中只包含这三个模型的指令Trace。如果你想用DS-5收集你的自己模型的Trace,请联系ARM。
使用模型Trace
在DS-5的调试配置面板你可以发现模型Trace只适用于裸机和Linux内核调试连接,Trace并不适合用来调试Linux应用程序,因为操作系统会引入大量和应用无关的Trace数据。
试用模型Trace的最佳方法就是导入一个样例,DS-5自带的裸机样例中包含很多应用,从简单的Hello World到复杂的RTOS应用都有。在下面的例子中,我导入了路灯应用,该应该运行在Keil的RTX RTOS上。
DS-5中所有的基于FVP的裸机应用例子都已经被重新配置,可以用来搜集模型Trace,但你也可以参考样例让你自己的应用产生Trace。一旦Trace配置好,它和真实硬件Trace的行为一样,二者在DS-5中的Trace视图也是一样的。
我们的Trace信息被收集到一个环形缓冲中,这在ARM的Soc设计中经常使用ETB来记录软件执行,所有CPU上执行的指令先存入缓冲,再刷新到DStream,如此循环,或者只写满一次就停止。
当你启动调试的时候,Trace会自动开始,除非你手工设定了Trace的起止点。Trace起始点对追踪某段代码非常有用,它可以大大减少Trace数据量,只记录起始点之间的指令。在下面的截图中,你可以看到RTX交通灯应用从开始到结束所有的Trace数据。
需要注意的是DS-5再次启动收集Trace数据的时候,不会自动覆写以前产生的Trace数据。如果你设定了Trace的起始点,需要在启动前清空Trace数据,那么启动后产生的数据便是这次运行产生的Trace数据。在这个例子中,我将交通灯定时器的起始和结束设为Trace的起始点。
模型Trace是如何工作的?
模型上Trace功能的实现并不是通过实现Coresight模型来实现的,而是通过模型直接收集处理器上执行的指令和异常得到Trace,然后通过DS-5转换,显示到Trace视图,这和通过Coresight搜集显示的数据效果一样。模型Trace和真实的Trace不一样,它会拖慢模型执行的速度,而在芯片上的Trace不会。