
嵌入式开发:测量代码运行时间的第三种方法
工程开发中,有时,为了优化程序,需要先确认哪部分代码耗费时间。所以,如何测量代码执行时间呢?在之前的文章中提到过两种方式:利用示波器测量I/O电平变化计算代码执行时间、利用系统定时器STM(System Timer)测量代码执行时间。可以参考前文《Debug手段:使用I/O测量代码执行时间》,除了上述两种方式,还有其他方法吗?或者说还有没有更简单一些的方法?答:有,本文介绍第三种方式—利用Lauterbach的Snooper功能,测量代码执行时间。
1、使用Lauterbach的Snooper功能测量代码执行时间
讨论Lauterbach Snooper测量代码运行时间之前,先用STM做一个对比。
(一)STM测量代码执行时间
本文使用wait()接口等待1ms表示要测量的Code,如下所示:
分析:
如上代码,STM的频率为100MHz(100.0e+6Hz),套入公式:t = 1 / Frq = 1/100*1000000 = 0.00000001s = 0.00001ms = 0.01us = 10ns,即:1 Tick = 10ns。
ElapseTick = 100043*10 = 1000430ns = 1.00043ms
实际要测试的Code运行时间1ms。所以,STM测量代码运行时间比较精确。
(二)使用Lauterbach的Snooper功能测量代码执行时间
关于Lauterbach的Snooper功能,更多使用详情可以参考前文《TRACE32调试:基础调试技巧之SystemMode、SNOOPer》。测试代码如下所示:
uint32 CodeExc_StartTime = 0x00;
uint32 CodeExc_EndTime = 0x00;
static void timeout1(void parameter)
{
CodeExc_StartTime++;
/ Wait for 1ms */
wait(100000);
CodeExc_EndTime++;
}
解释:
使用Lauterbach的Snooper功能测量代码的执行时间,相对比较简单,仅仅需要在测试代码的前后各增加一个变量(比如:本文的CodeExc_StartTime和CodeExc_EndTime),在Snooper中看一下这两个变量的时间间隔即可得到目标代码的执行时间。
1、Snooper配置
在Snooper中,设置Mode为"Changes",即:数据改变时采样。采样率(Rate)选择1us(最高采样精度)。
2、运行程序,获取代码执行时间
如下图,单击"List"获取CodeExc_StartTime和CodeExc_EndTime时间差值,如下所示:
如上图,可以看出,两者的时间差在980~1050us之间。虽然和设定的时间1ms存在一定误差,但是,对于问题分析已经足够。
测量注意事项:
1、启动阶段测试误差较大,采用测量参数累加的方式测量代码执行时间,分析之后的代码更准确,示意如下
2、相对于示波器和STM测量,此方式测量存在一定误差(约几十微妙)。假设CPU的主频在300MHz,意味着一行代码的执行时间在纳秒(ns)级别,而Snooper方式的最大精度是微妙(us)。所以,如果测量的代码执行时间是us级别或者ns级别,此方式不适合。
2、三种代码执行时间测量方式对比
示波器、STM、Snooper测量代码执行时间的特点,如下所示:
如上三种测量方式,各有各的特点,可结合项目实际选用对应的方案。如果测量代码或者Task运行时间在ms级别,使用Snooper方式更简单、快捷。如果测量代码在us或者ns级别,使用示波器或者STM方式更合适。
文章转载自公众号:开心果 Need Car
