打印
[ZLG-ARM]

这个**

[复制链接]
3727|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chphei|  楼主 | 2008-12-30 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
         新牛年的小礼物__示波器记录的延时时间(By--Chphei)

    很多人问过ZLG关于指令执行时间的具体问题,ZLG用名词解释的方式作答复,并没有给出具体参数.因为对象有差异,所以具体指令执行时间会有不同. Chphei在作某项目的AD(外接12位)转换中,因为要对指令时间有较粗略的判断,具体涉及到微妙级,毫秒级的延时.虽然采用定时器似乎比较精确,但一来定时器资源已派作他用;二来在中断中完成这种针对AD转换需要的延时,不是可取的方法.所以用到了软件延时.究竟延时效果如何,还是先作个小程序通过示波器观察一下.

1:以下是程序清单:
#include "config.h"
#define LED1 (1<<21)
/*********************************************************
函数功能:软件延时  **********************************************************/

void DelayNS(uint32 dly)
{ uint32 i;
  for(;dly>0;dly--)
     for(i=0;i<50000;i++);
}

int main (void)
{
IO0DIR=LED1;
IO0CLR=LED1;
while(1)
{
if((IO0SET&LED1)==0)
      IO0SET=LED1;                //关闭LED1
  else  IO0CLR=LED1;              //打开LED1
DelayNS(100);   

}
    return 0;
}
/**********************************************/

2.在LED处接示波器观察如下:
(1)
DelayNS(100)约1100mS,DelayNS(10)约108mS,DelayNS(1)约7mS
(2)
将DelayNS(100)换做如下:
//for(i=0;i<10000;i++);  延时约1350uS ; 以下几句都是作为while内的一句而得的计时值
//for(i=0;i<1000;i++);   延时约114uS;
//for(i=0;i<100;i++);   延时约11.2uS;
//for(i=0;i<10;i++);     延时约2.1uS;
//for(i=0;i<1;i++);      延时约1uS;
//for(i=0;i<5;i++);   延时约1.6uS;   由这3句可看出实际+1次需要约100nS;真正独立的1uS即为i<10的循环;

3.其它说明
(1)
外接晶振11.0592M;
(2)
选择的是Debug in flash;
(3)
config.h中关于时钟的相关说明如下:
/* System configuration .Fosc、Fcclk、Fcco、Fpclk must be defined */
/* 系统设置, Fosc、Fcclk、Fcco、Fpclk必须定义*/
#define Fosc            11059200      
#define Fcclk           (Fosc * 4)                  
#define Fcco            (Fcclk * 4)                
#define Fpclk           (Fcclk / 4) * 1             
/****************************************************/

4.总结
通过上述实验,可以得到微妙级,毫秒级的大致延时. Chphei在项目中通过这种较精确的延时,取得了满意的AD转换效果.ARM在完成一次AD转换的时间得到了精确的控制,对实时性要求很高的多次AD采样,精确的延时时间控制是很有必要的.

另外顺便补充一下,如果想知道一句指令的具体执行时间,让它重复N遍执行,同样采取示波器观察的方法可以很好确定.还记得我们小学时怎么测量一张纸的厚度吗?压紧测量一叠纸再除以总数就差不多了.

新牛年到来了,是我母亲的本命年,60花甲了,勤勤恳恳操劳忙碌的一生,祝母亲健康快乐!转载请不要删去本句,同时祝福你的母亲健康快乐.  
                                    By--Chphei于2008岁末

相关帖子

沙发
winfeng| | 2009-1-10 21:37 | 只看该作者

你的路子可能走偏了

使用特权

评论回复
板凳
masashinakayama| | 2009-1-10 23:55 | 只看该作者

这个**

舍本逐末了
中毒,没救了

使用特权

评论回复
地板
zyok| | 2009-1-11 02:34 | 只看该作者

没必要。。。

使用特权

评论回复
5
chphei|  楼主 | 2009-1-14 10:30 | 只看该作者

自己认为很牛X的人

具体解释一下怎么走偏了?
怎么舍本逐末?

你的指令周期的时间是如何确定的?延时时间是如何得到的?有具体参数说明么?

自己认为很牛X的人,除了指责外总要显示一下你的牛X的实力吧,否则你不过哗众取宠罢了.  请让大家看看你牛X的实力.

使用特权

评论回复
6
zyok| | 2009-1-14 10:40 | 只看该作者

呵呵,低调、低调...

一年后你再来看看你这个贴吧....

使用特权

评论回复
7
szsfy| | 2009-1-14 10:44 | 只看该作者

鼓励交流

鼓励交流,不要动不动就打击别人,那样不利于活跃论坛气氛。

使用特权

评论回复
8
chphei|  楼主 | 2009-1-14 10:50 | 只看该作者

