zhwm3064 发表于 2008-12-7 03:49:39

CVAVR自带的延时函数问题【恢复】

请教马老师一个问题

在程序中不断的用CVAVR自带的延时函数,是不是比自编的延时函数用的程序量要大。(就是将来生成的代码多)

rejoice818 发表于 2009-1-16 19:41:39

学习了! THANKS

xiebin 发表于 2009-1-8 09:27:59

谢谢马老师指点!!!

wujianwen 发表于 2008-12-16 11:06:20

原来延时还有这些要注意的,呵呵。今后一定要注意了。谢谢马老师!

zhwm3064 发表于 2008-12-8 15:19:48

谢谢马老师的指点,我有一次编译没通过,还以为它提供的延时函数只可用如常量呢,原来如此啊。

所以我开头的问题,以为这样子会占用很多代码量的。

不过它的延时函数 ms的和us的,我用示波器测量了,还是非常的准确的。

machao 发表于 2008-12-8 12:18:15

请注意,需要仔细看人家的东西,再发表评价。



CVAVR中提供了2个延时函数:



The functions are:



void delay_us(unsigned int n)

generates a delay of n mseconds. n must be a constant expression.



void delay_ms(unsigned int n)

generates a delay of n milliseconds.

This function automatically resets the watchdog timer every 1ms by generating the wdr instruction.



其中delay_us(unsigned int n)要求n是常数,因为us要准确,使用变量的话会大大影响精度。1us执行的指令不多。

在C程序中调用delay_us()后,你可以看生成的ASM代码,它不是使用CALL,而是用的宏,嵌入了一段代码。当你系统时钟为1M时,调用delay_us(1)还会编译出错,因为嵌入的一段代码,已经超过了1us!



而delay_ms(unsigned int n)中的N就可以是变量,它生成的汇编是采用CALL调用函数,两者不同。另外,在delay_ms()中还清WDT(就是你使用了WDT,也能使用该函数)。作为通用的delay_ms(),代码当然多了点。



以上可以查看CVAVR编译后产生的LST文件。



1。没有好的汇编基础,和对AVR的彻底透彻的掌握,一般人写不出比它还要优化的通用代码。



2。我已经说过多少遍了。在实际的系统中尽量不要使用软件延时,浪费资源不说,系统很难做到并行处理。因此对于10us以下的延时,考虑直接嵌入汇编的_nop_指令。10-100us可以适当考虑使用delay_us(),而大于100us的延时,应该采用定时器中断了。

zhwm3064 发表于 2008-12-8 08:10:25

另外,它的延时函数只适合常量,不能用于变量,自编的延时函数可以用于变量。

machao 发表于 2008-12-7 13:40:03

要看你的水平,你的水平高,可以编写专用的。CVAVR中是通用的,适合各种系统时钟频率。



不过,尽量不要使用软件延时,特别是对于毫秒以上的延时,应该使用定时器。

本贴被 machao 编辑过,最后修改时间:2008-12-07,13:40:58.

zhexuejia 发表于 2013-5-6 00:44:13

恩 学习了
页: [1]
查看完整版本: CVAVR自带的延时函数问题【恢复】