- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

Thema: Atmega32 -> Hex wird zu groß - "schlanker programmie

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.06.2004
    Beiträge
    38

    Atmega32 -> Hex wird zu groß - "schlanker programmie

    Anzeige

    Powerstation Test
    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:

    Code:
    //-------------------------------------------------------
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.01.2006
    Ort
    Mönchengladbach
    Beiträge
    544
    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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    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ß.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Die Größe kannst du mit avr-size anzeigen lassen, indem man das .elf mitgibt.

    Für die Verwendung von avr-size siehe

    Code:
    avr-size --help
    Bei neueren Versionen gibt's zB die -C Option:

    Code:
    >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!
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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?
    Disclaimer: none. Sue me.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    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.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    09.06.2004
    Beiträge
    38
    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

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    58
    Beiträge
    1.195
    Mal abgesehen von den anderen Tipps: Statt der vielen delay(100) schreib Dir doch eine Funktion

    Code:
    void delay100ms(uint8_t i)
    {
       while(i--) 
       {
          _delay_ms(100);
       }
    }
    Hilft zumindest der Übersicht.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2006
    Beiträge
    183
    mein gott, eine hex ist keine bin...

    die passt immer.

    mfg

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress