请问下面的C语言延时函数是如何计算延时时间的?for循环中的四个nop是否可以省略?

void delay(int ms)
{ //延时子程序
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_(); //空执行
_nop_();
_nop_();
_nop_();
}
}
}

一个nop为1个指令周期,通过nop指令可以产生一定的延迟,但是对于快速的CPU来说效果不明显,因此可以多写几个,便可以多延迟几个时钟(具体应该说是一个指令占用了3个时钟脉冲);所以,一个for循环会执行4*250个指令周期,那么总共延时4*250*ms个指令周期~~
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-10
当然不能省略,执行一个_nop_()语句需要一个时间单位,那么for循环一共需要1000个时间单位。while循环就需要ms*1000个时间单位。假如这个时间单位为0.001毫秒的话,也就是delay函数会延迟ms毫秒追问

如果函数是这样的,那么ms=1的时候延迟了多长时间?如果我想改变i 的值,是不是最大只能到65535?谢谢
void delay(int ms)
{ //延时子程序
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
}
}
}

追答

这样的话是不会有延迟的。因为空循环在编译的时候会被优化的。i的值可以任意修改啊,只要不超过整型范围即可。具体范围得看是多少位的系统咯。

追问

i的范围是不是跟int i;
这个int有关系?如果定义i 是int类型,那最大值就只能设定到65535?谢谢

追答

如果是16为系统就是-32768~32767

本回答被提问者采纳
第2个回答  2014-03-10
nop 是一条汇编指令 ,意思是浪费1个时钟周期,但我觉得并不一定像这个代码显示,我想浪费多少ms ,就要运行多少个x1000次的nop,这个时间长度是不定的..
而且你不能去掉nop,不然编译器可能会吧空循环给优化掉.

请问下面的C语言延时函数是如何计算延时时间的?for循环中的四个nop是...
一个nop为1个指令周期,通过nop指令可以产生一定的延迟,但是对于快速的CPU来说效果不明显,因此可以多写几个,便可以多延迟几个时钟(具体应该说是一个指令占用了3个时钟脉冲);所以,一个for循环会执行4*250个指令周期,那么总共延时4*250*ms个指令周期~~...

单片机C语言中,怎么通过循环次数计算延迟函数的延迟时间?
首先你要知道一个指令周期是几秒 算法是1\/(晶振频率除以12)然后你要知道循环究竟执行了几个指令周期 你可以用keil里在线反汇编命令看看你的循环编译成机器语言后到底是几个指令周期 这样就知道了延迟时间 当然你取近似值也可以的 比如 for(i=0,i<255,i++){x=2} 这里x=2是一个指令周期 而执...

C语言延时函数
学过汇编你就会知道,每条指令都占一定的时间(或者机器周期)的,如果你让机器什么都不做,即空指令的话,机器就会延时,然后你在计算好每次延时到底有多长,外面套一个循环(或者多重循环),根据你想要的延时时间即可计算出来循环的次数 ,延时函数基本上都是这种原理,它的参数就是用来控制循环次数的...

C语言延时程序中,延时时间是如何计算出来的. (假如我想延时1s该如何计算...
首先你要延时多长时间,us级别的必须使用汇编,C误差很大,10-100us级别的可以用C控制,单必须考虑C出栈入栈时间。ms以上的用时间除以机器周期(除以你则个1us是不行的,误差大)。另外,看着你好像用的是keil,keil里边单步调试里边不是有时间吗,你可以看一下算算CPU空跑的次数,很简单。

C语言for循环嵌套延时问题
这个延时函数是个指令延时,指令多了,延时时间就长。for(x=0;x<120;x++) 这个循环里,每一次循环,都会有一个 加一 和 判断跳转指令。X为char 时是单字节,这些指令都是一条指令,当改为 int时 x就成了双字节了,这些操作就需要多几条指令来完成。这就相当于,每次循环的时间加长了。

帮我看一下这个C语言函数:
while(ms--){ for(j =120;j>0;j--);} } 如果我没记错的话,在c51汇编里面,djnz这个指令是双周期的,那么上面的延时也就是5*120*2微秒,等于1.2毫秒。如果我记错了,那就差不多是600微秒 其实C语言的延时都是不准确的,汇编就很准确了,可就算是汇编,如果遇到被中断打断,那同样也是不...

C语言delay的延时函数怎么写
2.你要延时是否“死等”,还是可以切换到其他任务?--- 如果你只是学习c语言,写个小函数玩玩,可以如下:void delay(int time){ for(;time>0;time--){ nop;\/\/可写任何无意义的操作 } } 死等型的延时,时间根据指令执行速度不同而不同!!!

单片机延时程序的延时时间怎么算的?
单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。

c语言等待指定的时间,怎么做?
时间到了就break。(2)用延时子函数,也是一个循环,每个循环周期执行N个NOP指令,这个N由汇编语言来控制,也就是循环体里插入汇编语句,一个NOP的时间由单片机决定,有的是1个机器周期,有的是2个,但是具体的单片机执行NOP的时间是相同的,你可以算一个有多少个NOP就知道延时了多长时间。

怎么用C语言写可以调节的延时程序,请大侠帮忙
C语言延时程序:10ms延时子程序(12MHZ)void delay10ms(void){ unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);} 1s延时子程序(12MHZ)void delay1s(void){ unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;...

相似回答