Nach Aufteilung Code um 6KB größer

Gast #1425119
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:
1
void ReadADC(void)
2
{
3
    
4
  ADMUX = 0; // Pin C0      
5
  ADMUX |= (1<<REFS1) | (1<<REFS0) ; // interne Referenzspannung nutzen
6
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); 
7
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
8
    
9
  while ( ADCSRA & (1<<ADSC) ) {; }    // auf Abschluss der Konvertierung warten 
10
      
11
  result = ADCW;
12
  result = 0;
13
 
14
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
15
      
16
  for(int i=0; i<4; i++ )
17
    {
18
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
19
    while ( ADCSRA & (1<<ADSC) ) {;}
20
    result += ADCW;            // Wandlungsergebnisse aufaddieren
21
    }
22
        
23
  ADCSRA &= ~(1<<ADEN);
24
    
25
  result =((long)ADC*256)/1023+8;
26
    
27
  
28
}
29
//-------------------------------------------------------------------------
30

31

32
void ADCToLCD(int result)
33
{
34
  char volt[2];
35
  lcd_clear();
36
  
37
  if(result < BattMin)
38
    {
39
    lcd_draw_bmp(Achtung);
40
    lcd_set_cursor(30,LINE0+1);          
41
    lcd_puts_p(normal,PSTR("Batteriespannung:"));
42
    lcd_set_cursor(46,LINE2+1);          
43
    lcd_puts_p(normal,PSTR("niedrig !"));
44
    }
45
  if(result > BattMax)
46
    {
47
    lcd_draw_bmp(Achtung);
48
    lcd_set_cursor(30,LINE0+1);          
49
    lcd_puts_p(normal,PSTR("Batteriespannung:"));
50
    lcd_set_cursor(42,LINE2+1);          
51
    lcd_puts_p(normal,PSTR("zu hoch !"));      
52
    }  
53
  if(result >= BattMin && result <= BattMax)
54
    {
55
    lcd_set_cursor(22,LINE0+1);          
56
    lcd_puts_p(normal,PSTR("Batteriespannung:"));
57
    }
58

59
  lcd_set_cursor(24,LINE4+6);
60
  
61
  itoa(result,volt,10);
62
  char c0 = volt[0];
63
  char c1 = volt[1];
64
  char c2 = volt[2];
65
      
66
  if(result<100)
67
    {      
68
    lcd_putc(big,c0);
69
    lcd_puts(big,",");
70
    lcd_putc(big,c1);    
71
    }
72
    else
73
    {
74
    lcd_putc(big,c0);      
75
    lcd_putc(big,c1);
76
    lcd_puts(big,",");
77
    lcd_putc(big,c2);    
78
    }            
79
  lcd_puts_p(big,PSTR(" Volt"));  
80
}
81
//-------------------------------------------------------------------------

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
Gast
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
Gast
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.
Angehängte Dateien:
Gast
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.
Gast
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;
@  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
1
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
1
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.