打印

delay(5)和t=5;delay(t);为什么延时时间差别几十部

[复制链接]
5261|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lshf0|  楼主 | 2011-7-2 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个延时函数
void delay(unsigned int x)
{
while(t--);
}

void main()
{
unsigned char t=2;
delay(t*55*23+234);//值是随便写的,这个延时时间为1
}

void main()
{
delay(2*55*23+234);//值是随便写的,这个延时时间为2
}

1要比2的延时时间长很多,有时会差几十倍。。问题应该是1要进入DEKAY函数内部前t*55*23+234计算用时较长,可能用到几MS。而2中则只要几US就直接能进入了。。不知道是为什么?

相关帖子

沙发
NE5532| | 2011-7-2 19:15 | 只看该作者
C语言编译会插入很多你没想到的东西的,C的延时函数只有摸着石头过河来做。

使用特权

评论回复
板凳
mohanwei| | 2011-7-2 20:16 | 只看该作者
摸石头那是因为你还不懂C的心……:lol
volatile void delay(volatile unsigned int x)
{
while(t--);
}

使用特权

评论回复
地板
linkasp| | 2011-7-2 20:20 | 只看该作者
void delay(unsigned int x)
{
while(t--);}
//t 是什么类型哦!!!
void main()
{
unsigned char t=2;
delay(t*55*23+234);//值是随便写的,这个延时时间为1
}

void main()
{
delay(2*55*23+234);//值是随便写的,这个延时时间为2
}

使用特权

评论回复
5
ahgao| | 2011-7-3 00:13 | 只看该作者
LZ,函数2的参数实际上是一个常数,编译器在编译时就给你算好了的。而函数1是一个变量表达式,需要运行时计算的,而且是一个int的乘法,8位机上耗时多很正常。

使用特权

评论回复
6
ahgao| | 2011-7-3 00:25 | 只看该作者
本帖最后由 ahgao 于 2011-7-3 00:28 编辑
摸石头那是因为你还不懂C的心……:lol
volatile void delay(volatile unsigned int x)
{
while(t--);
}
mohanwei 发表于 2011-7-2 20:16

(首先假设这个函数中的t实际上是x,楼主打错了。)
咦,新鲜哦。定义成volatile能编译成什么样子呢?形参和局部变量通常直接由寄存器实现,连内存都不用的。比如这个函数,难道编译后每次引用x时都去取x的实参的值?但是这样明显是不对的,违反了值传递的C函数调用规则。
为什么呢?如果不加volatile,什么情况下回导致编译器把这同一个函数编译成不同的代码呢?如果不是生成不同的代码,此函数的延时也是确定的啊。

使用特权

评论回复
7
沈老| | 2011-7-3 16:52 | 只看该作者
你说的延迟时间,不是deley的时间,是main的时间。用一个iodeley前置1,delay后置0,用示波器看看delay时间。

使用特权

评论回复
8
icecut| | 2011-7-3 17:54 | 只看该作者
5楼正确

使用特权

评论回复
9
xiaohui408x| | 2011-7-11 20:48 | 只看该作者
记号,曾遇到过采用定时器计时,但实际计时时间变短的问题,还没来得及深究。

使用特权

评论回复
10
majipeng1986| | 2011-7-12 10:43 | 只看该作者
示波器看看吧。

使用特权

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

本版积分规则

4

主题

15

帖子

0

粉丝