[ZLG-ARM] 这个**

[复制链接]
5813|28
 楼主| chphei 发表于 2008-12-30 19:21 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新牛年的小礼物__示波器记录的延时时间(By--Chphei)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;很多人问过ZLG关于指令执行时间的具体问题,ZLG用名词解释的方式作答复,并没有给出具体参数.因为对象有差异,所以具体指令执行时间会有不同.&nbsp;Chphei在作某项目的AD(外接12位)转换中,因为要对指令时间有较粗略的判断,具体涉及到微妙级,毫秒级的延时.虽然采用定时器似乎比较精确,但一来定时器资源已派作他用;二来在中断中完成这种针对AD转换需要的延时,不是可取的方法.所以用到了软件延时.究竟延时效果如何,还是先作个小程序通过示波器观察一下.<br /><br />1:以下是程序清单:<br />#include&nbsp;&quot;config.h&quot;<br />#define&nbsp;LED1&nbsp;(1&lt&lt21)<br />/*********************************************************<br />函数功能:软件延时&nbsp;&nbsp;**********************************************************/<br /><br />void&nbsp;DelayNS(uint32&nbsp;dly)<br />{&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;for(;dly&gt0;dly--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt50000;i++);<br />}<br /><br />int&nbsp;main&nbsp;(void)<br />{<br />IO0DIR=LED1;<br />IO0CLR=LED1;<br />while(1)<br />{<br />if((IO0SET&LED1)==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET=LED1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭LED1<br />&nbsp;&nbsp;else&nbsp;&nbsp;IO0CLR=LED1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开LED1<br />DelayNS(100);&nbsp;&nbsp;&nbsp;<br /><br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />/**********************************************/<br /><br />2.在LED处接示波器观察如下:<br />(1)<br />DelayNS(100)约1100mS,DelayNS(10)约108mS,DelayNS(1)约7mS<br />(2)<br />将DelayNS(100)换做如下:<br />//for(i=0;i&lt10000;i++);&nbsp;&nbsp;延时约1350uS&nbsp;;&nbsp;以下几句都是作为while内的一句而得的计时值<br />//for(i=0;i&lt1000;i++);&nbsp;&nbsp;&nbsp;延时约114uS;<br />//for(i=0;i&lt100;i++);&nbsp;&nbsp;&nbsp;延时约11.2uS;<br />//for(i=0;i&lt10;i++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;延时约2.1uS;<br />//for(i=0;i&lt1;i++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;延时约1uS;<br />//for(i=0;i&lt5;i++);&nbsp;&nbsp;&nbsp;延时约1.6uS;&nbsp;&nbsp;&nbsp;由这3句可看出实际+1次需要约100nS;真正独立的1uS即为i&lt10的循环;<br /><br />3.其它说明<br />(1)<br />外接晶振11.0592M;<br />(2)<br />选择的是Debug&nbsp;in&nbsp;flash;<br />(3)<br />config.h中关于时钟的相关说明如下:<br />/*&nbsp;System&nbsp;configuration&nbsp;.Fosc、Fcclk、Fcco、Fpclk&nbsp;must&nbsp;be&nbsp;defined&nbsp;*/<br />/*&nbsp;系统设置,&nbsp;Fosc、Fcclk、Fcco、Fpclk必须定义*/<br />#define&nbsp;Fosc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11059200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#define&nbsp;Fcclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fosc&nbsp;*&nbsp;4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#define&nbsp;Fcco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fcclk&nbsp;*&nbsp;4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#define&nbsp;Fpclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fcclk&nbsp;/&nbsp;4)&nbsp;*&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />/****************************************************/<br /><br />4.总结<br />通过上述实验,可以得到微妙级,毫秒级的大致延时.&nbsp;Chphei在项目中通过这种较精确的延时,取得了满意的AD转换效果.ARM在完成一次AD转换的时间得到了精确的控制,对实时性要求很高的多次AD采样,精确的延时时间控制是很有必要的.<br /><br />另外顺便补充一下,如果想知道一句指令的具体执行时间,让它重复N遍执行,同样采取示波器观察的方法可以很好确定.还记得我们小学时怎么测量一张纸的厚度吗?压紧测量一叠纸再除以总数就差不多了.<br /><br />新牛年到来了,是我母亲的本命年,60花甲了,勤勤恳恳操劳忙碌的一生,祝母亲健康快乐!转载请不要删去本句,同时祝福你的母亲健康快乐.&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By--Chphei于2008岁末
winfeng 发表于 2009-1-10 21:37 | 显示全部楼层

你的路子可能走偏了

  
masashinakayama 发表于 2009-1-10 23:55 | 显示全部楼层