有本事就直接答复

ZLG曾回答过:ARM7内核的Dhrystone测试结果是0.95 DMIPS/MHz.

请问诸工,从这句话我们能判断执行每句指令的时间么? 且不说每句指令的时间不等,误差积累会有多大? 难道通过示波器观察不是更精确么?

至于有人说的一年以后. 你如果现在可以解释,怎么不解释一下.是不是你自己故弄玄虚,不懂装牛X. 有本事就直接答复. 说的在理我佩服你,说不了我鄙视你.

使用特权

评论回复
9
zyok| | 2009-1-14 10:56 | 只看该作者

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

没你牛x,哈哈哈~

使用特权

评论回复
10
xiajiawen| | 2009-1-14 11:13 | 只看该作者

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

真正能灵活使用示波器,把示波器的功能发挥至极限的咱论坛里面有没有一成?

使用特权

评论回复
11
chphei|  楼主 | 2009-1-14 11:16 | 只看该作者

比如浮点运算的指令

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

使用特权

评论回复
12
xiajiawen| | 2009-1-14 11:19 | 只看该作者

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

使用特权

评论回复
13
chphei|  楼主 | 2009-1-14 12:09 | 只看该作者

回12楼xiajiawen

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

使用特权

评论回复
14
xiajiawen| | 2009-1-14 13:20 | 只看该作者

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

使用特权

评论回复
15
chphei|  楼主 | 2009-1-14 14:55 | 只看该作者

请教netjob

百度了一下,CYCLECOUNTER有一篇:
MSP430单片机的软硬件C延时程序设计
http://edacn.net/html/36/126636-53128.html
"进行软件仿真。在仿真环境C-SPY Debugger中,从菜单View中调出Disassembly和Register窗口,前者显示编程软件根据C语言程序编译生成的汇编程序,在后者窗口中打开CPU Register子窗体,观察指令周期计数器CYCLE-COUNTER。"
这是MSP430的软件仿真环境,请问ADS1.2有没有类似的CYCLECOUNTER,netjob能否进一步说明?

百度"BDTIsimMark2000"
"BDTIsimMark2000和BDTIMark2000是截然不同的两种基准测试程序组。BDTIMark2000基准程序组仅仅用于处理器经过硬件验证后的性能测试;而BDTIsimMark2000程序组则只对仿真结果进行性能测试。BDTIsimMark2000和BDTIMark2000用于测试处理器的信号处理器速度,从这种意义上讲,它比MIPS或者MFLOPS那种简单的评价尺度要准确得多。" 
具体的测试程序组如何实现,没有找到,netjob能否给个链接?


使用特权

评论回复
16
haibao| | 2009-1-14 18:34 | 只看该作者

这个可以作为经验值

但不能说明一条指令的运行时间是多少,因为用LPC系列IO口的速度就比较慢,也就10M左右。

使用特权

评论回复
17
dragon_hn| | 2009-1-15 20:45 | 只看该作者

祝楼主母亲生日快乐!

祝楼主母亲生日快乐!愿天下所有的母亲都快乐!

我认为楼主的方法很好,至少我经常用!

例如对于1个主频60MHz的ARM,你想在ADC或是某些模块实现1us的延迟,你用定时器?
根据指令算指令周期一是只适用于汇编指令,对C语言基本不适用.2是只适用于低频单片机,对主频很高的ARM,特别是带SDRAM,NOR FLASH(程序)的MCU不适用.


定时器有时需要慎用和巧用:
1.定时器不是所有情况下都能解决所有问题.
2.定时器也不一定准(除非你只有一个唯一的中断:定时器中断).
3.定时器效率不一定高,建议主频/定时器中断频率>=1000.

使用特权

评论回复
18
masashinakayama| | 2009-1-16 09:16 | 只看该作者

1

1。你了解指令周期
2。你会用定时器,你会用定时器结合中断
3。你也许能找到_delay_ms() 类似的函数(AVR GCC就有)
4。你知道编译器会不同等级优化代码
5。你能估算出每种方式的精确程度

知道了上面5点,你的程序意义就不大了
大家还有没有补充?

使用特权

评论回复
19
masashinakayama| | 2009-1-16 09:19 | 只看该作者

自己再补充1点

程序在flash还是在sram里
开不开cache,执行速度不一样的
啊哈哈哈

使用特权

评论回复
20
dragon_hn| | 2009-1-17 12:14 | 只看该作者

反驳一下:

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

----------------------------------------------------------------
楼主的方法不是万能。但在某些情况下,特别是主频/定时器中断频率不大的情况下,很有可能比定时器效率高。

使用特权

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

本版积分规则

5

主题

25

帖子

0

粉丝