使用在线仿真器(ICE)进行程序优化
与仿真器调试相比,串口调试的功能比较简单,人机交互功能也不够友好。遇到复杂的程序错误时,开发效率可能会大大降低。一个功能强大的ICE,往往能够提供丰富的调试手段,使调试工作事半功倍。ICE为嵌入式调试工作所带来的方便和高效,只有使用者才能够深刻地体会。
现在市面上的ICE种类很多,功能也有很大的不同。很多仿真器只能提供基本的调试功能,如设置断点、系统资源的观测等。有些高级功能,如嵌入式跟踪宏单元(Embedded Trace Macrocell,ETM)跟踪功能,只有一些高端仿真器才会提供,当然价格也比一般仿真器要高出不少。本文主要介绍使用ICE在程序优化方面的一些应用,其中要用到一些高级功能。
功能1:任意两条语句间的运行时间的测量
当编好一段代码,想计算这段代码的运行时间,为代码优化提供依据,该如何准确测量这段时间?
没有仿真器的话,有以下两种方法可以采用:
1. 手动计时,从执行到这段代码时开始看手表计时,到这段代码运行结束时停止计时。这种方式误差很大,对于执行时间只有几个微秒甚至更短时间的代码段,这种方式显然不能满足要求。
2. 在代码中加入计时函数。这种方式具有一定准确度,但是会增加代码的复杂度,计时结果需要打印输出。
如果使用ICE仿真器,这个工作就变得很简单了。以横河公司的advicePRO为例,在其所使用的自带的调试软件microVIEW-PLUS(以下简称MVP)中,既不需要看手表也不需要修改代码,只要在代码两端设置断点就可以轻松获得这段代码的运行时间,而且精确度可达20ns的范围。如图1所示,在执行到第一个断点b1时,将窗口状态栏中的时间清零,再执行代码,程序停在第二个断点b2时,这段代码的执行时间就会精确地显示在状态栏中。
图1:设置断点,以进行两条语句间的运行时间的测量。
功能2:两条语句间的运行时间的多次测量和分析
对于同一段代码,由于运行条件不同,运行时间也不尽相同,可能会有较大的变化。如何对某段代码的运行时间进行统计,真正达到性能分析的目的呢?
在使用仿真器时,可以重复"优化功能1"中的测量功能,进行手动统计。但这样做的缺点是费时费力,也不能真正反映程序实时运行时的状态。
带ETM跟踪功能的ICE仿真器可以提供一种简便的测量功能,可以连续对程序进行指定次数的时间测量,并自动进行时间统计。但不是所有带ETM跟踪功能的仿真器都有这样的功能,下面仍以横河公司的advicePRO为例介绍该功能的使用。具体测量步骤如下:
1.在程序段设置的起始和结束事件点:事件(Event)是指程序执行过程中的能够被检测到的各种活动。例如,某个函数或者某个地址上语句的执行,某个地址上数据的读写,甚至监测到的外部触发信号都可以被定义成事件,作为跟踪功能和时间测量的起始或者终止条件。图2是通过设置窗口将某个源代码文件的第184行的取指(Fetch)状态作为事件e0。假设要测量LCD_test.c文件中for循环中的184行至191行的运行时间,根据图2中的方法在184行和191行设置两个事件e0和e1。(见图3)
图2:在设置窗口中设置源代码文件的起始点。
图3:在程序文件中设置了起始点和结束点后的MVP窗口。
2.设定外部输出条件:将e0、e1设为外部输出条件,如图4所示。
图4:设置外部输出条件。
3.设定测量条件:在图5所示的窗口中,将e0、e1设定为时间测量的起点和终点,并进行测量模式的设定。可以进行超过指定时间和在指定时间之内的测量统计。
图5:设定时间测量的起点和终点,并进行测量模式的设定。
4.运行程序:做好以上设定之后,可以运行程序,进行时间测量。
5.测量结果显示:测量结束后,测量结果会以图表形式自动显示在报告窗口中,并且显示最长、最短、平均运行时间。(见图6)通过这个图表,用户可以清晰地了解这段代码的运行时间分布情况,为代码优化提供最直接的依据。
图6:通过以图表形式显示的测量结果,可以清晰地了解代码的运行时间分布。
功能3:测量代码覆盖率
代码覆盖率(Coverage Ratio)是指在一段代码中被执行到的语句占这段代码的比例。它是衡量代码质量的一个重要的指标,在代码测试工
ICE 相关文章:
- 利用Pspice通用测试电路实现关键参数的模拟(上)(01-30)
- 利用Pspice通用测试电路实现关键参数的模拟(下)(01-30)
- 时序关联/质理检验方针(02-14)
- 利用Pspice通用测试电路实现关键参数的模拟(下)(06-04)
- 利用Pspice通用测试电路实现关键参数的模拟(上)(06-04)
- 基于Web Services的嵌入式农业物联网测控系统(10-22)