CVAVR自带的延时函数问题【恢复】
请教马老师一个问题在程序中不断的用CVAVR自带的延时函数,是不是比自编的延时函数用的程序量要大。(就是将来生成的代码多) 学习了! THANKS 谢谢马老师指点!!! 原来延时还有这些要注意的,呵呵。今后一定要注意了。谢谢马老师! 谢谢马老师的指点,我有一次编译没通过,还以为它提供的延时函数只可用如常量呢,原来如此啊。
所以我开头的问题,以为这样子会占用很多代码量的。
不过它的延时函数 ms的和us的,我用示波器测量了,还是非常的准确的。 请注意,需要仔细看人家的东西,再发表评价。
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的延时,应该采用定时器中断了。 另外,它的延时函数只适合常量,不能用于变量,自编的延时函数可以用于变量。 要看你的水平,你的水平高,可以编写专用的。CVAVR中是通用的,适合各种系统时钟频率。
不过,尽量不要使用软件延时,特别是对于毫秒以上的延时,应该使用定时器。
本贴被 machao 编辑过,最后修改时间:2008-12-07,13:40:58. 恩 学习了
页:
[1]