这个**

舍本逐末了<br />中毒,没救了
zyok 发表于 2009-1-11 02:34 | 显示全部楼层

没必要。。。

  
 楼主| chphei 发表于 2009-1-14 10:30 | 显示全部楼层

自己认为很牛X的人

具体解释一下怎么走偏了?<br />怎么舍本逐末?<br /><br />你的指令周期的时间是如何确定的?延时时间是如何得到的?有具体参数说明么?<br /><br />自己认为很牛X的人,除了指责外总要显示一下你的牛X的实力吧,否则你不过哗众取宠罢了.&nbsp;&nbsp;请让大家看看你牛X的实力.
zyok 发表于 2009-1-14 10:40 | 显示全部楼层

呵呵,低调、低调...

一年后你再来看看你这个贴吧....
szsfy 发表于 2009-1-14 10:44 | 显示全部楼层

鼓励交流

鼓励交流,不要动不动就打击别人,那样不利于活跃论坛气氛。
 楼主| chphei 发表于 2009-1-14 10:50 | 显示全部楼层

有本事就直接答复

ZLG曾回答过:ARM7内核的Dhrystone测试结果是0.95&nbsp;DMIPS/MHz.<br /><br />请问诸工,从这句话我们能判断执行每句指令的时间么?&nbsp;且不说每句指令的时间不等,误差积累会有多大?&nbsp;难道通过示波器观察不是更精确么?<br /><br />至于有人说的一年以后.&nbsp;你如果现在可以解释,怎么不解释一下.是不是你自己故弄玄虚,不懂装牛X.&nbsp;有本事就直接答复.&nbsp;说的在理我佩服你,说不了我鄙视你.
zyok 发表于 2009-1-14 10:56 | 显示全部楼层

呵呵,你就鄙视去吧,俺本菜鸟,岂怕鄙视...

没你牛x,哈哈哈~
xiajiawen 发表于 2009-1-14 11:13 | 显示全部楼层

不使用定时器,这种方法没有什么不对,有示波器当然可以

真正能灵活使用示波器,把示波器的功能发挥至极限的咱论坛里面有没有一成?
 楼主| chphei 发表于 2009-1-14 11:16 | 显示全部楼层

比如浮点运算的指令

再比如,一条浮点运算的指令和一条最简单的数据传送指令,它们耗时能是一个数量级么,你能够用从0.95&nbsp;DMIPS/MHz的说明中得到什么信息呢?除了示波器观察的方法还有什么捷径?&nbsp;有哪位大虾给个说法,尤其是那些自认为很牛X的某工.&nbsp;<br />你如果回答去看汇编的程序代码,我倒想问是看汇编代码加机器指令时序分析耗的精力大,还是做一个简单的示波器实验方便快捷得多?
xiajiawen 发表于 2009-1-14 11:19 | 显示全部楼层

但写测试代码时完全可以用定时器来计时啊,呵呵~

  
 楼主| chphei 发表于 2009-1-14 12:09 | 显示全部楼层

回12楼xiajiawen

回12楼:<br />&nbsp;&nbsp;&nbsp;&nbsp;定时器派作它用了,2个定时器加PWM的定时器功能已全部用完.RTC要保留.所以全部定时器资源都用完.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;而且工作中具体设计到微秒级的延时,定时器如果搞成微秒级中断,即使是ARM也不好处理吧.更不谈还要实时处理其它任务了.<br />&nbsp;&nbsp;&nbsp;&nbsp;你说的测试代码是否指一段指令在运行的同时,定时器对这段代码计时,从而得到其运行时间.&nbsp;如果这样,倒是一条新的思路.&nbsp;不过还是没有示波器来的快捷吧.<br />&nbsp;&nbsp;&nbsp;&nbsp;谢谢你的回复.&nbsp;我从不否认这里有真正的牛人.但我看前3楼的怎么都不像.感觉他们还停在51单片机的思维,以为延时时间,指令周期等还可以手工计算出来.<br />
xiajiawen 发表于 2009-1-14 13:20 | 显示全部楼层

一个定时器可以做多个功能使用,定时器可以灵活使用不一

  
 楼主| chphei 发表于 2009-1-14 14:55 | 显示全部楼层

请教netjob

