DV仿真环境下问题定位和性能分析工具:基于PC指针,结合map文件分析函数调用轨迹以及耗时
关键词:DV仿真,Python,map,PC等。
当DV使用复杂软件对硬件进行仿真时,由于没有类似Trace32等IDE调试环境,出现问题往往较难定位问题。同时如果想优化性能,较难直到不同流程耗时。
DV仿真可以记录每一次PC变动值,但是软件稍复杂会导致数据量非常庞大。
这里结合map就可以知道每一次执行所处函数,结合disassemble dump就可以直到每一次执行的指令。
1 PC指针指示了什么
ARM处理器3级流水线:取指->译码->执行,如下图:
PC始终指向正在取指的地址,由于流水线的存在,导致PC的值比当前正在执行的值要大两条指令的地址,而在ARM状态下,由于是四字节的指令因此PC保存着当前执行的指令地址值加 8 个字节,而在Thumb状态下,是两字节的指令因此加4字节即可。
2 工具设计思路
pc_2_sym.py首先从map文件中解析出每个符号的名称/起始地址/大小/文件名,然后开始遍历PC轨迹文件:逐个根据PC-8查找对应的符号,写入csv文件中;将PC-8写入到ExecuteTraceAddress中。
3 Python实现
执行命令:
python pc_2_sym.py -m xxx.map -p pc.txt -o pc.csv
代码如下:
4 使用
生成的csv文件使用Excel打开,对于查看函数调用轨迹可读性要好很多。
1. 可以对Symbol使用Filter进行过滤,查看关键函数轨迹。(函数级别)
2. 如果想查看函数内部调用细节,对照转换后的ExecuteTraceAddress和disassemble dump文件查看指令执行细节。(指令级别)
3. 可以对函数Duration进行排序,重点分析耗时较大的函数。或者明显异常的函数。或者一些udelay/mdelay延时函数。
缺点:
1. 无法记录函数入口和出口,所以csv中一次函数调用可能出现几次。对于分析函数耗时不准确,但结合代码可以分析出大概。
总体使用来看,比分析DV波形,查看关键节点寄存器或者特殊流程标记要高效全面得多。