Zedboard(五)嵌入式应用程序开发——时间性能分析

Zedboard开发之时间性能分析

本篇主要介绍如何利用Xilinx SDK自带的分析工具,对裸机开发中的应用程序进行时耗的性能分析。主要用到的工具有2个,TCF profiling和Gprof。内容大多是对官方网站SDK操作手册的梳理与实践的过程,内容如下:


目录

  • Zedboard开发之时间性能分析
    • TCF profiling
    • Gprof
    • 结语


TCF profiling

这个工具主要是通过Jtag调试接口对程序计数器进行采样,分析每个函数执行的时间占整个应用程序的比重,可以据此做一些简单的瓶颈分析。如果未启用堆栈跟踪时则是非侵入式的(理论上不影响原程序)。 启用堆栈跟踪时,由于调试器必须收集堆栈跟踪信息,程序执行速度会降低,对程序影响较大。

该工具的使用比较简单:
1. 进入程序的Debug模式。选择需要分析的应用程序,右键 Run > Debug As > Launch on Hardware (System Debugger).
2. 调出TCF profiling窗口。进入Debug模式后,程序会停留在main()函数的入口。选择SDK菜单栏 Window > Show View > Other > Debug > TCF Profiler.(如下图)调出TCF窗口
Zedboard(五)嵌入式应用程序开发——时间性能分析_第1张图片Zedboard(五)嵌入式应用程序开发——时间性能分析_第2张图片Zedboard(五)嵌入式应用程序开发——时间性能分析_第3张图片
3. 启动TCF分析工具。点击TCF窗口右上角的 这里写图片描述按钮启动。
Zedboard(五)嵌入式应用程序开发——时间性能分析_第4张图片
出现上面的对话窗口,默认即可点OK
Aggregate Per Function勾选则同一个函数不用地址采样的结果会分成一组,否则采样结果按照每个地址显示。
Enable stack tracing勾选则可以追溯每个采样结果的堆栈轨迹,单击每个采样地址就可以显示其堆栈轨迹。
View update interval 是分析窗口的更新时间间隔(单位ms),注意并不是采样的时间间隔!
4. 开始程序运行。按F8或者点击Resume按钮,程序会执行到断点处(没有断点这执行到结束)TCF会分析这段执行过程每个函数的时间占用情况。
5. 下图是笔者某个应用程序的运行结果。
Zedboard(五)嵌入式应用程序开发——时间性能分析_第5张图片
Exclusive time是该函数本身基本操作(不包括子函数调用)的时间占比。
Inclusive time是该函数调用所用的时间(包括子函数调用)的时间占比。

点击每一行,可以查看调用本函数的母函数和被本函数调用的子函数。分析结果似乎不能保存(没有仔细研究,如果有误请纠正)随着Debug模式的退出,结果也会消失。


Gprof

Gprof是“软件侵入”式的,程序被周期性地中断以获得其程序计数器位置的样本,从而分析每个函数的运行时间特性。编译器注释每个函数调用,以将调用者和被调用者信息存储在数据结构中,从而得到函数之间的调用关系。

TCF不同的是,Gprof的分析项目有4个:采样数(Samples)、调用次数(Calls)、执行时间÷调用次数(Time/call)、时间占比(%Time),我们可以得知程序的执行时间(尽管这个时间是在有采样的干涉下得到的,但仍然可以作为瓶颈分析的依据)。而且Gprof是在Run模式下进行的,程序会从头到尾执行一遍而不停在某个断点处。程序执行结束后,结果会自动保存。

Gprof的使用也不难,主要是前期的一些参数设置比较麻烦:

  1. 设置板级驱动包BSP的参数。选择应用程序对应的驱动包,右击Board Support Package Settings
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第6张图片
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第7张图片
    转到drivers->ps7_cortexa9_0右侧extra_compiler_flagsValue,在末尾加“-pg”点击OK
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第8张图片
  2. 设置应用程序的编译器参数。选择待分析的应用程序,右键C/C++ Build Settings(请在更新好BSP之后再执行此操作)
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第9张图片
    选择C/C++ Build->Settings,右侧栏ARM v7 gcc compiler->Symbols,点击右侧这里写图片描述 图标
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第10张图片
    在新打开窗口中输入SW_PROFILE(区分大小写)点击OK
    这里写图片描述
    右侧栏ARM v7 gcc compiler->Profiling,勾选右侧的Enable Profiling(-pg)选项。
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第11张图片
  3. 设置应用程序的Run参数。选择应用程序目录下的Binaries->工程名.elf右键Run AS->Run Configurations
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第12张图片
    Xilinx C/C++ application下选择 工程名.Debug(如果没有就双击来创建一个),在Profile Options选项卡下做下图的设置。(收集采样数据的地址可能得根据自己的实际情况设置合适的地址)
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第13张图片

提醒一下:在进入Run Configurations之前应该连接好板子和PC,确认STDIO Connection选项卡的端口信息正确。

  1. 执行运行程序并查看分析结果。设置完毕后点击Run,等待程序完整执行一遍,会提示Gprof结果已保存。在工程的Debug下面有gmon.out文件。双击该文件就可以打开Gprof分析结果。(这个过程可能会卡,笔者等了一小会才出来结果)
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第14张图片
    如下图所示,gprof给出了每个函数的4项性能参数。
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第15张图片
  2. Gprof的一些分析工具。
    第一,函数调用关系。点击窗口右上的这里写图片描述 按钮,就可以得到每个函数的母函数和子函数(单击每个函数来查看)
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第16张图片
    第二,Gprof还提供了画图功能,选中某几个函数,点击右侧最末 这里写图片描述按钮,可以画出直方图或者饼状图。
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第17张图片
    Zedboard(五)嵌入式应用程序开发——时间性能分析_第18张图片

结语

至此,本文的介绍就接近尾声了。小结一下,TCFGprof主要是针对时间维度的性能分析,通过这个工具我们可以知道哪些函数占用了较多是执行时间,从而展开优化。调用次数是一个模块为可并化的一种衡量标准,对于调用次数较多的模块,如果其耦合程度低,或许后期可以用硬件加速加以优化。
对于处理器缓存以及读写操作的相关性能,SDK也提供了相应的分析工具,留在下一篇单独介绍。


你可能感兴趣的:(Zedboard(五)嵌入式应用程序开发——时间性能分析)