Kann ich eine SD-Karte als ROM für meinen Mikrocontroller verwenden? Welche anderen Möglichkeiten gibt es, wenn ich viel ROM-Speicher (günstig) haben möchte?
Es kommt also darauf an, was du machen willst. Als allgemeine Regel gilt: Wenn Sie bereit sind, langsam genug zu laufen, können Sie tun, was Sie wollen.
Auf Mikrocontrollern (wie einem PIC- oder ATMega-Prozessor (ohne PIC32- oder Atmels ARM-Prozessoren)) haben Sie normalerweise eine Harvard-Architektur , was bedeutet, dass Code und Daten in verschiedenen Teilen des Speichers gespeichert und unterschiedlich darauf zugegriffen wird. Das heißt, wenn Sie einen Code von einer SD-Karte laden, befindet er sich im RAM und Sie können ihn ohne besondere Akrobatik nicht als Code behandeln. Sie können die geladenen Informationen in die internen Codebänke schreiben (so funktionieren Bootloader), aber im Grunde können Sie nie mehr Code laden, als Ihr Mikrocontroller für Codegrößenbeschränkungen gestartet hat. Jetzt könnten SieSchreiben Sie (mit einigem Aufwand) spezielle "Call" - und "Return" -Funktionen in Ihren Code, die im Wesentlichen Funktionen waren, die die angeforderte Adresse aus der SD-Karte laden und in die internen Codebänke schreiben und dann den neu geladenen Code aufrufen würden. Dies würde erfordern, dass jede Funktion, die Sie hätten, kleiner als die internen Codebänke wäre, aber das wäre nicht schwer. Der schwierige Teil wäre, dass dies zu einer starken Abnutzung der Codeabschnitte des Speichers in Ihrem Chip führen würde, die häufig nur für ~ 100.000 Schreibvorgänge ausgelegt sind (oder wie unten erwähnt, nur für 10.000 Schreibvorgänge!).
Auf den meisten Maschinen mit Von-Neumann-Architektur (und Hybrid-Harvard) (ARM, Mips und x86 sowie andere) sind Daten und Anweisungen austauschbar. Dies bedeutet, dass Sie viel einfacher Code schreiben können, um die Anweisungen von der SD-Karte in den RAM zu laden und dann mit der Ausführung zu beginnen. Wenn Sie nicht so viel RAM haben, wie Sie Code haben (was basierend auf Ihrer ursprünglichen Prämisse unwahrscheinlich klingt), müssen Sie immer noch einige knifflige Dinge tun, um entweder wiederholt aufzurufen, um von der SD-Karte in den RAM zu laden, genau wie Das vorherige Beispiel rief zum Laden von der SD-Karte in den Programmspeicher auf.
Wenn Sie eine Von-Neumann-Architektur haben und das Glück haben, einen Mikrocontroller mit einer Speicherverwaltungseinheit oder einer Art softwaredefiniertem Paging-Mechanismus zu haben (ich glaube, sie haben das jetzt, aber ich weiß nicht, was es ist), dann können Sie Beginnen Sie mit der Anwendung virtueller Speicherkonzepte . Sie werden den gesamten Code in den Arbeitsspeicher legen und den Code auf die SD-Karte auslagern. Dies ist sehr komplex, wenn es nicht bereits auf / in Ihrem Mikrocontroller implementiert ist, daher werde ich es nicht weiter erklären, es sei denn, Sie denken, dass dies Ihre Absicht ist (ich muss mir einige der ARM-basierten Software-Paging-Mechanismen ansehen um zu helfen). Dieser erfordert die wenigsten Änderungen an Ihrem ursprünglichen Code, erfordert aber im Wesentlichen ein Betriebssystem auf Ihrem Code, um Codepagewechsel zu handhaben.
Hoffentlich hilft das!
BEARBEITEN:
Wie viele in den Kommentaren unten erwähnt haben, ist es vielleicht am besten, einen Interpreter zu bauen, der Anweisungen von der SD-Karte abruft und sie mit Code im internen ROM ausführt. Dies funktioniert sowohl für Harvard- als auch für Von-Neumann-Architekturen, da Sie einen permanenten Code haben, der basierend auf Daten von der SD-Karte ausgeführt wird. Es gibt bereits mehrere Implementierungen davon: siehe Basic Stamp oder NanoVMfür einige Absprungpunkte. Verstehen Sie, dass dies natürlich immer ziemlich langsam sein wird. Und wenn Sie kein vorgefertigtes Beispiel dafür verwenden möchten, werden Sie dabei erwischt, wie Sie Ihren eigenen Compiler/Tokenizer sowie den Interpreter erstellen, was zu einer Menge komplizierter Fehlersuche führt. Das Gute daran ist, dass Sie, sobald alles funktioniert, Ihren Interpreter auf jede Architektur portieren können und sehr schnell einsatzbereit sind!
Obwohl es schwierig ist, damit zu arbeiten, gibt es Situationen, in denen die "Überlagerungs"-Technik, die einst in der Vergangenheit des Computers verwendet wurde, praktikabel sein könnte.
Typischerweise bestand dies darin, große Funktionsteile eines Programms explizit von der Festplatte in begrenzten RAM zu verschieben, da sie für verschiedene unterschiedliche Betriebsmodi benötigt wurden. Während sie im Vergleich zu dediziertem Programmspeicher "langsam" sind, sind SD-Karten um Größenordnungen schneller als die Diskettenlaufwerke, bei denen die Technik häufig verwendet wurde - insbesondere im Lesemodus.
Moderner virtueller Speicher ist zu einem wesentlichen Teil eine Art automatische, oft fast unsichtbare Implementierung dieser Idee – viel einfacher zu handhaben, erfordert aber Hardwareunterstützung.
Das Problem bei der expliziten Überlagerungstechnik besteht jedoch darin, dass Sie in der Lage sein müssen, Ihr Programm in verschiedene, weitgehend in sich geschlossene Teile zu unterteilen, oder zumindest in solche, die nur eine interaktive Abhängigkeit vom festen Teil des Programms haben, aber nicht voneinander. Daher wäre es eher für gelegentlich verwendete Extras, Plug-Ins usw. geeignet als für Funktionen, die ständig in schneller oder verschachtelter Folge verwendet werden müssen.
Jippie
Gustavo Litowski
Neugierig
Gustavo Litowski
David Tweed
Kit Scuzz
Gustavo Litowski
Kit Scuzz