Forum: Compiler & IDEs externer RAM ansprechen?


von Christian W. (clupus)


Lesenswert?

Hallo Leute,

ich wollte mal wissen, wie ich den externen Bereich bei einem 8515
erreichen kann. Ich kann an den ja bis zu 64k exterenen Speciher
ranhängen. Nun die Fragen:
1.) Wie kann ich gcc sagen, dass "da noch was ist" und ggf. auch
sagen, welche Variablen ausgelagert werden sollen?
2.) Kann ich dem GCC sagen, welche Progammteile in ein ggf. exteres
Flash geladen werden sollen (So dass der Chip sich selbst programmieren
kann sollten gewisse Teile des Programms komplett im internen Speicher
liegen!)
3.) Wenn ich nur 32k RAM und 32k Flash einsetzen will, wie ist das dann
organisiert? An welcher Adresse ist der externe RAM zu erreichen? Woher
weiß das Programm, dass die Code-Ausführung an der Stelle 32k weiter zu
machen ist (dass er mir also nicht meine RAM-Plätze ausliest und
interpretiert ;-))? Oder liegt der RAM besser hinten und es gibt eine
RAM-Lücke? Wie sage ich das dann dem GCC?

MfG
Christian

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Harvard-Architektur der AVR-Controller trennt Speicher für Daten und
Programmcode. Der extern anschließbare Speicher erweitert nur den
Datenspeicher, nicht aber den Speicher für Programmcode.

Damit erübrigt sich Frage 2 und ein Teil von Frage 3.

Die Größe des verfügbaren Speichers (und die Tatsache, daß überhaupt
externer Speicher angeschlossen ist) müsste im Linkerscript
konfiguriert werden können.

Ob der Startupcode dann das externe Speicherinterface korrekt
konfiguriert oder ob Du Dich darum selber kümmern musst, entzieht sich
meiner Kenntnis, Jörg aber wird das mit Sicherheit wissen.

von Christian W. (clupus)


Lesenswert?

Und bei einem 8051er? (vgl. anderer Beitrag von mir von heute abend
http://www.mikrocontroller.net/forum/read-1-413149.html)

MfG
Christian

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der hat zwar auch eine Harvard-Architektur, ist aber in der Lage,
Zugriffe auf Daten- und Programmspeicher gemeinsam auf den externen
Speicherbus auszuführen ... muss er ja auch können, da es ROMlose
8051-Varianten gibt, an die ein externes EPROM anzuschließen ist.

Wie Du bei sdcc einstellst, daß Du externes RAM und externes ROM hast,
wirst Du der Dokumentation entnehmen müssen.

von Christian W. (clupus)


Lesenswert?

OK, das mit den 8051ern hat sich wohl vorerst erledigt (kein
Prog-Dongle).

Nun bleibt die Frage, wie ich gcc mitteile, dass da noch einiges an
Speicher ist.

MfG
Christian

von A.K. (Gast)


Lesenswert?

Dem LSS-Output zufolge ist in WINAVR das Programm-Segment unabhängig vom
Controller-Typ immer 128KB gross, das Datensegment immer knapp 64K
(abzüglich Reg- und I/O-Range). Wodurch ein Flash- oder RAM-Überlauf
eines Mega16-Programms erst vom ISP-Programmer (Flash) oder vom
Programmierer (RAM) festgestellt wird, nicht aber vom Linker.

Daher interessiert sich der Compiler nur dafür, mit welchem Anfangswert
der Stackpointer geladen werden soll. Was man mit -minit-stack=NNNN
beeinflussen kann.

von Christian W. (clupus)


Lesenswert?

Ich verwende aber statt WINAVR avr-gcc. Und da ist es interessant,
insbesondere wegen der Performance (will ein Dateisystem ansprechen. Da
muss ich bestimmte Blöcke einfach im RAM halten; Und genau hier will ich
auslagern. Der Rest kann zum Teil auch drinnnen bleiben (sollte auch).

MfG
Christian

von A.K. (Gast)


Lesenswert?

Was passiert, wenn du 40KB statische Daten anlegst? Meckert irgendwer?
Wenn nicht: siehe oben. Wenn doch, hast du möglicherweise im
Make-Prozedere irgendwo ein Linker-Script liegen und dort steht die
RAM-Grösse drin.

Und wenn du den erweiteren Speicher nur für besondere Zwecke verwenden
willst, weil externer Speicher langsamer ist als interner, musst du
bzgl. GCC überhaupt nichts tun. Der Compiler wird ihn nicht von sich
aus verwenden. Statt ist dein Programm voll und ganz selber für die
Verwaltung dieses Speichers verantwortlich.

von Christian W. (clupus)


Lesenswert?

» Und wenn du den erweiteren Speicher nur für besondere Zwecke
verwenden
» willst, weil externer Speicher langsamer ist als interner, musst du
» bzgl. GCC überhaupt nichts tun. Der Compiler wird ihn nicht von sich
» aus verwenden. Statt ist dein Programm voll und ganz selber für die
» Verwaltung dieses Speichers verantwortlich.

Wie kann ich das in meinem Programm machen? Wie lauten die jeweiligen
C-Codes/Linker-Parameter? Oder muss ich dann den RAM manuell
ansprechen? Also praktisch faktisch den RAM-Zugriff selber
programmieren und so pro Byte mehrere (schätzungsweise 20-30)
Maschinenzyklen verwenden?

MfG
Christian

von A.K. (Gast)


Lesenswert?

"Wie lauten die jeweiligen C-Codes/Linker-Parameter?"

Es gibt dafür keine, weil keine nötig sind.

"Oder muss ich dann den RAM manuell ansprechen?"

Ja.

"so pro Byte mehrere (schätzungsweise 20-30) Maschinenzyklen
verwenden?"

Warum? Mit
  char *p = (char *)0x1000;
hast du einen Pointer auf Speicher ab Adresse 0x1000.

von A.K. (Gast)


Lesenswert?

Also nochmal:

Entweder überlässt du das Compiler/Library. Dann habe ich den Parameter
oben genannt.

Oder du macht es selber. Dann macht du es selber. Selber. Du. Nicht der
Compiler, Library, usw. Nix einzustellen. Selber wissen, selber tun.

Entscheide dich für eine Variante.

von Christian W. (clupus)


Lesenswert?

@ A.K:
» so pro Byte mehrere (schätzungsweise 20-30) Maschinenzyklen
» verwenden?"
»
» Warum?
OK, hat sich erledigt. Ich danchte daran, den Speicher komlett manuell
zu steuern (über normele Port-IO!)

MfG
Christian

von Christian W. (clupus)


Lesenswert?

Ich hab noch ein bisschen gestöbert: Was hat es eigentlich mit der
malloc() Funktion auf sich? Ist das nicht so was wie ich suche?

MfG
Christian

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


Lesenswert?

> Was hat es eigentlich mit der
> malloc() Funktion auf sich?

Das sollte in jedem normalen C-Buch beschrieben sein.  Damit
implementiert C dynamische Speicherverwaltung.

> Ist das nicht so was wie ich suche?

Kann sein, muss aber nicht.  Zumindest beschreibt das Handbuch
die Optionen, wie man z. B. die normalen Variablen (und vor allem
den Stack) im internen RAM lässt (die Zugriffe dort sind einen
Takt schneller als der externe RAM), aber malloc() auf den
externen RAM stellen kann.

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.