PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega32 -> Hex wird zu groß - "schlanker programmie



Jericho_one
09.02.2007, 13:36
Hallo!

Ich bin gerade dabei einen Atmega 32 und ein Display mit ein paar Tasten zu programmieren - allerdings habe ich das Problem, dass die Hexdatei sehr groß wird und wenn ich noch mehr "dazuprogrammiere".
Im Moment hab ich lediglich das Display, die Tasten und eine Menüsteuerung drin:


//-------------------------------------------------------
void null(void){
int ebene1 = 0;
LCD_Clr();
LCD_WritePosString(0, 0, "Ebene1':", 1);
while ( ebene1 != 1 ){
if (PIND &(1 << PD2))
{
ebene1 = 1;
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
LCD_Clr();
}
}


}

//-------------------------------------------------------
void eins(void){
unsigned char ebene2 = 0;
LCD_Clr();
LCD_WritePosString(0, 0, "Ebene2:", 1);
while ( ebene2 != 1 ){
if (PIND &(1 << PD2))
{
ebene2 = 1;
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
LCD_Clr();
}
}

}
//-------------------------------------------------------
void zwei(void){
unsigned char ebene3 = 0;
LCD_Clr();
LCD_WritePosString(0, 0, "Ebene3", 1);
while ( ebene3 != 1 ){
if (PIND &(1 << PD2))
{
ebene3 = 1;
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
LCD_Clr();
}
}
}

//-------------------------------------------------------
void drei(void){
unsigned char ebene4 = 0;
LCD_Clr();
LCD_WritePosString(0, 0, "Ebene4:", 1);
while ( ebene4 != 1 ){
if (PIND &(1 << PD2))
{
ebene4 = 1;
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
LCD_Clr();
}
}

}


//-------------------------------------------------------
void men_grund(unsigned char zeile){
LCD_WritePosString(0, 0, "Drehzahl:", 1);
LCD_WritePosString(1, 0, "Drehmoment:", 1);
LCD_WritePosString(2, 0, "zahl", 1);
LCD_WritePosString(3, 0, "zahl2", 1);
LCD_WritePosString(zeile, 19, "#", 1);
}
//-------------------------------------------------------
void men(void){

unsigned char menue = 0;
int merker_zeile = 0;
unsigned char ebene = 0;

LCD_Clr();

men_grund(0);

_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);



while ( menue != 1 ){


if (PIND &(1 << PD2)) //Menü
{
LCD_Clr();
menue=1;
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);

}

if (PIND &(1 << PD3)){ //hoch
LCD_ClrLineXY(merker_zeile, 18, 19);
merker_zeile += 1;
if ( merker_zeile == 4)
{
merker_zeile = 0;
}
LCD_WritePosString(merker_zeile, 19, "#", 1);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);

}

if (PIND &(1 << PD4)){ //runter
LCD_ClrLineXY(merker_zeile, 18, 19);
if ( merker_zeile == 0)
{
merker_zeile = 4;
}
merker_zeile -= 1;
LCD_WritePosString(merker_zeile, 19, "#", 1);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);

}

if (PIND &(1 << PD5)){ //OK-Button
if (merker_zeile == 0) {
ebene =1;
null();
men_grund(0);
}
if (merker_zeile == 1) {
ebene=1;
eins();
men_grund(1);
}
if (merker_zeile == 2) {
ebene = 1;
zwei();
men_grund(2);
}
if (merker_zeile == 3) {
ebene = 1;
drei();
men_grund(3);
}
}


}

} // Menüende

//-------------------------------------------------------


int main(void){


_delay_ms(500);
_delay_ms(500);
_delay_ms(500);



LCD_Init(0);
LCD_Clr();


DDRD &=~( (1<<PD2) |(1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD7) | (1<<PD6) ); //Pins auf active_high stellen
PORTD &=( (1<<PD2) |(1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD7) | (1<<PD6) ); //Internen Pull-Up deaktivieren

DDRB |= (1<<PB7);
PORTB &= (1<<PB7);




while(1)
{
int i=0;
char zahl[3];
for(i=0; i<301; i=i+10)
{
if (PIND &(1 << PD2))
{
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
men();
}
itoa(i,zahl,10);
LCD_WritePosString(3, 5, zahl, 1);
LCD_WritePosString(3, 18, "NM", 1);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);

}
}

