Forum: Compiler & IDEs was muss ich in "C" beachten, wenn ich ext. Speicher verwenden will?


von Santiago m. H. (mausschubser)


Lesenswert?

Hallo,

möchte mich demnächst an einen mega2560er waagen und der hätte ein 
Zwichengesicht für fremden Speicher.

Wie sieht das denn als C-Anwender aus?

Muss ich Adressen selbst auf den/die Port(s) schreiben, die Flags 
toggeln und dann Daten lesen/bzw. schreiben, oder nimmt mir der 
C-Compiler da was an Arbeit ab?

Laut Datenblatt wird der externe Speicher ja schon vom µC gemappt ...

So ganz ist mir das Prinzip (des ext. Speicherinterfaces und dessen 
Handhabung) noch nicht ganz klar.

Den Speicherbaustein selbst ansteuern und byteweise Daten lesen, bzw. 
schreiben würde ich, denke ich mal, hinbekommen.

Gruß Santi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Santiago m. H. wrote:

> Muss ich Adressen selbst auf den/die Port(s) schreiben, die Flags
> toggeln und dann Daten lesen/bzw. schreiben,

Das kannst du natürlich tun -- wenn du willst.

> oder nimmt mir der
> C-Compiler da was an Arbeit ab?

Nicht der Compiler, sondern der AVR: wenn du das XMEM-Interface
eingeschaltet hast, gehen Zugriffe auf Speicheradressen jenseits
des internen RAM (Register, IO-Register, SRAM) automatisch auf
dieses Interface.

In welchem Maße du dich bei diesen Zugriffen der Unterstützung des
Compilers bedienst oder nicht, ist und bleibt rein deine Sache.
Normalerweise weiß der Compiler nichts von seinem Glück, mehr RAM
zugreifen zu können, und benutzt ausschließlich den internen SRAM.
Dennoch kannst du selbst in diesem Modus über Zeiger gezielt auf
den XRAM zugreifen.  Du kannst aber auch dem Compiler auftragen,
für bestimmte Teile des Speicherbedarfs (Variablen, Heap, ggf. auch
Stack, aber das ist nicht empfohlen bzw. hatte bei einigen AVRs
auch Bugs) selbst auf den XRAM zuzugreifen.

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

von Santiago m. H. (mausschubser)


Lesenswert?

Hallo Jörg,

danke für Deine Aufmerksamkeit!

Danke auch für den Link. Den Abschnitt habe ich immer übersprungen, weil 
ich dachte, dass malloc im µC nix verloren hat.
Aber wenn man das mal in Ruhe durchliest, macht das mehr als Sinn ;)

Wieder was dazu gelernt.

Macht natürlich mehr Sinn, einen Speicherbereich allozieren zu lassen, 
anstatt dem Zeiger einfach eine Adresse zuzuweisen.

Das letzte Speichermodell hat es mir angetan. Werde es wahrscheinlich so 
umsetzen.

Wie sieht es denn mit dem Zeitverhalten aus?
Wenn ich das Timing-Diagramm im Datenblatt richtig deute, dauert ein 
Zugriff auf den externen Speicher 3 Takte. Wahrscheinlich kommt dann 
noch die übliche Zeigerarithmetik für den Compiler obendrauf. Oder?

Die Variablen __heap_start und __heap_end sind wahrscheinlich für 
malloc?
Oder beachtet die noch jemand anderes?

Gruß Santi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Santiago m. H. wrote:

> Die Variablen __heap_start und __heap_end sind wahrscheinlich für
> malloc?

Ja.

von Dirk B. (sharandac)


Lesenswert?

@ Santiago m.H.

Hallo, schau dir mal ein Projekt von mir an, ich hatte bei diesen 
Projekt mit den ATmega2561 zu tun + externes RAM.

http://213.239.212.163/mediawiki/index.php/Microwebserver#Grundgedanken_zum_Aufbau_der_Software

Im makefile musst du dann im prinzip nur wie schon erwähnt __heap_start 
und __heap_end einstellen.

CA Dirk

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.