mikrocontroller.net

Forum: Compiler & IDEs Variablen im RAM positionieren


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Habe an einem AT90S8515 32K XRAM hängen und frage mich nun, ob und wie 
ich den GCC dazu bringen kann, bestimmte Variablen im internen und 
andere im externen RAM anzulegen, da ich vermute, dass der Zugriff auf 
externes RAM langsamer ist, als auf internes RAM.

Gruß
Frank

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

schau dir mal im Verzeichnis /avrgcc/avr/lib/ldscripts die Dateien mit 
der Endung .x an. Wenn du
data   (rw!x) : ORIGIN = 0x800060, LENGTH = 512
in
data   (rw!x) : ORIGIN = 0x800060, LENGTH = 8k
änderst, sollte der Compiler in diesem Fall z.B. ein externes RAM von 
8kB Größe verwenden können. Davor muss es wahrscheinlich durch Setzen 
des entsprechenden Bits im MCUCR aktiviert werden, ist aber auch möglich 
dass das der Compiler automatisch macht!

Gruß
Andreas

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,

danke für die Antwort, aber die Linker-Geschichte ist mir bekannt. Es 
geht darum: Wie kann ich dem Compiler sagen, dass er z.B. die Variable 
uint8_t IntRAM  in das MCU-interne RAM, die Variable  uint8_t ExtRAM 
dagegen in das externe RAM packen soll? Hintergrund der Frage: Externes 
RAM ist doch vermutlich langsamer als internes RAM, oder?

Gruß
Frank

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube nicht dass man das dem Compiler sagen kann. In Assembler wird 
auf den externen Speicher genau so zugegriffen wie auf den internen, so 
dass eine Unterscheidung eigentlich unnötig ist.
Ob es einen Geschwindigkeitsunterschied gibt steht sicher im Datenblatt, 
aber ich denke es müsste gleich bleiben.

Gruß
Andreas

Autor: A. Füßer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Zugriff auf externes RAM benötigt 3 Takte (siehe Datenblatt 8515, 
S.53 bzw. S.83) ohne Waitstate. Für einen schnelleren Zugriff auf 
internes RAM wäre ein davon unabhängiger schnellerer Bus nötig. Ich kann 
ich mir nicht vorstellen, daß Atmel sowas gemacht hat. (Zumal auf S.53 
steht, daß bei internenRAM-Zugriffen Spikes auf ALE auftreten können -> 
nur ein Bus). Also vermute ich daß internes und externe RAM von der 
Zugriffszeit identisch sind. Liege ich falsch, so möge man mich 
korrigieren.

André.

--
CAN@home - http://www.CANathome.de - Hausautomation mit AVR + CAN

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Eure Antworten! Eine Sache weniger, auf die man achten 
muss ;-)

Gruß
Frank

Autor: Lanius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hai,

Handbuch Seite 18 steht internes SRAM braucht 2 Takte. Sollte also 
schneller sein.

bis denn...

Autor: Lanius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seite 12 -13 steht auch noch was dazu.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lanius,

vielen Dank für den Hinweis! Wer lesen kann, ist doch klar im Vorteil 
;-)

Ich habe zwar ganz andere Seitenzahlen, aber fest steht: internes RAM: 2 
Taktzyklen, externes RAM 3 oder (mit WaisState) 4 Taktzyklen.

Damit wären wir wieder bei meiner Eingangsfrage, ob und wie man die 
Ablage der Variablen unter gcc beeinflussen kann...

Gruß
Frank

Autor: Lanius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beim GCC kann ich dir das auch nicht sagen. Kannst ja mal in der 
Mailing-Liste fragen.
Der SDCC kann das, ich weiss aber nicht ob der den AVR jetzt 
unterstützt.

bis denn...

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also, laut
http://avr.jpk.co.nz/pipermail/avr-gcc-list/2001-F...

geht das so:

char *test;  // Declare a pointer to a char

test = (char *)0xFFFF; // Set that pointer to 0xFFFF;
*test = 0xEE;        // Now set the char pointed to by the pointer to 
0xEE

oder direkt:
*(char*)0xFFFF = 0xEE;

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.