Ich habe da mal eine Frage, einfach nur aus Interesse.
In den 1980ern habe ich auf einem 16bit-Minicomputer (Digital Equipment) programmiert. Der Speicherplatz war durch die 16 Bit Adressraum begrenzt; wir haben aber trotzdem größere Programme geschrieben. Es gab da einen Compiler und einen Linker. Den Linker konnte man so konfigurieren, dass man selbst-definierte Module auf die Festplatte auslagern konnte. Wenn man das falsch machte, war der Rechner nur mit aus- und einlagern beschäftigt. Aber ansonsten war das in Zeiten, wo es noch keine 32 Bit, geschweige denn 64 Bit gab, das übliche Verfahren.
Gibt es so etwas auch für den Arduino? Oder anders gefragt: wenn der Speicherplatz nicht mehr ausreicht, was macht man dann? (Auf Mega umsteigen gilt nicht)
Falls Du auf Deinem Arduino eine Festplatte hast und die nötigen Routinen schreibst, wird das da auch funktionieren
Alternativ zur Festplatte könnte man z.B. auch SPI-Flash einbinden. Der ESP8266 macht sowas. Du könntest in dessen Coresourcen schauen, wie der das macht.
Das geht schon auf Grund der Prozessor Architektur nicht. Auf von Neumann Systemen kann man Daten als Code behandeln. AVRs haben eine strikte Harvard Architektur mit getrennten Addressräumen und Bussen für beides. Daher kann man sich nicht von irgendwo her Daten holen und diese als Code ausführen
Du musst einfach mal darüber nachdenken was ein MicroController verglichen mit einem Computer ist
und wofür er da ist.
Ein Microcontroller ist eigentlich ein kompletter kleiner Computer für ganz dezidierte Aufgaben.
Entweder reicht der Speicher den er hat, oder man hat sich für den falschen Controller entschieden.
Deswegen macht so was wie Swappen hier auch keinen Sinn.
Man kann einen Interpreter schreiben, der Token-Code wie bei Basic, Java oder FORTH interpretiert. Dann können solche "Skripte" ins RAM geladen und abgearbeitet werden.
Serenifly:
Das geht schon auf Grund der Prozessor Architektur nicht. Auf von Neumann Systemen kann man Daten als Code behandeln. AVRs haben eine strikte Harvard Architektur mit getrennten Addressräumen und Bussen für beides. Daher kann man sich nicht von irgendwo her Daten holen und diese als Code ausführen
Also sind die ESP8266 von Neumann oder was übersehe ich da? Die blenden ja Bereiche des externen Flash zur Abarbeitung in den Prozessor ein.
Tommy56:
Also sind die ESP8266 von Neumann oder was übersehe ich da?
Nein. Aber das ist auch kein einfacher SPI Bus. Sowohl die SPI Implementierung (QSPI mit XIP (Execute in Place) als auch der Prozessor sind dafür ausgelegt.
Einige ARM (alle?) können sehr wohl Code vom Flash, als auch aus dem RAM ausführen.
Damit sollte es gehen den Code auf externe Medien auszulagern.
Aber, ohne geschützte Bereiche, supervisor Konzepte, MMU, wird das keiner.... bzw, ein Wackelkandidat.
Man kann einen Interpreter schreiben, der Token-Code wie bei Basic, Java oder FORTH interpretiert. Dann können solche "Skripte" ins RAM geladen und abgearbeitet werden.
Gibt es so etwas auch für den Arduino? Oder anders gefragt: wenn der Speicherplatz nicht mehr ausreicht, was macht man dann? (Auf Mega umsteigen gilt nicht)
Da die Vorgabe sich aber auf den ATmega328 des Arduino UNO bezieht ist die Antwort. Nein geht nicht. Die Architektur des Controller läßt das nicht zu.
Wie gesagt Du könntest einen Interpreter für eine Programmiersprache oder für Maschinencode schreiben und das Programm aus einem externen Seriellen ROM/FRAM/RAM ausführen.
Das ist dann aber alles andere als schnell.
Wenn der Speicher nicht ausreicht dann kann man den Sketch Platzsparender schreiben. Vieleicht auch manuell, auf der Komandozeile, außerhalb der IDE, mit bestimmten Einstellungen auf speichersparend kompilieren.
Die Vorschläge sind alles andere als für Amateur.
Grüße Uwe
Vielen Dank für die zahlreichen Kommentare und Hinweise.
Ich habe also gelernt, dass so etwas mit dem Arduino Uno aufgrund der Architektur nicht geht. Praktisch bedeutet das für mich, dass ich beim Programmierung die Größe des Sketches im Auge behalten muss.
Lg Karl
kstanger:
Vielen Dank für die zahlreichen Kommentare und Hinweise.
Ich habe also gelernt, dass so etwas mit dem Arduino Uno aufgrund der Architektur nicht geht. Praktisch bedeutet das für mich, dass ich beim Programmierung die Größe des Sketches im Auge behalten muss.
Lg Karl
das sollte grundsätzlich so sein. Bei Controllern aber überlebenswichtig. Deshalb macht es ggf. auch Sinn, statt der Arduino-Biblotheken den Controller in nativem C zu programmieren, da das in aller Regel deutlich kleinere Hex Dateien gibt, die zu dem meist (wenn man nicht zuviel Schwachsinn programmiert hat) auch noch performanter sind als solche mit Verwendung der "Komfort-Libraries".
Es kommt auf den Einzelfall an, ob jemand Datenblätter so gut lesen und C so gut programmieren kann, daß er auf die Arduino Bibliotheken verzichten kann. Und ob er beim Umstieg auf einen anderen (größeren...) Controller alles wegwerfen und von Grund auf neu schreiben möchte.
Es gibt immernoch die Möglichkeit einen größeres Model (zB den MEGA2560) oder andere Platinen zu nehmen oder Teile des Codes auf andere Controller auszulagern und so die einzelnen Sketch kleiner zu halten.
In einem PC gibt es ja auch jede Menge CPUs/Controller, nicht nur die HauptCPU, sondern auch Grafikkarte, Tastatur ecc ecc.