AVR Studio RAM-Anzeige, internes RAM Problem

OP #581862
Lesenswert?
• ▲
▼
Hallo,

zeigt das AVR Studio nur den RAM Speicher vom main file an, oder 
praktisch den worstcase mit allen dazugehörigen source-files?

Kann ich das RAM komplett mit Variablen füllen, oder braucht der mc noch 
Platz zum arbeiten. Eigentlich schon, oder? Wieviel % sollte man 
unbenutzt lassen?

Ich habe Variablen deklariert. Speicher 45% verbraucht (Atmega16).
System inkl. paralleles LCD funktioniert.

Wenn ich nun z.B. ein uint64_t[64] array hinzufüge, funktioniert nichts 
mehr.
Bei einem array mit 100 werten funktioniert es erstaunlicherweise 
wieder.

Ich habe keine Ahnung was das für ein Phänomen ist?
Bitte um Rat!!

Danke im Voraus!!

Stephan
Gast #581874
Lesenswert?
• ▲
▼
Servus!
Ich kenne mich mit AVR Studio nicht aus, schätze aber mal, das es dir 
den gesamten Speicherverbrauch anzeigt. Alles andere wäre mehr oder 
weniger sinnlos.
Du könntest das RAM komplett mit Variablen füllen, wenn du keinen Stack 
brauchst. Sobald du aber in C programmierst, brauchst du den Stack.
Wieviel RAM du dem Stack lassen solltest, ist schwer zu sagen. Kommt 
drauf an. Rekursiv aufgerufene Funktionen (z.B. naive Implementierung 
von Fakultät oder so) können unter Umständen dann extrem viel Speicher 
für den Stack brauchen.
Das mit deinem uint64 Array muss ein Fehler sein.
Rechne mal:
ein uint64 hat 8 Byte, du nimmtst 64 davon, macht 512 Byte oder genau 
die Hälfte vom RAM des Mega16.
Wenn du 45% Speicherbelegung hast, würde ja das uint64_t[64] Array 
theoretisch noch reinpassen. Du schreibst aber, das es Fehler gibt 
->Stack vermute ich mal.
Aber ein uint64[100]==800Byte==80% des RAMs KANN nicht mehr reinpassen.

Zeig halt mal deinen Code her, da wird der eine oder andere schon was 
sinnvolles zu sagen können!
Gast #582138
Lesenswert?
• ▲
▼
Da wird angezeigt, wie viel RAM von globalen und 'static' Variablen 
gebraucht wird (.data und .bss).
Wie viel RAM noch für Stack (-> Rückkehradressen für Funktionen und 
ISRs) und Heap ( RAM für lokale Variablen in Funktionen, die nicht in 
Registern gehalten werden (können) und malloc()) verbraucht wird, KANN 
der compiler  nicht anzeigen.
(Spätestens) Wenn der RAM knapp wird:
- Optimierung aktivieren (Die sollte man nur _aus_schalten, wenn man 
Assembler lernen oder Compiler-Bugs finden will,  oder wenn man nicht 
sicher ist, dass das Programm überhaupt funktioniert ;) )
- konstanten (v.a. Strings) in den Flash auslagern
- alle Variablen auf die minimal nötige Größe beschränken

hth. Jörg
OP #582878
Lesenswert?
• ▲
▼
@ozo: Ja, stimmt da hast du recht mit dem verbrauchten speicher. Ich 
habe die     Variablen deklariert und mich immer auf die RAM Anzeige vom 
AVR Studio
verlassen. Aber abgesehen davon tritt das gleiche Phänomen bei einem 
Mega32
auf, der 2 KByte RAM besitzt.

@jörg: Welche Funktion brauche ich, wenn ich z.B.

const uint8_t test[3][16] = {"...","......};

in den Flash auslagern und lesen möchte.

Vielleicht:

const uint8_t test[3][16] PROGMEM = {"Test","......};

Aber wie kann ich darauf zugreifen?

Für das oben beschriebene Phänomen hat keiner ne Idee?

Gruß Stephan

Antwort schreiben

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.

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.