Führen Sie Anweisungen aus dem RAM in einem hobbyfreundlichen Mikrocontroller aus

12

Eines meiner Projekte würde sehr davon profitieren, ein Programm ausführen zu können, das nicht im Mikrocontroller gespeichert ist (sondern auf einer SD-Karte gespeichert ist).

Ich suche also ein Gerät, mit dem ich den Code von der SD-Karte in den RAM laden und dann den Code aus dem RAM ausführen kann. Momentan habe ich nur den Programmierer, der mit dem PicKit2 geliefert wird, daher würde ich es vorziehen, bei PICs zu bleiben.

Weiß jemand, welche PICs dies tun können? Wenn keine PICs dazu in der Lage sind, welche unterschiedlichen Mikrocontroller würden dafür funktionieren? Vorzugsweise solche, die in einer mit Steckbrettern kompatiblen Verpackung erhältlich sind.

Ponkadoodle
quelle
2
huh? ... wofür genau musst du von ram ausführen? und was meinst du mit "statisch"? Sie versuchen nicht wirklich, selbstmodifizierenden Code zu schreiben, oder? Sprechen Sie über den Mangel an dynamischer Speicherzuordnung? aka kein malloc?
Mark
2
@Mark Ich möchte ein Programm von einem externen Gerät wie einer SD-Karte laden und ausführen können. Ich werde versuchen, es in meinem Beitrag besser zu erklären.
Ponkadoodle
2
gotcha, das einzige PIC, von dem ich weiß, dass es dies erlauben würde, ist ein PIC32. Es sei denn, Sie machen etwas Verrücktes wie das Kopieren von der SD-Karte auf den Flash, was bei häufigem Umschalten der Programme sehr schnell zu Flash-Zyklen führt. Die meisten kleinen 8/16-Bit-uC sind stark zwischen Daten- (RAM) und Programm- (Flash) Speicherbereich segmentiert und erlauben es dem Programmzähler nicht, RAM zu adressieren (Harvard-Architektur, kein Speicherschutz usw.).
Mark

Antworten:

5

Es gibt einige PICs, mit denen Sie externen Programmspeicher hinzufügen können. Ich habe das noch nie gemacht, aber die Application Notes AN869 und AN778 enthalten weitere Informationen zum Implementieren des externen Speichers.

Daniel Grillo
quelle
11

Eine andere Option, die Sie in Betracht ziehen sollten, ist die Verwendung einer interpretierten Sprache für Ihre auf der SD-Karte gespeicherten Programme. Auf diese Weise führt der Prozessor den von der Karte gelesenen Maschinencode nicht aus, sondern behandelt ihn nur als Daten.

Dieser Ansatz gibt Ihnen Flexibilität auf Kosten der Geschwindigkeit.

Es stehen zahlreiche Optionen zur Auswahl: Übersicht über hochrangige Sprachinterpreter / Compiler für Mikrocontroller

Toby Jaffey
quelle
1
Rollen Sie Ihr eigenes DSL. Diese Option spricht mich am meisten an.
Amos
6

Wie bereits erwähnt, können PICs (außer dem PIC32) dies nicht. Sie müssen wahrscheinlich zu den größeren Prozessoren einer Familie oder zu einem Prozessor mit externem Speicherbus gehen, da die meisten Mikrocontroller nur über sehr begrenzte RAM-Ressourcen verfügen.

Die MSP430-Prozessoren können Code aus ihrem RAM-Speicher ausführen, aber Sie benötigen so etwas wie den F5438 mit 16 KB RAM-Speicher - das Ausführen von Code in 128 Byte ist eigentlich keine Option!

Wenn ein Prozessor über einen externen Bus verfügt, können Sie RAM in den Codebereich stellen. Möglicherweise müssen Sie eine zusätzliche Logik hinzufügen, um den RAM in zwei Speicherbereiche abzubilden, wenn die Prozessorarchitektur das Schreiben von Daten in den Ausführungsspeicher nicht zulässt.

Ich habe Code aus dem RAM in einem 8051-basierten System ausgeführt, aber das bedeutete, dass der RAM zum Programmieren in den EXTERN-Speicherbereich und zur Ausführung wieder in den CODE-Bereich gemappt werden musste. Das Lade- / Überwachungsprogramm übernahm das Umschalten und Laden der Speicherbank. Bitte fragen Sie nicht nach dem Code - ich habe das vor ungefähr 30 Jahren gemacht und es ist längst verloren (und in PL / M-51 geschrieben)

