Forum: Compiler & IDEs Variablen im RAM positionieren


von Frank (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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

von Frank (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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

von A. Füßer (Gast)


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

von Frank (Gast)


Lesenswert?

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

Gruß
Frank

von Lanius (Gast)


Lesenswert?

Hai,

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

bis denn...

von Lanius (Gast)


Lesenswert?

Seite 12 -13 steht auch noch was dazu.

von Frank (Gast)


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

von Lanius (Gast)


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...

von Jonas Diemer (Gast)


Lesenswert?

also, laut
http://avr.jpk.co.nz/pipermail/avr-gcc-list/2001-February/000219.html

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;

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.