SD-Karte als ROM-Speicher in einem Mikrocontroller

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?

kurze Antwort Ja. Etwas längere Antwort: Die meisten Mikrocontroller können aufgrund ihrer Harvard-Architektur kein Programm darauf ausführen.
Es hängt davon ab, was Sie mit ROM meinen. Meinen Sie nur etwas Speicher, den Sie lesen und nicht ändern, oder meinen Sie RAM, auf das die CPU zugreift? Wenn Sie nur nach etwas Speicher suchen, um Daten zu platzieren, dann ja, SD-Karten können als solche fungieren, aber ihre Geschwindigkeit wird bei weitem nicht der Geschwindigkeit entsprechen, die der Speicher bieten kann, der der CPU am nächsten ist.
@ gl3829 Ich möchte, dass eine billigste Methode ein zusätzliches ROM hat, in dem ich das auszuführende Programm speichere.
Die Verwendung einer SD-Karte ist sehr aufwendig (fast unmöglich), da Sie den Programmcode in den Speicher des Mikrocontrollers einlesen müssen. Bedenken Sie, dass Sie viel Zeit damit verbringen werden, dies zum Laufen zu bringen, und da Zeit Geld ist, besteht die billigste Alternative darin, einfach einen größeren Mikrocontroller zu kaufen oder den Code so zu optimieren, dass er passt. Außerdem wird diese Methode dazu führen, dass die Ausführung leidet, je nachdem, wie viele Überweisungen Sie benötigen und wie schnell sie durchgeführt werden können. Können Sie eine Vorstellung von der Größe geben, die Sie in Bezug auf den Speicherplatz des Programmcodes benötigen?
Was für ein Mikrocontroller?
@ gl3829 Ich denke, "an der Grenze zum Unmöglichen" ist eine Übertreibung. Dies ist sowohl in C als auch in Assembler sehr machbar, obwohl es definitiv nicht trivial ist. Auf jeden Fall wird die Ausführungsgeschwindigkeit ernsthaft beeinträchtigt, und es werden etwa 512 Bytes RAM benötigt, um bei jedem Aufruf / jeder Rückgabe, die an die Karte geht, frei zu sein, aber möglich. Hängt davon ab, wie verrückt er sein will! (Ich grabe gerade den verrückten Aspekt aus >: D)
OK. Vielleicht bin ich zu weit gegangen, es als unmöglich zu bezeichnen :D Der OP wollte etwas sehr Billiges. Mit der Zeit ist dies eines dieser Dinge. Ich habe in der Vergangenheit ähnliche Dinge getan, und es lohnt sich normalerweise nicht, außer in einigen sehr speziellen Fällen.
Ich stimme zu, dass es sich wahrscheinlich nicht lohnt!

Antworten (2)

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!

Ein Dolmetscher-ähnliches Setup wird mit Harvard funktionieren. Pseudocode kann von SD geladen und vom Interpreter im ROM ausgeführt werden.
@jippie Huch! Ja, das stimmt definitiv und ich habe es schon einmal gesehen, obwohl ich nicht sicher bin, ob ich es jemals in einem ernsthaften Zusammenhang empfehlen würde ...
Ich denke, 8051-Chips sind hier eine Ausnahme. Bitte bestätige meinen Kommentar.
Es gibt mehrere funktionierende/kommerzielle Module, die interpretierte Sprache auf einem µC ausführen; zum Beispiel der "Basic Stamp" oder der "C-Control" .
@HannoBinder Ich habe Ihren ersten Punkt zur begrenzten Anzahl von Schreibvorgängen direkt in der Antwort explizit gemacht! Ich sagte 100.000, aber das ist vielleicht nicht ganz richtig. Was Ihren zweiten Punkt betrifft: Ja, das ist definitiv wahr, sie sind nur langsam und das Schreiben eines eigenen Interpreters ist immer noch eine große, entmutigende Aufgabe (und in meinem Kopf stellte ich mir auch vor, etwas Größeres als diese zu schreiben). Ich nehme an, so etwas wie das Nehmen eines einfachen Stempels und das Ändern, um einen Strom von Anweisungen von einer SD-Karte aufzunehmen, wäre wahrscheinlich nicht allzu schwierig und definitiv einfacher als einige der Dinge, die ich vorgeschlagen habe ...
@sandundhammika Ich verstehe deinen Kommentar nicht. Und Ausnahme wovon?
@KitScuzz: Entschuldigung, ich muss diesen Teil Ihrer Antwort überlesen haben. Ich lösche diesen Kommentar :)
Natürlich würde man vor dem Speichern auf der SD-Karte die interpretierte Sprache in einen "Bytecode" "kompilieren", der vom µC leicht interpretiert werden kann. Ich nehme an, die kommerziellen Module machen das genauso. - Für die Aufführung würde man dann nur nicht zeitkritische Logik an den Dolmetscher delegieren, während andere Aufgaben „nativ“ erledigt werden.
@HannoBinder - Ich weiß nicht, wie die jüngsten Lösungen das gemacht haben, aber frühe BASICs neigten zur Tokenisierung - dh sie wurden vorparst, aber nicht wirklich kompiliert. Zum Teil, weil sie interaktiv waren, dh man konnte sich auf dem Gerät weiterentwickeln und sofort Aussagen treffen.
Oh, und es gibt die NanoVM , die alles bietet, was für einen vereinfachten Java-Interpreter benötigt wird.
Ich denke, 8051 ist nicht Ihre Harvard-Architektur
@ChrisStratton Ja, an diese Zeiten erinnere ich mich auch... :)
@sandundhammika Wikipedia scheint darauf hinzudeuten, dass der 8051 ein Harvard-Architektur-Chip ist.
@ChrisStratton / HannoBinder Sobald wir an dem Punkt angelangt sind, an dem Sie entweder Ihren eigenen Compiler / Tokenizer erstellen, nehme ich an, dass Sie für die meisten Projekte den Bereich der Vernunft überschritten haben! Davon abgesehen ist es ein guter Rat, ich werde ihn der Antwort hinzufügen.

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.

Dies erfordert auch, dass Sie über eine "Hybrid-Harvard"- oder Von-Neumann-Architektur verfügen. Mit einem Standard-PIC oder ATMega (Harvard-Architektur) können Sie keinen Code aus dem RAM ausführen!
Das versteht sich eigentlich von selbst. Obwohl Sie es technisch gesehen könnten, mit einer virtuellen Maschine oder einem Dolmetscher, wie ich jetzt sehe, haben andere erwähnt.