ARM内核目标系统中的代码运行时间测试方法

很多测量时间的c函数在arm中都不能使用。某些能使用的,也是基于系统实时时钟(rtc),故最短时间单位只能达到10-2 s。作为一种通用的精密计时方法,为了取得更精细的时间度量,可以考虑启用arm芯片内置的watchdog实现扩展了的实时时钟功能,并推广到程序精确延时的用途,弥补现有c函数的不足。本文对此作出分析,并给出了具体的实验描述。
关键词 精确时间 测量精密计时 arm实时时钟扩展 看门狗
在arm系统中,有时需要精确的时间测量。通常,取时间的c函数(如gettime()等)不仅通用性差(必须包含头文件dos.h,且不支持unix、linux和标准c),明显不适用于arm系统[1];更成问题的是,其最短时间只能到10-2 秒级,不能提供更短的时间分度。根本原因在于: 这类函数是基于系统实时时钟(rtc)的,而rtc通常采用标准化钟表晶振,频率只有32.768 khz而已[2]。
然而很多应用涉及μs级的时间计量,这是标准化了的rtc以及基于它的时间函数所无能为力的。笔者在移植des算法到arm系统的实验过程中,便遇到过要定量评估加密算法耗时多少的问题,发现的确不能用上述常规的c函数解决。经对arm芯片结构的考察,发现其内置的watchdog系统是以系统时钟驱动的,定量性能应该很好,区分时间间隔的精细程度也应该足够。于是根据所用arm芯片的原厂家数据手册中的说明,借用 watchdog编写了自己的计时函数,使用起来也比较方便。考虑到arm芯片都带有内置看门狗,笔者觉得这种方法可算是一个不错的“过渡性”解决方案,故在此加以介绍,供同行们参考并指正。
1 测量原理
arm芯片中的看门狗,其原始功能是监视cpu核心运行的某些超时。这些超时的发生,通常是因为干扰和系统错误等造成的程序运行混乱。一旦发生这类情形,看门狗便请求中断服务或发出复位脉冲重启系统。为了达到这样的目的,其计时原理必须独立于系统中的任何进程。实际上,watchdog是独立的硬件逻辑,其计时脉冲直接取自系统主时钟,因此它与rtc一样具备实时性和独立性,借用看门狗的计时体系来实现高精度时间测量是合理的。
先以实验中用到的s3c44b0x为例(该实验所用的arm开发板型号为netarm300),具体谈谈看门狗的工作原理。其原理框图如图1所示,图中mclk即系统主时钟[3]。
图1 s3c44b0x内嵌看门狗硬件原理框图
从图中可以看出,系统主时钟mclk经过可编程预分频、可选固定分频后,进入wtcnt(硬件系统的计时计数器,16位)计数。根据器件手册,计数时间间隔t_watchdog=1/(mclk/(prescaler value+1)/division_factor )。式中,参数prescaler value的取值为0~28-1;division_factor有16、32、64、128四种取值。如果复位信号输出允许(即wtcon的位0置1),那么一旦计数器wtcnt的计数超过wtdat允许的范围,看门狗就会将cpu复位。本实验过程中屏蔽掉了这种复位和中断请求功能,仅让它对脉冲计数。
控制寄存器wtcon的有关各位定义图中已给出(如需详细解释可查阅器件手册,如参考文献[3]),其他全为保留位,可全置为0。
至于mclk具体值的计算,可以查验系统中的晶振参数(频率),读取系统时钟的pll寄存器(如s3c44b0x的pllcon)后算得。计算的方法都已在具体arm芯片手册中给出[4]。
2 测量算法实现和实验结果
按照所需参数设置的看门狗定时器控制寄存器wtcon的值(如前所述),在待测代码段执行之前开启看门狗定时器;等其执行完毕则关闭看门狗定时器,读取wtcnt的值即可算得运行时间。作为一个具体示例,笔者实验中所实现的算法如下:
(1) 计时算法
void my_countstart() {
rwtcon=((mclk/1000000-1)<<8)|(2<<3); //1 mhz/64,watchdog,nreset,中断禁止
rwtdat=0xffff;
rwtcnt=0xffff;
rwtcon=((mclk/1000000-1)<<8)|(2<<3)|(1<<5); //计时开始
}
int my_countstop() {
int i=0;
rwtcon=((mclk/1000000-1)<<8)|(2<<3); //计时结束
i=0xffff-rwtcnt;//每16 μs计数一次
return i*16;
}
(2) 应用
int main() {
my_countstart();
des_go(buf, buf, sizeof(str), key, sizeof(key), encrypt, is3des);
encrypt_time=my_countstop();
}
需要指出: 在改变wtcon的值之前应将原有值保存,待测量完成后再复原wtcon。之所以强调这一点,是因为系统别处很可能在使用看门狗功能。
实验当中,对长度为189字节的字符串采用3次des加密。密钥长度为15位,测得的加密时间为28 832 μs,解密时间为28 896 μs。缩短字符串长度,测得的加密时间基本呈线性变化: 字符串长度为107字节而其他地方不变时,加密耗时16 928 μs,解密耗时16 948 μs;字符串长度为41字节而其他地方不变时,加密耗时7 424 μs,解密耗时7 424 μs。对于相同长度的字符串,密钥长度的改变对加密/解密时间的影响不是很大。
值得一提的是,刚开始实验时,被加密字符串分别取为190字节和75字节,测得耗时分别是34 032 μs和16 928 μs,显然与倍增的关系相差很远。分析程序后发现,原来问题出在加密算法中间的打印语句“uart_printf(\ncounting begin...!!!)”上。原来以为它耗时很少,故没有将它从加密算法中移走;移走后再试,耗时大减,分别为29 600 μs和12 496 μs,与字符数倍增、时间倍增的预期基本相符。上面的实验,还使笔者得知该打印语句占用了4 432 μs。稍微修改条件,继续实验: 当上述打印语句的字节数扩充为原来的4倍时,测得该语句耗时17 728 μs。可见,耗时与打印内容的字节数基本上成正比;另外,这种打印语句与加密/解密算法本身相比,并不是想当然地只占用一点点时间。(上述数据与pc机串口通信波特率的设置无明显关系。实际测试结果为: 波特率由115 200 bps下降到57 600 bps,没有可以察觉到的差别。)
3 测量方法讨论
arm内置看门狗用作时间度量的适用范围,大体以μs数量级为界。比如,从s3c44b0x的器件特性说明中可知,mclk在看门狗计时器里的分频比至少是1/16。典型情况下,mclk=60 mhz,则看门狗能够分辨的最短时间单元t=1/(60 mhz/16)=0.27 μs。统计误差约为t/2,即0.1μs数量级。就μs级的时间测量精度而言,相对误差有可能达到1%~10%;不过,这对很多速度估算的场合来说还是可以接受的。如果被测时间在10 μs以上,那就没有任何问题,可以认为是相当精确的了。
这种思路还可用来实现精确延时,因为它的定时不依赖于指令执行时间(指令执行要受到系统调度等的影响,因而有很多不确定因素),而取决于对主时钟的硬件分频计数。
由此实验推广,arm内置看门狗可以作为此类系统中的第二时钟存在。对于那些时间要求精确到μs、rtc的精度无法满足的应用,这种处理都不失为一种准确、高效的方法。

固态继电器输入电路案例
亮亮视野COO娄身强出席科大讯飞全球1024开发者节并发表主题演讲
由max8720组成的降压式dc/dc电路
美国哥伦比亚大学开发出新型的低功耗光束转向技术
三星对于智能手机的拍照也低下了头
ARM内核目标系统中的代码运行时间测试方法
直流电机控制电路的工作原理
浅谈时分复用音频接口:TDM 和音频转换器TDM接口
FCC认证 | KDB484596 D01数据引用规则新要求发布
OpenHarmony创建和运行HelloWorld
什么是Bluetooth(蓝牙)
LT7911是Type-C/DP1.4a到MIPI或LVDS
在汽车设计中采用传感器实现最高效率的解决方案
索雷重防腐涂层是什么,适用于哪些行业
电路分享:用微处理器如何设计洗碗机电路
从 0 到 1 搭建机器人 | 使用 NVIDIA Isaac Sim Replicator 和 TAO 套件进行数据合成和训练
利亚德计划推出针对不同行业需求的VR/AR实训解决方案
分享嵌入式软件调试方法和几个工具
PLC中开关量、模拟量、脉冲量三者关系
2015 CES猎奇:与人体完美结合的5款蓝牙设备