[ZLG-ARM] DelayNS,DelayMS大约是多少时间?

[复制链接]
6382|16
 楼主| malaohu 发表于 2007-4-29 10:21 | 显示全部楼层 |阅读模式
比如:<br />void&nbsp;DelayMS(uint32&nbsp;dly)<br />{&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt100;&nbsp;i++);<br />}<br /><br />void&nbsp;DelayNS(uint32&nbsp;dly)<br />{&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt50000;&nbsp;i++);<br />}<br /><br />这个时间是怎么估计出来的,i取多少时是1秒,取多少是1毫秒?<br /><br />在zlg7290的软件包里有如下程序,为什么要DelayMS(10)?这个延时是多少,怎么确定的?<br />unsigned&nbsp;char&nbsp;ZLG7290_SendCmd(unsigned&nbsp;char&nbsp;Data1,unsigned&nbsp;char&nbsp;Data2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Data[2];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Data[0]=Data1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Data[1]=Data2;<br />&nbsp;&nbsp;&nbsp;&nbsp;ISendStr(ZLG7290,0x07,Data,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;DelayMS(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />}&nbsp;&nbsp;
王紫豪 发表于 2007-4-29 10:31 | 显示全部楼层

估算,不精确

  
 楼主| malaohu 发表于 2007-4-29 11:23 | 显示全部楼层

大约怎么个估算法?

  
zlgARM 发表于 2007-4-29 13:58 | 显示全部楼层

malaohu

精确延时一般用定时器。<br /><br />Delay(1S)这种用法仅仅在类似这样的例子:我让一个灯亮1S,灭1S,不停闪烁。<br /><br /><br />您可以用Delay()来做灯的闪烁试验,您改一下Delay的延时参数,再看看闪烁速度。<br /><br /><br />
ntman1985 发表于 2007-4-29 21:41 | 显示全部楼层

用函数来延时,要看把这函数翻译成汇编后有多少条指令

单片机执行一条指令要用多少时间,再乘一下.
 楼主| malaohu 发表于 2007-4-30 09:30 | 显示全部楼层

原来是要现翻译成汇编。怪不得以前调试AVRStudio时发现怎么每一句指令执行所需时间都不同呢。
zlgARM 发表于 2007-4-30 14:53 | 显示全部楼层

malaohu

51计算指令周其很方便。基本上只要按照晶振的频率来计算就好。<br />但ARM的指令周期不是很好计算,因为不仅仅取决于CCLK,还要受流水线、指令存取速度的影响。<br />
 楼主| malaohu 发表于 2007-5-1 12:05 | 显示全部楼层

嗯,非常感谢;)

  
Swd21ic 发表于 2007-5-1 22:08 | 显示全部楼层

!!!

用示波器测一下就知道了,不过受时钟频率,编译器,RAM/FLASH模式,ARM/THUMB模式的影响<br />
 楼主| malaohu 发表于 2007-5-10 15:17 | 显示全部楼层

总该有个估计值吧?

一:<br />你比如一个<br />void&nbsp;&nbsp;DelayNS(uint32&nbsp;&nbsp;dly)<br />{&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt5000;&nbsp;i++);<br />}<br /><br />我若把5000换位50000是不是原来的延时时间乘10了?那么上面的延时函数一般是延时多少us或ms?就没有个粗略值么、<br /><br />二:<br />比如<br />ADCR=&nbsp;0x11423453;<br />DelayNS(10);<br />这儿究竟延时了多少,我应用到控制中去的时候会不会因为延时过长过短造成损失呢?
Ice_River 发表于 2007-5-10 16:35 | 显示全部楼层

建议不估算!

对于2292来说,仿真时候的延时和真正跑起来时候的延时也是不一样的!<br />还是调试下,再调整!
zlgARM 发表于 2007-5-10 19:23 | 显示全部楼层

malaohu

我觉得暂时不应该花费这么多力气在这种问题上。先把基本概念搞清楚可能好些。<br />精确延时,明明可以用定时器去做,为什么非要用软件延时呢?有时候,好奇心会把人引到歧途~<br /><br />
chengyabcd 发表于 2007-5-11 08:04 | 显示全部楼层

赞同

ZLGARM说的对,没有必要在这种问题上花费大量的时间,需要精确定时就用定时器好了。^_^
zlgARM 发表于 2007-5-11 08:28 | 显示全部楼层

by the way

非常短的精确延时可以用软件延时实现。其它情况的精确延时最好用定时期。
 楼主| malaohu 发表于 2007-5-11 19:50 | 显示全部楼层

ok

懂了,要是显示个led之类的用个delayNS就可以了,要是精确延时还是用timer。thanks
250673206 发表于 2007-5-15 11:04 | 显示全部楼层

hehe

ZLGARM没法精确定时地,<br />只有定时器才行<br />因为,汇编之后有可能是THUMB指令也有可能是ARM指令
 楼主| malaohu 发表于 2007-5-15 15:34 | 显示全部楼层

嗯,认识逐渐的深刻了!

非常感谢各位大侠!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

95

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部