久一网络科技

久一网络科技是您快速建站的首选,我们提供快速高效的服务:快速建站,服务器运维,整站建设,网络编程,网络安全等。持久的品质保证,始终如一的服务理念,久一网络科技-----您身边的网络专家。 如有需求,请联系:tech@jooyee.net

在WinAVR中,有一个delay.h文件,里面包含了_delay_us和_delay_ms两个函数,分别可以延时微秒和毫秒时间。看下面一个例子:


#include <avr/io.h>
#include <util/delay.h>

unsigned char t = 10;

int main()
{
while(1)
{
_delay_ms(10);
}

return 0;
}

编译后,程序空间占用为:

AVR Memory Usage
----------------
Device: atmega168

Program: 180 bytes (1.1% Full)
(.text + .data + .bootloader)

Data: 2 bytes (0.2% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...


如果将上面程序稍作修改:


#include <avr/io.h>
#include <util/delay.h>

unsigned char t = 10;

int main()
{
while(1)
{
_delay_ms(t);
}

return 0;
}


Device: atmega168

Program: 3844 bytes (23.5% Full)
(.text + .data + .bootloader)

Data: 266 bytes (26.0% Full)
(.data + .bss + .noinit)

Build succeeded with 0 Warnings...

发现RAM和ROM的占用突然就急剧增加了。这是为什么呢?从程序直接看,没有什么问题。打开delay.h文件,我们发现有一段说明:

In order for these functions to work as intended, compiler optimizations must be enabled, and the delay time must be an expression that is a known constant at compile-time. If these requirements are not met, the resulting delay will be much longer (and basically unpredictable), and applications that otherwise do not use floating-point calculations will experience severe code bloat by the floating-point library routines linked into the application.

上面这段话说明delay函数需要使用常数作为延时的参数,否则延时的结果可能会很长(不可预知),同时会因为链接了浮点库到程序,所以程序大小会急剧膨胀。


参考文献:
http://blog.ednchina.com/shaoziyang/139750/message.aspx

0 评论 ---->點閱數:

发表评论

关注者

热门帖子

网页浏览总次数