www.mikrocontroller.net

Forum: Compiler & IDEs Nach Aufteilung Code um 6KB größer


Autor: Anlen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich benutze die WinAvr Version 20081205 und den Atmega32

Ich möchte mein Projekt auf mehere Dateien aufteilen.

In meiner main.c habe ich folgende Funktionen:
void ReadADC(void)
{
    
  ADMUX = 0; // Pin C0      
  ADMUX |= (1<<REFS1) | (1<<REFS0) ; // interne Referenzspannung nutzen
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); 
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
    
  while ( ADCSRA & (1<<ADSC) ) {; }    // auf Abschluss der Konvertierung warten 
      
  result = ADCW;
  result = 0;
 
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
      
  for(int i=0; i<4; i++ )
    {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {;}
    result += ADCW;            // Wandlungsergebnisse aufaddieren
    }
        
  ADCSRA &= ~(1<<ADEN);
    
  result =((long)ADC*256)/1023+8;
    
  
}
//-------------------------------------------------------------------------


void ADCToLCD(int result)
{
  char volt[2];
  lcd_clear();
  
  if(result < BattMin)
    {
    lcd_draw_bmp(Achtung);
    lcd_set_cursor(30,LINE0+1);          
    lcd_puts_p(normal,PSTR("Batteriespannung:"));
    lcd_set_cursor(46,LINE2+1);          
    lcd_puts_p(normal,PSTR("niedrig !"));
    }
  if(result > BattMax)
    {
    lcd_draw_bmp(Achtung);
    lcd_set_cursor(30,LINE0+1);          
    lcd_puts_p(normal,PSTR("Batteriespannung:"));
    lcd_set_cursor(42,LINE2+1);          
    lcd_puts_p(normal,PSTR("zu hoch !"));      
    }  
  if(result >= BattMin && result <= BattMax)
    {
    lcd_set_cursor(22,LINE0+1);          
    lcd_puts_p(normal,PSTR("Batteriespannung:"));
    }

  lcd_set_cursor(24,LINE4+6);
  
  itoa(result,volt,10);
  char c0 = volt[0];
  char c1 = volt[1];
  char c2 = volt[2];
      
  if(result<100)
    {      
    lcd_putc(big,c0);
    lcd_puts(big,",");
    lcd_putc(big,c1);    
    }
    else
    {
    lcd_putc(big,c0);      
    lcd_putc(big,c1);
    lcd_puts(big,",");
    lcd_putc(big,c2);    
    }            
  lcd_puts_p(big,PSTR(" Volt"));  
}
//-------------------------------------------------------------------------

wenn ich die Funktion ADCtoLCD in meine neue Datei "Batterie.c" 
verschiebe also nicht kopiere dann wird mein Projekt von ehemals:

Program:   18834 bytes
(.text + .data + .bootloader)

Data:         87 bytes
(.data + .bss + .noinit)

auf

Program:   24234 bytes
(.text + .data + .bootloader)

Data:         89 bytes
(.data + .bss + .noinit)

aufgebläht. Das Programm funktioniert weiterhin es gibt keine Fehler 
beim erstellen. Die Funktionen werden natürlich in der "Batterie.h" 
definert.

Kann es sein das die Grafik LCD Routinen nochmal eingebunden werden. 
Bisher sind sie nur in der main.h included.

Weiß jemand vielleicht woran das liegt.

An den Compiler Einstellung -os wurde nichts geändert.

Danke schonmal im vorraus.

Anlen

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normal ist das nicht. Der Compiler hat zwar innerhalb einer Datei mehr 
Optimierungsmöglichkeiten, als in getrennten Dateien, aber bei den 
gezeigten Funktionen dürfte das keine Rolle spielen.

Zip doch mal das ganze Projektverzeichnis zusammen, und häng es hier an.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann es sein das die Grafik LCD Routinen nochmal eingebunden werden.
> Bisher sind sie nur in der main.h included.

Das macht mich stutzig.
Insbesondere der letzte Satz.

Autor: Anlen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mal beide Projekt in den Anhang gepackt.
Im Projekt "Normal" beträgt die grösse des HexFiles: 18834 bytes
Im Projekt "gross" beträgt die grösse des Hexfiles: 24234 bytes

Ausschlaggebend ist die Funktion "ADCtoLCD" welche den Code um anwachsen
lässt.
Bisher war die Funktion in der Datei "main.c" und soll nun in die Datei
"batt.c" im Ordner Einstellungen.

Dies ist meine erstes Projekt, darum bitte ich um Nachsicht wenn nicht
alles so perfekt aufgeräumt ist.

Danke für die Unterstützung.

Anlen

PS: Ich habe ausversehen einen weiteren Thread aufgemacht bitte löschen, 
danke.

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
static uint8_t normal[] PROGMEM = {
...
};

Ist in einem Header, der in main.h inkludiert wird.
Überall, wo main.h inkludiert wird wird ein entsprechender Array im 
Programmspeicher angelegt.
Vielleicht liegt es ja daran? Hab nicht geschaut, wo es in welcher 
Version inkludiert wird und ob es da Unterschiede gibt.

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Tabelle nur einmal willst, dann verschieb sie in eine .c 
Datei und lass das static weg.

In den header schreibst Du dann nur noch
extern uint8_t normal[] PROGMEM;

Autor: Anlen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

in der Tabelle ist der Font drin und den brauche ich mehrmals.

Gruß
Anlen

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber sicher nicht mehrfach identisch repliziert.

Autor: Willi P. (anlen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

sorry das verstehe ich nicht.

>Aber sicher nicht mehrfach identisch repliziert

Meine C Kenntnisse sind noch nicht so gut.

Anlen

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Willi P. (anlen)

>>Aber sicher nicht mehrfach identisch repliziert

>Meine C Kenntnisse sind noch nicht so gut.

Was du willst ist, dass die Tabelle EINMAL im Speicher abgelegt wird 
(Flash), aber ALLE Softwaremodule in allen Dateien darauf zugreifen 
können.
Das macht man so, dass man das Array in EINER Datei ganz normal anlegt 
(definiert). Z.B. in font.c
uint8_t normal[] PROGMEM = { bla }

Zu jeder .c Datei gehört praktisch immer eine Headerdatei, welche den 
Inhalt für andere Dateien beschreibt. Z.b. header.h
external uint8_t normal[] PROGMEM;

DIESE wird dann per #include in alle anderen Dateien eingefügt und damit 
können diese auf dein Array zugreifen. Es existiert jedoch nur einmal.

MFG
Falk

Autor: Willi P. (anlen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habs jetzt hinbekommen, danke an alle.
Es lag wirklich an den Tabellen.

Gruß
Anlen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.