Forum: Compiler & IDEs Mikrokontroller voll? Compiler Settings


von Stefanie (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich nutze den Codevision Compiler und einen Atmega1280.
Dieser besitzt 128kB Flash, 4kB EEPROM und 8 kB RAM

Nun habe ich bereits ein umfangreiches Programm geschrieben und bekomme 
folgende Errormeldungen beim Compilieren:

Wenn ich die Variablen innerhalb der Main deklariere:
Error: D:\main.c(66): too many local variables declared inside this 
function

Wenn ich die Variablen außerhalb der Main deklariere:
Linker error: global RAM variables size: 5343 bytes is too large

Ich habe meine Compiler Settings und die Info des letzten noch 
funktionsfähigen Programms mal angehängt.

Welche Settings kann ich hier noch vornehmen, um den Speicher zu 
vergrößern?

DANKE

von (prx) A. K. (prx)


Lesenswert?

Adam Ries kannte zwar noch keine Computer, aber das es etwas schwierig 
ist, deine 8KB RAM in 4-5KB für Stacks und 5-6KB für Daten aufzuteilen, 
das wäre auch ihm aufgefallen.

Wobei 4KB (estimated usage) für den Data Stack etwas heftig ausfallen. 
Und daran drehst du nicht mit einer Option, sondern mit dem Programm.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefanie schrieb:

> Welche Settings kann ich hier noch vornehmen, um den Speicher zu
> vergrößern?

Dem Ding geht der RAM aus. Häng nen externen RAM dran. Oder 
Programmierstil ändern :-) Oder nen fetteren µC hernehmen, wenn's 
wirklich so viel RAM braucht.

von Peter D. (peda)


Lesenswert?

Du mußt feststellen, welche Variablen so groß sind und ob sie wirklich 
so groß sein müssen.


Peter

von hans (Gast)


Lesenswert?

Mal ein erster Tipp:

Wenn du ein Display verwendest und Texte ausgibst sollten diese
als Konstanten im Flash liegen. Oft werden diese als
Variabel angelegt und brauchen dann doppelt Platz.

hans

von Stefanie (Gast)


Lesenswert?

Danke für die Antworten, doch ich versteh es noch nicht ganz.


Program size: 53540 Bytes = Flash (40,8%) also noch problemfrei



Problematisch sind nur die 8192 Bytes internen RAM,
davon reserviere ich 6144 Bytes für meine Variablen und den Stack und es 
werden aber nur (schätzungsweise) 4092 Bytes dafür gebrauchte.

Hier muss ich auch noch die 995 Bytes für die Globalen RAM Variablen 
zählen und die 1053 für den Hardwarestack (wie kann ich diesen Wert 
beeinflussen?)

-> Das macht zusammen genau 8192 Bytes.

Der Compiler meldet mir, wenn ich meine DataStack Size zu klein 
einstelle,
aber kann der Compiler schon sehen, dass während des Programmablaufs zu 
Fehlern aufgrund des vollen RAM-Speichers kommen kann?

Kann ich irgendwo sehen, was bzw. wo ich genau soviel Speicher 
verbrauche?

von Peter D. (peda)


Lesenswert?

Stefanie schrieb:
> -> Das macht zusammen genau 8192 Bytes.

Das kann ja nicht stimmen, sonst würde der Linker nicht meckern.

5343 bytes globale Variablen ist ein heftiger Brocken, wozu brauchst Du 
soviel?

Variablen dienen dazu, sich Werte zu merken.
Was man später nicht nochmal braucht, gehört nicht in globale Variablen.


Peter

von Karl H. (kbuchegg)


Lesenswert?

Stefanie schrieb:

> Der Compiler meldet mir, wenn ich meine DataStack Size zu klein
> einstelle,
> aber kann der Compiler schon sehen, dass während des Programmablaufs zu
> Fehlern aufgrund des vollen RAM-Speichers kommen kann?

Nein.
Denn wieviel Stack tatsächlich verbraucht wird, hängt davon ab, welche 
Wege der Programmfluss durch die Funktionen nimmt und welche Funktionen 
daher aufgerufen werden. Das aber hängt dann des öfteren auch wieder 
davon ab, welchen Input (Tastendrücken, ADC Wert etc.) dein Programm 
vorgesetzt bekommt. Von daher solltest du mit solchen Aussagen 'mein 
Compiler passt auf mich auf' sehr vorsichtig sein.

Das einzige was Compiler/Linker mit Sicherheit richtig bestimmen können, 
ist der Verbrauch, der durch globale Variablen entsteht. Alles andere 
ist mit einem gewissen Fehlerpotential zu sehen.

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.