2

我现在正在教我的朋友如何对 AVR 微控制器进行编程。我们编写了这个小程序,它发送简单的类似莫尔斯电码。

问题是,在用 AVR-GCC 和 WinAVR 编译之后,a.out 文件几乎是 30KB,而 hex 文件是 11KB,所以它不适合 attiny2313 闪存。

WinAVR 命令:avr-gcc -mmcu=attiny2313 -Os -g main.c

avr-objcopy:avr-objcopy -O ihex a.out a.hex

这是代码:

#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

void light_led(int ms)
{
 PORTD |= (1 << 4);
 _delay_ms(ms);
 PORTD &= ~(1 << 4);
 _delay_ms(1000);
}

void send_char(int c)
{
 int i;
 for(i = 1; i < 8+1; i++)
 {
  if(c & i) light_led(1000);
  else light_led(500); 
 }
}

int main(void)
{
 DDRD |= (1 << 4);
 //char text[] = {'t', 'e', 's', 't'};
 int i;
 for(i = 0; i < 1; i++) send_char(100);//text[i]);
 return 0;
}
4

1 回答 1

5

十六进制文件的大小具有误导性。表示 16 需要 43 个字节,因此您的可执行文件实际上只有 4 K。

也就是说,将参数传递给 _delay_ms() 函数确实会破坏代码。我尝试了这个,总是用一个常量调用延迟函数,并且可执行文件小于 190 字节。

#define F_CPU 8000000L
#include <avr/io.h>
#include <util/delay.h>

void light_led(int longer)
{
 PORTD |= (1 << 4);
 if(longer) _delay_ms(1000);
 else  _delay_ms(500);
 PORTD &= ~(1 << 4);
 _delay_ms(1000);
}

void send_char(int c)
{
 int i;
 for(i = 1; i < 8+1; i++)
 {
  if(c & i) light_led(1);
  else light_led(0); 
 }
}

int main(void)
{
 DDRD |= (1 << 4);
 //char text[] = {'t', 'e', 's', 't'};
 int i;
 for(i = 0; i < 1; i++) send_char(100);//text[i]);
 return 0;
}
于 2013-09-30T13:08:10.760 回答