没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
ARM内核目标系统中的代码运行时间测试方法内核目标系统中的代码运行时间测试方法
很多测量时间的C函数在ARM中都不能使用。某些能使用的,也是基于系统实时时钟(RTC),故最短时间单
位只能达到10-2 s。作为一种通用的精密计时方法,为了取得更精细的时间度量,可以考虑启用ARM芯片内置的
WatchDog实现扩展了的实时时钟功能,并推广到程序精确延时的用途,弥补现有C函数的不足。本文对此作出
分析,并给出了具体的实验描述。
在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() {
资源评论
weixin_38607552
- 粉丝: 7
- 资源: 944
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功