PIC单片机的延时问题 晶振4Mhz。大哥们,别跑题啊,只要回答就可以了,详细点啊,我比较傻

void delay()
{
unsigned int d=1000;
while(--d){;}
}
此函数在4M晶体下产生10003us的延时,也就是10MS。问题1:我刚算了一下他应该执行了999条指令,1条单周期的指令也才1US,那就是999us,为什么会有10ms的延时?

1:for(x=100;--x;){;} : 2: for(x=0;x<100;x++){;} 2句话相同
第一句:X的值范围是不是 1~99?为什么?这么算的。第二句:X的范围是不是0~99?为什么?这么算的。我知道符号在前在后的区别。2句话应该是不一样的才对啊!

问题1:“我刚算了一下他应该执行了999条指令”因为你算错了。延时时间是由产生的汇编代码所决定的,C语言语句只是个假象,千万不要以为C语言一行就是一条指令!此处由于涉及到双字节减法,因此会有额外的判断,编译结果每次循环耗费几十个周期毫不奇怪。

问题2:前一句x从100开始递减,递减至1时退出循环。后一句x从0开始递增,递增到100时退出循环。所谓“2句话”相同仅仅是指这两个循环体的循环次数相同。实际上两个循环的执行过程是完全不同的,所消耗时间也有可能不同。追问

知道了 你知道PIC Sportwatch 准不准

追答

一次循环后才减一。

追问

跑表准不准 我看时序大概算一下

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-01-02
此函数在4M晶体下产生10003us的延时,也就是10MS。问题1:我刚算了一下他应该执行了999条指令,1条单周期的指令也才1US,那就是999us,为什么会有10ms的延时?
你知道它一定是一条指令么 ? 没有判断 ? 没有跳转 ? 你可以反汇编看看到底有几条指令 ..

for(x=100;--x;){;} :
当"--x"不为0的时候他的条件是成立的,而i的变化范围是 100~1(这个是For结构决定的)
for(x=0;x<100;x++){;}
同理,i<100成立,i = 0~100 (程序结束i=100)
第2个回答  2012-01-02
1. 延时问题:调用这个子程序时,进入这个子程序和退出都需要时间。
2. 第一个for当x在100~1时执行循环体,x=0循环结束;第二个for当x在0~99时执行循环体,x=100循环结束。 2个循环题都被执行100次,只是表达方式稍有差别