www.mikrocontroller.net

Forum: Compiler & IDEs externer RAM ansprechen?


Autor: Christian Wolf (clupus)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Christian Wolf (clupus)
Datum:

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

MfG
Christian

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Christian Wolf (clupus)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Christian Wolf (clupus)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Christian Wolf (clupus)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

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

Autor: Christian Wolf (clupus)
Datum:

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

Autor: Christian Wolf (clupus)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.