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
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
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
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
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
Vielen Dank für Eure Antworten! Eine Sache weniger, auf die man achten muss ;-) Gruß Frank
Hai, Handbuch Seite 18 steht internes SRAM braucht 2 Takte. Sollte also schneller sein. bis denn...
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.