打印

arm 怎么计算 1ms循环次数 ?

[复制链接]
2501|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quarticarm|  楼主 | 2011-8-22 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先你要知道一个指令周期是几秒 算法是1/(晶振频率除以12)

然后你要知道循环究竟执行了几个指令周期 你可以用keil里在线反汇编命令看看你的循环编译成机器语言后到底是几个指令周期 这样就知道了延迟时间 当然你取近似值也可以的

比如

for(i=0,i<255,i++){x=2}

这里x=2是一个指令周期 而执行了255次 假如你的晶振是12MHZ的 则你执行一个指令周期是1us 255次是0.255ms


这上面是单片机的计算方式。。。但是我们用的是arm926内核,还有多级流水线(好像3级吧),这个怎么计算法 ?外接的晶振是27MHZ

相关帖子

沙发
wangkj| | 2011-8-22 12:52 | 只看该作者
找个示波器,实测。

使用特权

评论回复
板凳
quarticarm|  楼主 | 2011-8-22 14:43 | 只看该作者
找个示波器,实测。
wangkj 发表于 2011-8-22 12:52

能具体一下吗?写个循环,然后往io口送0xA5,然后示波器上看时间间隔,这样如何?

使用特权

评论回复
地板
djyos| | 2011-8-22 17:48 | 只看该作者
假如用djyos,你可以用类似下列代码:
    u32Delay200nS = (200+djy_get_for_time(4)-1)/djy_get_for_time(4);
得到延时200nS所需要的循环次数,当然,你也可以用这种方法获得任意延时时间所需要的循环次数。
例子中的djy_get_for_time是系统提供的api。
这样写出来的代码,移植到任何系统都能正确延时,不需要一点点调整延迟时间。

使用特权

评论回复
5
quarticarm|  楼主 | 2011-8-23 11:12 | 只看该作者
假如用djyos,你可以用类似下列代码:
    u32Delay200nS = (200+djy_get_for_time(4)-1)/djy_get_for_time(4);
得到延时200nS所需要的循环次数,当然,你也可以用这种方法获得任意延时时间所需要的循环次数。
例子 ...
djyos 发表于 2011-8-22 17:48

汗。。。我情愿示波器。。

使用特权

评论回复
6
xinzha| | 2011-8-23 12:23 | 只看该作者
有没有cache,是否开启cache对你的测试结果有很大影响,如果开启了cache并且循环次数足够多,基本计算出来的结果跟指令周期数是匹配的。如果没有开启cache,你所看到的时间长度会远远大于通过指令周期数计算出来的数字,多出来的时间包含了总线读写切换,load等待等等,最准确的分许结果需要用仿真软件看会比较直观。

使用特权

评论回复
7
djyos| | 2011-8-24 11:25 | 只看该作者
汗。。。我情愿示波器。。
quarticarm 发表于 2011-8-23 11:12


示波器是好东西,不过,你要是改了主频,还要再用一次示波器哦;你要是改了编译优化级别,也要再用示波器哦;如果升级了编译器版本,当然还要用一次示波器;你如果更换了编译器,重新用一次示波器,那是必须的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

32

帖子

1

粉丝