mikrocontroller.net

Forum: Compiler & IDEs Verständnisfrage Heap


Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da ich nun zum ersten mal die RAM-Grenze eines ATMega128 sprenge und auf 
ein ext. Ram angewiesen bin, habe ich eine kl. Frage zum Heap:

Wenn ich selber nicht explizit malloc und Konsorten verwende, gibt es 
dann auch keinen Heap?!?

Globale Variablen laden doch im .data bzw .bss und lokale Variablen auf 
dem Stack.

Gibt es evtl. auch eine Situation (Makro, Präprozessoranweisung ect.), 
welche Daten auf dem Heap ablegen?

Hintergrund:
Ich möchte schon gern wissen, was im Ram passiert und wie ich den 
RAM-Aufbau (mit dem Make-File) am sinnvollsten gestalte..

Danke schonmal für alle Hinweise!

Gruß,
Techniker

Autor: Dirk Broßwick (sharandac)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei diesen Thema oder besser gesagt deinen Fragen kann ich dir nur den 
folgenden Link ans Herz legen wenn du mit externen RAM arbeiten 
möchtest.

http://www.nongnu.org/avr-libc/user-manual/malloc.html

CA Dirk

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

Danke für deinen Tipp.

Diese Seite kenne ich schon und beantwortet leider nicht meine Frage..
(oder habe ich da was überlesen?)

Gruß,
Techniker

Autor: Dirk Broßwick (sharandac)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Techniker wrote:
> Hallo Dirk,
>
> Danke für deinen Tipp.
>
> Diese Seite kenne ich schon und beantwortet leider nicht meine Frage..
> (oder habe ich da was überlesen?)

Na, Teilweise. Oder besser gesagt wie du den speicher aufteilen kannst 
mit den avr-gcc Optionen.
Deine restlichen Überlegungen über die Zuteilung des RAM war schon so 
korrekt gewesen. Die beste Aufteilung ist wenn man externen Speicher hat 
den internen komplett für den Stack zu benutzen, da auf diesen sehr 
schnell zugegriffen werden kann und so lokale Variablen in Funktionen 
genauso schnell sind wie ohne externen RAM.
 In das externe RAM sollte dann eigentlich nur noch der Rest rein ( 
Heap, .bss und .data, siehe Grafiken zu malloc). Darauf erfolgt der 
Zugriff geringfügig langsamer ( mindestens 1 Takt bei 0 Waitstates ) was 
aber nicht stört, da diese Variablen nicht so oft gebraucht werden im 
Idealfall.

> Gruß,
> _Techniker_

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Techniker wrote:
> Wenn ich selber nicht explizit malloc und Konsorten verwende, gibt es
> dann auch keinen Heap?!?
Es gibt ihn. "Heap" ist nicht viel mehr als ein Speicherbereich, von dem 
zumindest die Startadresse bekannt ist (Endadresse für Tests auf "Heap 
voll"). Vgl. head_start, heap_end auf der von Dirk Boßwick genannten 
Seite.

> Globale Variablen laden doch im .data bzw .bss und lokale Variablen auf
> dem Stack.
und evtl. Parameter und Rücksprungadressen

> Gibt es evtl. auch eine Situation (Makro, Präprozessoranweisung ect.),
> welche Daten auf dem Heap ablegen?
Über das im Dokument der avr-libc gezeigt hinausgehend wird es etwas 
kniffig: Man kann per section-attribute Funktionen und Variablen 
bestimmten sections zuweisen, siehe dazu die Dokumentation des gcc 
(gcc.gnu.org). Diese sections kann man per Linker auf bestimmte 
Speicherbereiche zuweisen, siee dazu die Dokumentation der GNU Binutils 
(ld). Variablen kann man z.B. ein ".data2" "compiler-Section"zuweisen 
und für die Elemente dieser "compiler-Section" eine "Linker-section"  im 
externen RAM anlegen. Meines Wissens ist das aber in den Linker-Skripten 
der avr-libc nicht vorgekaut. Evtl. reicht es mit 
"section-start"-Linker-Option Startadressen manuell festzulegen. Würde 
das aber durch eigenes Linkerscript machen (mit einem aus der avr-libc 
anfangen und erweitern). Weiterhin muss man dann noch eine 
Kopierfunktion schreiben, die die Initialwerte von "data2" Variablen ins 
RAM kopiert. Ähnliches bei einem "bss2", dann aber den davon belegten 
RAM-Speicher beim Startup mit nullen voll schreiben. Alles in Allem 
nicht ganz simpel und vielleicht gar nicht nötig. Evtl. weiss jemand 
noch eine einfacheren Ansatz.

Falls man dennoch nicht allen Variablen Speicher im externen RAM 
zuweisen will (stack sollte immer intern bleiben), vielleicht doch mit 
"malloc und Konsorten" arbeiten. Wenn man das etwas umsichtig macht und 
nicht verschachtelt und zudem noch verschieden große Speicherbereiche 
"malloct" und "freet", spricht meiner Meinung nichts dagegen (jaja, er 
hat "Johova" gesagt).

> Hintergrund:
> Ich möchte schon gern wissen, was im Ram passiert und wie ich den
> RAM-Aufbau (mit dem Make-File) am sinnvollsten gestalte..
Allein mit Parametern im Makefile kann man wohl nicht so viel mehr 
machen können, also schon in der Dokumentation der avr-libc beschrieben 
ist.

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE (!!) für die ausführliche Antwort :-)

Das reicht mir vorerst einmal..

Gruß,
Techniker

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.