我正在教我的朋友如何编程AVR微控制器。我们编写了这个小程序,它发送简单的莫尔斯式代码。
问题是,在使用AVR-GCC和WinAVR进行后续处理后,a.out文件几乎为30KB,hex文件为11KB,因此它不适合attiny2313闪存。
WinAVR CMD: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;
}
答案 0 :(得分:5)
hex文件的大小具有误导性。它需要43个字节来表示16,所以你的可执行文件实际上只有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;
}