uɐɪ
quelle
5

Keiner der PICs für den unteren und mittleren Bereich kann aufgrund ihrer Speicherarchitektur aus dem RAM ausgeführt werden.

Jede ARM-basierte CPU sollte vom RAM ausgeführt werden. Obwohl sie in der Regel in smd-Paketen vorliegen, gibt es einige DIP-Module, in denen der Mikrocontroller bereits geladen ist. Schauen Sie sich zum Beispiel das mbed oder LPCXpresso an. Beide kommen entweder mit einem Bootloader oder beim LPCXpresso mit einer Debug-Schnittstelle und kostenlosen Compilern.

Wenn Sie lieber bei einfachen 8-Bit-Mikros bleiben möchten, ziehen Sie vielleicht etwas aus der freescale HCS08-Familie in Betracht. Diese können aus dem RAM ausgeführt werden und es gibt eine Code-beschränkte Version des Codewarrior-IDE- und C-Compilers, die kostenlos verfügbar ist.

Ich bin mir ziemlich sicher, dass der MPS430 dies auch kann, aber ich habe es nie selbst gemacht.

Clint Lawrence
quelle
Das mbed empfängt tatsächlich Binärdateien, indem sie auf das eingebaute Flash-Laufwerk kopiert und anschließend zurückgesetzt werden. Es wird als Flash-Laufwerk angezeigt, wenn es an den USB-Anschluss eines Computers angeschlossen ist. Wenn Sie eine Methode ausarbeiten können, um entweder das Flash-Laufwerk anstelle der SD-Karte zu verwenden oder es so einzurichten, dass eine Binärdatei von der SD-Karte automatisch auf das Flash-Laufwerk kopiert und ein Reset durchgeführt wird, haben Sie möglicherweise Glück. Das mbed benötigt keinen Hardware-Programmierer.
Amos
5

Der Propeller lädt sein Programm von einem externen Speicher.

joeforker
quelle
1
Normalerweise ist der Propeller - Chip wird von einem 32K EEPROM gebootet (24LC256), aber hier ist ein Weg , um Boot von einer SD - Karte statt: gadgetgangster.com/news/45-designer-news/...
tcrosley
3

Ich erinnere mich an einen Bootloader für AVRs, der den Chip mit einer .hex-Datei (vermutlich) von einer SD-Karte erneut flashen würde. Ich kann die Originalquelle nicht finden, aber diese Google-Suche liefert einige interessante Treffer. Ja, ich weiß, dass dies AVR und nicht PIC ist, aber Sie werden es vielleicht nützlich finden, wenn die PIC-Sache nicht funktioniert.

Blalor
quelle
+1 für PIC-Bootloader .
Davidcary
3

Wie andere Poster angemerkt haben, können Sie auf einem 8- oder 16-Bit-PIC keine Ausführung aus dem RAM ausführen, da sie eine Harvard-Architektur verwenden (separate Code- und Datenbereiche). Ob es sinnvoll ist, ein Programm von einer SD-Karte zu laden und in den Codespeicher zu flashen, hängt davon ab, wie oft Sie dies tun.

Wenn Sie versuchen, eine dynamische Umgebung wie ein Betriebssystem zu erstellen, das Programme ständig überlagert, dann nein. Aber in meinem Fall habe ich ein Programm, das Treiber nach Bedarf von einer 2 GB SD-Karte lädt. Der PIC24FJ256GB110 hat ein Minimum von 10.000 Lösch- / Schreibzyklen. Selbst wenn dies fünfmal pro Tag gemacht würde, würde der Blitz mindestens 5 1/2 Jahre dauern.

(Hinweis: Die Zahl 10.000 ist ein Minimum. Die typische Lebensdauer von Lösch- / Schreibzyklen kann das Fünffache betragen. Wenn Sie also eine Entwicklung durchführen, können Sie einen Prozessor wahrscheinlich 140 Mal am Tag neu flashen - alle 3 1/2 Minuten für acht Stunden - und es könnte noch ein Jahr dauern.)

Tcrosley
quelle
2

