ich habe 64k externen SRAM an meinen Arduino Mega2560 angeschlossen und kann auch per Pointer darauf zugreifen - also z.B. den kompletten Speicher mit Werten füllen und diese wieder auslesen. Speicher sollte also funktionieren.
Damit der Linker jetzt aber auch Variablen usw. in den ext. Speicher packt, müsste ich folgende Optionen übergeben:
EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
Leider finde ich weder das Makefile, mit dem meine Sketches gebaut werden, noch eine Stelle, wo ich dem Linker irgendwelche Optionen übergeben könnte. Hat da vielleicht jemand einen guten Rat für mich? Ich wäre echt dankbar...
Folgender Sketch läuft jetzt mit dem SRAM und alloziert insgesamt 48k Speicher. Wenn die auskommentierten Zeilen mit kompiliert werden, kann man auch sehen, dass der Speicher korrekt beschrieben und gelesen wird (kompiliert mit Code::Blocks Arduino Edition 12.11).
Man kann also (so wie ich gesagt hatte) den externen Speicher mit dem XMCRA-Register an- und ausschalten, wie man will, aber (so wie jurs angeregt hat) man kann nicht erwarten, dass der Controller den Speicher dann von Anfang an benutzt. Dazu muss (so wie jurs das richtig gesagt hat) man den Speicher anschalten ehe etwas anderes im Programm passiert. Dazu bietet sich die init3-Section an, wo ich dann im obigen Sketch die Speicherinitialisierung hin kompiliert habe. Jetzt stehen rund 64k für die Verwendung mit malloc() zur Verfügung.
Auf dem Heap (also global) lässt sich z.B. auch ein Char-Array wie
char meinArray[30000];
anlegen, lesen und auch beschreiben.
Also, nochmals besten Dank an jurs - seine Tipps haben mir wirklich sehr weiter geholfen!
Gruß,
Ralf
PS: Ich kanns mir nicht verkneifen: Mein Mega2560 hat jetzt 64k freies RAM
@Schachmann: Deine Recherche ist sehr interessant, und wohl in der Praxis leicht Einsetzbar.
Würde bei meinem Webserver Projekt weiterhelfen, wo mir langsam aber sicher trotz Nutzung des F-Macros das S-Ram ausgeht.
Zudem macht das F Macro den Refresh der Website um den Faktor 10 langsamer (für das es keine Erklärung zu geben scheint) , ist aber ein anderes Thema.
Welche Ram-Ext Hardware nutzt du, ist wohl in den Thread's untergegangen.
in wieweit lässt sich das Ram auf diese Art erweitern und anschließend verwenden? Könnte man sich z.B. auch 128k SRAM dranbasteln? Und in wieweit affektiert es das Programm? mein Problem momentan ist, dass ich mit dem WS2811 herumspiele und da einiges an RAM draufgeht, so dass ich schon auf der Suche nach einer anderen Plattform war... Ich hätte dann allerdings eh etwas gesucht, das ich in eine eigene Schaltung integrieren könnte. Wenn man allerdings den Mega 2560 mit extra Ram bestücken kann, kann man theoretisch auch gleich ein Board mit dem 2560 in TQFP basteln...
rudirabbit:
Welche Ram-Ext Hardware nutzt du, ist wohl in den Thread's untergegangen.
Ich nutze nichts Fertiges, sondern habe mir das selbst gebastelt. Beschreibung, Bauplan, Schaltplan und Erklärungen gibt es hier: Beschreibung RAM-Erweiterung.
Es dürfte wohl (nicht geprüft - aber ich denke es ist so) mit jeder Speichererweiterung funktionieren, da die hardwaremäßige Ansteuerung ja vom Controller vorgegeben ist, aber...
Sofern der Speicher größer oder gleich 64kB ist müsste die Ansteuerung so funktionieren. Bei größerem Speichervolumen als 64kB wird es notwendig Speicherbänke umzuschalten. Und das kann dann von Modul zu Modul unterschiedlich sein, dazu kann ich nichts sagen, da ich ja solch ein Modul nicht verwende. Bei dem Modul aus Deinem Link sind es wohl 2 Bänke je 64kB und die Umschaltung geht über PD7. Wenn der Speicher kleiner ist als 64kB müssen die Linker-Optionen entsprechend angepasst werden.
Wenn die Bank-Umschaltung (s. vorige Antwort) gewährleistet ist, sind 128k möglich, dann dürften auch 512k kein Problem sein. Aber der Controller kann immer nur max. 64kB am Stück adressieren, deshalb die Bank-Umschaltung. Und zu beachten ist, dass der interne RAM rd. 8kB des externen RAMs überlagert. Auch hier muss (wenn der volle Zugriff bestehen soll) softwaremäßig zwischem den ersten rd. 8kB internem und externem Speicher umgeschaltet werden.
Wie müsste man eine derartige umschaltung umsetzen?
EDIT: Und könnte man die init-Befehle irgentwie in den Bootloader reinkriegen, damit man sich das allokieren im Sketch sparen kann?
in Deinem Programm ein. Speicher musst Du da allozieren, wo Du ihn brauchst, Du musst ja eine Adresse auf den Speicherblock haben. Und eine statische Variable im Boot-Loader bringt Dir in Deinem Programm auch nichts (naja, Du könntest irgendwie die Adresse aus dem Bootloader in Dein Programm übergeben). Aber der Aufwand zur Änderung des Bootloaders usw. ist sicherlich wesentlich höher, als die paar Zeilen Code in Dein Programm einzufügen.