return 0;

}

Wobei wenn ich lediglich das Display nutze und etwas darauf ausgeben lasse, die hex datei schon knapp 24kb groß wird.
Wie kann ich das ganze verbessern?
Danke

SIGINT
09.02.2007, 14:04
Hi Jericho_one,
vielleicht hast du die Optimierung beim GCC nicht aktiviert... geb mal "-Os" beim kompilieren an. Die Option sagt dem Compiler, daß er auf Größe optimieren soll. Es kann u.U. dazu kommen, daß der Code nicht mehr richtig funktioniert... dann schau dir mal die anderen Komandozeilenparameter an.
Ansonsten kannst du mal schauen, welche externen LIBs zum programm gelinkt werden und eventuell dort etwas optimieren.

Gruß,
SIGINT

uwegw
09.02.2007, 14:25
Die Größe der .hex entspricht nicht dem tatsächlichen Speichenverbrauch im AVR! Ein Programm von mir hat 6317 Byte, die .hex ist aber 17200 Bytes groß.

SprinterSB
09.02.2007, 14:36
Die Größe kannst du mit avr-size anzeigen lassen, indem man das .elf mitgibt.

Für die Verwendung von avr-size siehe


avr-size --help

Bei neueren Versionen gibt's zB die -C Option:


>avr-size -C foo.elf --mcu=atmega32
AVR Memory Usage
----------------
Device: atmega32

Program: 3460 bytes (10.6% Full)
(.text + .data + .bootloader)

Data: 94 bytes (4.6% Full)
(.data + .bss + .noinit)

EEPROM: 3 bytes (0.3% Full)
(.eeprom)



Beim Erzeugen deines HEX musst du darauf achten, daß nicht etwa Debug-Information darin landet!

bL1nK
09.02.2007, 14:57
hallo?
der atmega32 hat doch 32kb flash, wie müllst du die denn zu?

mach mal in der makefile die optimierung auf S (size) und sonst würd ich was an meinem programmierstiel ändern ;) also 32kb das is ja reichlich mehr als nötig um tasten zu lesen und ein display zu steuern.

du hast ja viel delay drin, nimm doch mal nen timer her ;) soll auch hilfreich sein :)

SprinterSB
09.02.2007, 15:15
Eigentlich sollte das bisschen Code sogar ohne Optimierung in den ATmega32 passen... Trotzden ist von nichtoptimiertem Code abzuraten (auch was dessen Laufzeit und RAM-Verbrauch angeht)

Möglicherweise sind auch die Bibliotheken die Platzfresser, weil die auf *printf zugreifen? Oder wird vielleicht gegen eine Bibliothek gelinkt, die ohne -Os erzeugt wurde?

bL1nK
09.02.2007, 15:30
da muss schon ein größerer hund begraben liegen, wenn du mit den paar zeilen soviel bytes zusammen bekommen hast.

wie sprinter scho gesagt hat, vielleicht includest du irgendwelche libarys die du gar nicht brauchst.

ich würd deinen programmablauf nochmal überdenken, soweit ich weiß ist ja eine delay-funktion eine die polled, sprich die an der zeile für 100ms lang hängt, das kann evtl mit nem WDT auch zu konflikten führen.

Jericho_one
09.02.2007, 16:54
Hi!

Danke für eure Antworten - werd ich alles probieren.
Zu den vielen delays noch etwas - ich hab bisher einfach noch keine Tastenentprellung drin bzw in der main sind sie einfach nur um auf dem display testweise etwas zu haben, was hochzählt. Von daher bleibt das auf keinen Fall so!
Wie gesagt danke schon mal - ich meld mich, falls ich wieder ein Prob hab - top Forum!

MFG

ogni42
09.02.2007, 20:09
Mal abgesehen von den anderen Tipps: Statt der vielen delay(100) schreib Dir doch eine Funktion



void delay100ms(uint8_t i)
{
while(i--)
{
_delay_ms(100);
}
}


Hilft zumindest der Übersicht.

robby-fant
10.02.2007, 16:32
mein gott, eine hex ist keine bin...

die passt immer.

mfg