C 来自小型AVR程序的大十六进制文件

C 来自小型AVR程序的大十六进制文件,c,microcontroller,avr,avr-gcc,winavr,C,Microcontroller,Avr,Avr Gcc,Winavr,我现在教我的朋友如何编程AVR微控制器。我们已经编写了这个小程序,它发送简单的莫尔斯电码 问题是,在使用AVR-GCC和WinAVR编译后,a.out文件几乎为30KB,十六进制文件为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

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

问题是,在使用AVR-GCC和WinAVR编译后,a.out文件几乎为30KB,十六进制文件为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;
}
#定义F#U CPU 8000000L
#包括
#包括
虚光发光二极管(整数毫秒)
{

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

也就是说,将参数传递给_delay_ms()函数确实会破坏代码。我尝试了这个方法,总是使用常量调用delay函数,可执行文件少于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;
}
#定义F#U CPU 8000000L
#包括
#包括
无效灯光指示灯(内部更长)
{

PORTD |=(1尝试strip选项。有关更多信息,请参阅。如果所有其他方法都失败,则使十六进制变小的方法是:省略库,手动实现函数,修剪它们(通常过于灵活)额外功能。这样,未使用的内容就被忽略了……当然,代码会很难看。ATtiny2313有2 KB的程序闪存,但由于它是二进制的,所以十六进制文件的确切大小无法直接比较。在十六进制文件中表达一个字节的程序闪存数据需要远远超过一个字节。也就是说,接受@Dayalrai的建议确保二进制文件被剥离并针对大小进行了优化“为了使这些函数按预期工作,必须启用编译器优化,并且延迟时间必须是编译时已知常数的表达式。如果不满足这些要求,则产生的延迟将更长(基本上不可预测),并且应用程序[…]链接到应用程序中的浮点库例程将导致严重的代码膨胀“这基本上就是您在代码中看到的。我原以为内联light_led可以解决这个问题,但事实证明,我在avr gcc 4.7.2和avr libc 1.8.0中遇到了编译时错误;这是为了避免这种情况而添加的测试。