1、ARM 内核目标系统中的代码运行时间测试日期:2008-1-21 来源:单片机及嵌入式系统应用 作者:北京机械工业学院 陈思勤 吴秋新 字体:大 中 小 摘要 很多测量时间的 C 函数在 ARM 中都不能使用。某些能使用的,也是基于系统实时时钟(RTC) ,故最短时间单位只能达到 10-2s。作为一种通用的精密计时方法,为了取得更精细的时间度量,可以考虑启用 ARM 芯片内置的 WatchDog 实现扩展了的实时时钟功能,并推广到程序精确延时的用途,弥补现有 C 函数的不足。本文对此作出分析,并给出了具体的实验描述。关键词 精确时间测量精密计时 ARM 实时时钟扩展 看门狗 在 ARM 系统中
2、有时需要精确的时间测量。通常,取时间的 C 函数(如 gettime()等)不仅通用性差(必须包含头文件 DOSH ,且不支持 Unix、Linux 和标准 C),明显不适用于ARM 系统;更成问题的是,其最短时间只能到 10-2 秒级,不能提供更短的时间分度。根本原因在于:这类函数是基于系统实时时钟(RTC)的,而 RTC 通常采用标准化钟表晶振,频率只有 32768 kHz 而已。然而很多应用涉及 s 级的时间计量,这是标准化了的 RTC 以及基于它的时间函数所无能为力的。笔者在移植 DES 算法到 ARM 系统的实验过程中,便遇到过要定量评估加密算法耗时多少的问题,发现的确不能用上述常规
3、的 C 函数解决。经对 ARM 芯片结构的考察,发现其内置的 WatchDog 系统是以系统时钟驱动的,定量性能应该很好,区分时间间隔的精细程度也应该足够。于是根据所用 ARM 芯片的原厂家数据手册中的说明,借用 WatchDog 编写了自己的计时函数,使用起来也比较方便。考虑到 ARM 芯片都带有内置看门狗,笔者觉得这种方法可算是一个不错的“过渡性” 解决方案,故在此加以介绍,供同行们参考并指正。1 测量原理ARM 芯片中的看门狗,其原始功能是监视 CPU 核心运行的某些超时。这些超时的发生,通常是因为干扰和系统错误等造成的程序运行混乱。一旦发生这类情形,看门狗便请求中断服务或发出复位脉冲重
4、启系统。为了达到这样的目的,其计时原理必须独立于系统中的任何进程。实际上,WatchDog 是独立的硬件逻辑,其计时脉冲直接取自系统主时钟,因此它与 RTC 一样具备实时性和独立性,借用看门狗的计时体系来实现高精度时间测量是合理的。先以实验中用到的 S3C4480X 为例(该实验所用的 ARM 开发板型号为 NETARM300),具体谈谈看门狗的工作原理。其原理框图如图 1 所示,图中 MCLK 即系统主时钟。从图中可以看出,系统主时钟 MCLK 经过可编程预分频、可选固定分频后,进入 WTCNT(硬件系统的计时计数器,16 位) 计数。根据器件手册,计数时间间隔 t_watchdog=l(M
5、CLK(Prescaler value+1)Division_factor)。式中,参数 Prescakr value 的取值为 O28-l; Division_factor 有 16、32、64、128 四种取值。如果复位信号输出允许(即 WTCON 的位 0 置 1),那么一旦计数器 WTCNT 的计数超过 WTDAT 允许的范围,看门狗就会将 CPU 复位。本实验过程中屏蔽掉了这种复位和中断请求功能,仅让它对脉冲计数。控制寄存器 WTCON 的有关各位定义图中已给出 (如需详细解释可查阅器件手册,如参考文献3) ,其他全为保留位,可全置为 O。至于 MCLK 具体值的计算,可以查验系统中
6、的晶振参数(频率) ,读取系统时钟的 PLL寄存器(如 S3C44BOX 的 PLLCON)后算得。计算的方法都已在具体 ARM 芯片手册中给出。2 测量算法实现和实验结果按照所需参数设置的看门狗定时器控制寄存器 WT-CON 的值(如前所述) ,在待测代码段执行之前开启看门狗定时器;等其执行完毕则关闭看门狗定时器,读取 WTCNT 的值即可算得运行时间。作为一个具体示例,笔者实验中所实现的算法如下:(1)计时算法(2)应用需要指出:在改变 WTCON 的值之前应将原有值保存,待测量完成后再复原 WTCON。之所以强调这一点,是因为系统别处很可能在使用看门狗功能。实验当中,对长度为 189 字
7、节的字符串采用 3 次 DES 加密。密钥长度为 15 位,测得的加密时间为 28832s,解密时间为 28 896s。缩短字符串长度,测得的加密时间基本呈线性变化:字符串长度为 107 字节而其他地方不变时,加密耗时 16 928s,解密耗时16 948s;字符串长度为 41 字节而其他地方不变时,加密耗时 7 424s,解密耗时 7 424s。对于相同长度的字符串,密钥长度的改变对加密解密时间的影响不是很大。值得一提的是,刚开始实验时,被加密字符串分别取为 190 字节和 75 字节,测得耗时分别是 34 032s 和 16 928s,显然与倍增的关系相差很远。分析程序后发现,原来问题出在
8、加密算法中间的打印语句“Uan_Printf(“ ncounting begin.!”)”上。原来以为它耗时很少,故没有将它从加密算法中移走;移走后再试,耗时大减,分别为 29 600 s 和 12 496s,与字符数倍增、时间倍增的预期基本相符。上面的实验,还使笔者得知该打印语句占用了 4432s。稍微修改条件,继续实验:当上述打印语句的字节数扩充为原来的 4倍时,测得该语句耗时 17728s。可见,耗时与打印内容的字节数基本上成正比;另外,这种打印语句与加密解密算法本身相比,并不是想当然地只占用一点点时间。(上述数据与 PC 机串口通信波特率的设置无明显关系。实际测试结果为:波特率由 11
9、5 200bps 下降到 57 600 bps,没有可以察觉到的差别。)3 测量方法讨论ARM 内置看门狗用作时间度量的适用范围,大体以 s 数量级为界。比如,从 S3C44BOX 的器件特性说明中可知,MCLK 在看门狗计时器里的分频比至少是 116。典型情况下,MCLK=60MHz,则看门狗能够分辨的最短时间单元 t=l/(60 MHz16)=027s。统计误差约为 t2,即 O1s 数量级。就 s 级的时间测量精度而言,相对误差有可能达到 110;不过,这对很多速度估算的场合来说还是可以接受的。如果被测时间在 10s 以上,那就没有任何问题,可以认为是相当精确的了。这种思路还可用来实现精确延时,因为它的定时不依赖于指令执行时间( 指令执行要受到系统调度等的影响,因而有很多不确定因素),而取决于对主时钟的硬件分频计数。由此实验推广,ARM 内置看门狗可以作为此类系统中的第二时钟存在。对于那些时间要求精确到 s、RTC 的精度无法满足的应用,这种处理都不失为一种准确、高效的方法。