新牛年的小礼物__示波器记录的延时时间(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岁末 |