An meiner Schule haben wir HC11- oder HC12-Prozessoren mit externem RAM zum Laden und Ausführen von Programmen verwendet ... aber ich habe den Namen der Boards / Kits vergessen :( Auf jeden Fall adressieren Freescale HC (S) -Line-MCUs RAM und ROM identisch , so können Sie Code in den Arbeitsspeicher laden und ausführen.

Wenn Sie eine Warteschlange blalorlöschen, ist es möglicherweise die beste Lösung, einfach eine Schaltfläche auf Ihrem Board hinzuzufügen, mit der Sie den PIC anhand der auf einer SD-Karte gespeicherten Daten aktualisieren können, die Sie mit einem Bootloader einlegen. Ich kann mir nicht vorstellen, was nicht auf die größeren PICs passen würde. Wenn Sie statische Daten (Grafiken, Text, Sound) haben, bewahren Sie diese auf einem externen Speicher auf.

Nick T
quelle
1

Sie können wahrscheinlich keine Zuweisung aus dem RAM vornehmen, aber für Ihre Anwendung ist möglicherweise ein kleiner Flash-Loader verfügbar, der die Daten der SD-Karte in den restlichen Flash-Speicher einliest. Ich habe diesen Ansatz mit einem SPI-gesteuerten Flash-Chip verwendet, um zu ermöglichen, dass Firmware von einer drahtlosen Verbindung geladen und dann installiert wird, sobald sie vollständig empfangen wurde. Ich kann mir keinen bestimmten Grund vorstellen, warum es mit einer SD-Karte nicht funktioniert, obwohl ein SD-kompatibler Bootloader möglicherweise etwas Platz in Anspruch nimmt.

Superkatze
quelle
Ich habe etwas Ähnliches für ein Gerät gemacht, das ein paar geringfügig unterschiedliche Firmwares und Zwecke hatte: Schreiben Sie alle Dateien auf einen externen SPI-Flash (der in sehr viel größeren Größen als die meisten Mikrocontroller verfügbar ist), und führen Sie mit einem der Images einen Neustart des Controllers durch mit dem Bootloader, wenn beim Zurücksetzen eine Taste gedrückt wird.
Kevin Vermeer
0

Nicht wenige Mikrocontroller lassen Sie dies tun, klingt wie nicht das Bild. was Sie tun möchten, ist ein Bootloader, der SPI verwendet, um von der SD-Karte zu lesen, das Programm zu kopieren, das wahrscheinlich einen bekannten oder fest codierten Dateinamen haben möchte, wahrscheinlich im Stammverzeichnis, diese Datei in RAM zu analysieren und dann zu verzweigen das programm im ram. Mit den ARM-basierten Controllern können Sie auf jeden Fall so etwas tun.

Eine Alternative wäre, den Bootloader die SD-Karte über SPI lesen zu lassen und statt auf RAM zu kopieren und auf einen Teil des Flashs zu brennen. Möglicherweise möchten Sie eine Taste haben, wenn die Taste beim Einschalten oder Zurücksetzen gedrückt wird, und dann ein neues Programm von der SD-Karte laden. Wenn die Signatur oder Prüfsumme auf diesem ladbaren Teil des Flashs gut aussieht, verzweigen Sie beim Booten zu diesem Teil des Flashs. Oder wenn die SD-Karte vorhanden ist, laden Sie sie, andernfalls verzweigen Sie in den ladbaren Teil des Flashs. Kann diese Methode mit armbasierten und avr-basierten, möglicherweise sogar pic-basierten, aber meine pic-Erfahrung ist veraltet. msp430 würde ich auch annehmen. Grundsätzlich gilt: Wenn Sie Teile des Flashs, die Sie ausführen, vom Mikrocontroller-Prozessor selbst aus neu programmieren können,

Oldtimer
quelle
Hmmm, eigentlich habe ich keinen avr vom avr programmiert, sorry das war über seriell von einem host. Ruft eine dritte Lösung auf, bei der viele billige Hobby-Boards ... zwei Mikrocontroller verwenden. In diesem Fall würde man das andere im Reset-Modus halten, die SD-Karte lesen, das andere Mikro über serielle oder andere programmieren und dann den Reset-Modus auf dem anderen Mikro freigeben. Die Hobby- / Evaluierungskarten haben oft ein Mikro für die USB-Schnittstelle und es wird normalerweise mit dem anderen verbunden.
old_timer