mikrocontroller.net

Forum: Compiler & IDEs Mikrokontroller voll? Compiler Settings


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

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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.

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.