百度了一下,CYCLECOUNTER有一篇:<br />MSP430单片机的软硬件C延时程序设计<br />http://edacn.net/html/36/126636-53128.html<br />&quot;进行软件仿真。在仿真环境C-SPY&nbsp;Debugger中,从菜单View中调出Disassembly和Register窗口,前者显示编程软件根据C语言程序编译生成的汇编程序,在后者窗口中打开CPU&nbsp;Register子窗体,观察指令周期计数器CYCLE-COUNTER。&quot;<br />这是MSP430的软件仿真环境,请问ADS1.2有没有类似的CYCLECOUNTER,netjob能否进一步说明?<br /><br />百度&quot;BDTIsimMark2000&quot;<br />&quot;BDTIsimMark2000和BDTIMark2000是截然不同的两种基准测试程序组。BDTIMark2000基准程序组仅仅用于处理器经过硬件验证后的性能测试;而BDTIsimMark2000程序组则只对仿真结果进行性能测试。BDTIsimMark2000和BDTIMark2000用于测试处理器的信号处理器速度,从这种意义上讲,它比MIPS或者MFLOPS那种简单的评价尺度要准确得多。&quot;&nbsp;<br />具体的测试程序组如何实现,没有找到,netjob能否给个链接?<br /><br /><br />
haibao 发表于 2009-1-14 18:34 | 显示全部楼层

这个可以作为经验值

但不能说明一条指令的运行时间是多少,因为用LPC系列IO口的速度就比较慢,也就10M左右。
dragon_hn 发表于 2009-1-15 20:45 | 显示全部楼层

祝楼主母亲生日快乐!

祝楼主母亲生日快乐!愿天下所有的母亲都快乐!<br /><br />我认为楼主的方法很好,至少我经常用!<br /><br />例如对于1个主频60MHz的ARM,你想在ADC或是某些模块实现1us的延迟,你用定时器?<br />根据指令算指令周期一是只适用于汇编指令,对C语言基本不适用.2是只适用于低频单片机,对主频很高的ARM,特别是带SDRAM,NOR&nbsp;FLASH(程序)的MCU不适用.<br /><br /><br />定时器有时需要慎用和巧用:<br />1.定时器不是所有情况下都能解决所有问题.<br />2.定时器也不一定准(除非你只有一个唯一的中断:定时器中断).<br />3.定时器效率不一定高,建议主频/定时器中断频率&gt=1000.<br />
masashinakayama 发表于 2009-1-16 09:16 | 显示全部楼层

1

1。你了解指令周期<br />2。你会用定时器,你会用定时器结合中断<br />3。你也许能找到_delay_ms()&nbsp;类似的函数(AVR&nbsp;GCC就有)<br />4。你知道编译器会不同等级优化代码<br />5。你能估算出每种方式的精确程度<br /><br />知道了上面5点,你的程序意义就不大了<br />大家还有没有补充?
masashinakayama 发表于 2009-1-16 09:19 | 显示全部楼层

自己再补充1点

程序在flash还是在sram里<br />开不开cache,执行速度不一样的<br />啊哈哈哈<br />
dragon_hn 发表于 2009-1-17 12:14 | 显示全部楼层

反驳一下:

反驳一下,希望多些人讨论,结论就会越来越明朗!<br />1。你了解指令周期<br />&nbsp;&nbsp;&nbsp;用楼主的方法不用了解指令周期,只需用示波器测。上面我说了,指令周期只对低端单片机有用,对采用SDRAM/NOR&nbsp;FLASH等的用处不大。<br />2。你会用定时器,你会用定时器结合中断<br />&nbsp;&nbsp;&nbsp;相信能会单片机的都知道定时器怎样用<br />3。你也许能找到_delay_ms()&nbsp;类似的函数(AVR&nbsp;GCC就有)<br />&nbsp;&nbsp;&nbsp;AVR的确有这些函数,不过需要实现设定晶振频率<br />4。你知道编译器会不同等级优化代码<br />&nbsp;&nbsp;&nbsp;当然有。但是对指定的项目,当然也指定了MCU,包括编译环境(编译优化等级等)也不会随便更改。在不改变MCU,不改变编译器,不改变优化等级的情况下,楼主的方法绝对可行。<br />5。你能估算出每种方式的精确程度<br />&nbsp;&nbsp;&nbsp;定时器也不精确,例如它可能被更高等级的中断中断,或者同级的中断赶在它之前触发。<br />6。程序在flash还是在sram里<br />&nbsp;&nbsp;&nbsp;同第4条。在不改变MCU,不改变编译器,不改变优化等级的情况下,楼主的方法绝对可行。<br />7。开不开cache&nbsp;<br />&nbsp;&nbsp;&nbsp;同第4条。在不改变MCU,不改变编译器,不改变优化等级的情况下,楼主的方法绝对可行。<br /><br />----------------------------------------------------------------<br />楼主的方法不是万能。但在某些情况下,特别是主频/定时器中断频率不大的情况下,很有可能比定时器效率高。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

0

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