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


von Anlen (Gast)


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

von Oliver (Gast)


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

von Karl H. (kbuchegg)


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.

von Anlen (Gast)


Angehängte Dateien:

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.

von Horst (Gast)


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.

von Horst (Gast)


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;

von Anlen (Gast)


Lesenswert?

Hi,

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

Gruß
Anlen

von (prx) A. K. (prx)


Lesenswert?

Aber sicher nicht mehrfach identisch repliziert.

von Willi P. (anlen)


Lesenswert?

Hi,

sorry das verstehe ich nicht.

>Aber sicher nicht mehrfach identisch repliziert

Meine C Kenntnisse sind noch nicht so gut.

Anlen

von Falk B. (falk)


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
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

von Willi P. (anlen)


Lesenswert?

Hallo

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

Gruß
Anlen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.