Gibt es eine Möglichkeit, Binärcode aus dem RAM auszuführen?

8

Ich bin auf der Suche nach einem kostengünstigen Einplatinencomputer, den ich in Assemblersprache programmieren und mit begrenzten Möglichkeiten den Objektcode von einem PC und einfachen E / A-Peripheriegeräten laden kann.

Idealerweise möchte ich in angemessener Zeit den gesamten Code auf der Maschine selbst schreiben können. Ich möchte kein Betriebssystem im Weg haben, da ich ein Programm haben möchte, das Code in den RAM schreibt und dann verzweigt, um ihn auszuführen. Arduino wäre wahrscheinlich meine beste Wahl, was die für die Assembly-Programmierung geeignete Systemvereinfachung betrifft, aber es hat eine Harvard-Architektur und erlaubt mir nicht, aus dem RAM auszuführen.

Vor Jahren verwendete ich eine 8-Bit-CPU mit Von Neumann-Architektur, die die Ausführung an eine beliebige Adresse verzweigen konnte, unabhängig davon, ob sie ROM, RAM oder was auch immer zugeordnet war. Das möchte ich jetzt tun.

Ich könnte wahrscheinlich einen Interpreter von im RAM geschriebenen Operationscodes in den Flash-Speicher schreiben und laden, aber es ist eine sehr komplexe und zeitaufwändige Lösung, es sei denn, es gibt bereits virtuelle Maschinen dieser Art.

Irgendwelche Vorschläge zu anderen Problemumgehungen mit Arduino oder anderen Mikrocontrollern, die ich möglicherweise verwende?

Vielen Dank!

Pierre

Pierre
quelle
3
Der PIC32 ist ein Architekturchip von Princeton (Von Neumann). Da es sich um eine MIPS-CPU handelt, ist sie gut dokumentiert und standardisiert, jedoch etwas komplexer als ein niedriger AVR. Die ChipKIT-Boards mögen Ihnen vielleicht besser gefallen.
Majenko
2
Obwohl die ARM Cortex-M-Serie als Harvard-Architektur optimiert ist, kann sie mit einem tolerierbaren Effizienzverlust aus dem RAM ausgeführt werden und wäre dabei immer noch viel schneller als ein AVR. Mindestens ein halbes Dutzend Chiphersteller bieten auf der Grundlage der Lizenzierung dieses Kerns weit verbreitete Angebote an, und während viele Benutzer Anbieter- und / oder Semi-Standard-Bibliotheken verwenden, ist es durchaus möglich, dies anhand der Datenblätter selbst zu tun. Ich habe mich zuerst für STM32 entschieden, da die Discovery-Boards sehr billig sind, unter Linux / OSX mit Open-Source-Tools arbeiten und Chips auf benutzerdefinierten Boards programmieren können, aber jetzt auch Kinetis verwendet haben.
Chris Stratton
Die Hauptfrage ist warum? Warum benötigen Sie eine ASM-Ausführung aus dem RAM? Und welche Art von Baugruppe möchten Sie verwenden? Da jede Architektur ihre eigene Sprache hat ... Tun Sie dies zu Lernzwecken? Oder haben Sie ein bestimmtes Ziel?
frarugi87
2
Ich bin anderer Meinung, warum ich dies tun wollte, ist für die Frage, die ich damals gestellt habe, irrelevant, da dies keine Problemumgehung für ein anderes Problem darstellt. Im Übrigen habe ich Majenkos Rat befolgt und habe derzeit eine Uno32 plus externe Schnittstelle, die Assembly ausführt (und C-Funktionen von Assembly aus aufruft), ihren eigenen modifizierten ASM-Code in den RAM schreibt und ausführt.
Pierre
Viertens ist was Sie suchen :)
Mikael Patel

Antworten:

1

Meiner Meinung nach ist die Idee des Dolmetschers viel praktikabler. Der Begriff, im Assembler Code zu schreiben, der selbst Maschinencode im RAM generiert und dann ausführt, ist selbst unglaublich komplex.

Sie haben nicht gesagt, warum Sie dies tun möchten, daher ist dies ein XY-Problem .

Ich will kein Betriebssystem im Weg ...

Die normalen Arduinos haben kein Betriebssystem im Weg - im Grunde wird der Code, den Sie schreiben, auf den Chip geladen.

Nick Gammon
quelle
2
Mit einem Wort, nein. Die Unfähigkeit, modifizierbaren Speicher auszuführen, ist heutzutage eine eher ungewöhnliche Einschränkung, bei der die meisten anderen nominell Geräte mit Harvard-Architektur modifiziert werden, um diese Einschränkung zu vermeiden. Das Schreiben eines Software-Interpreters ist viel aufwändiger und weniger effizient als der Umgang mit einem der vielen kostengünstigen, leistungsstarken und benutzerfreundlichen Chips, die über die erforderlichen internen Verbindungen verfügen, um einfach Code aus dem RAM auszuführen. Der etwas weniger effiziente Pipeline-Betrieb in diesem Modus ist der Software-Interpretation noch weit voraus.
Chris Stratton
1
Nein. Wenn Sie Laufzeitcode ändern möchten, ist es weitaus einfacher, Maschinencode direkt zu generieren als Code auf hoher Ebene zu generieren, und Sie müssen auch einen Compiler oder Interpreter wie in Ihrer Empfehlung erstellen. Es könnte sich lohnen, einige Zeit mit dem Schreiben von Anweisungen zu verbringen, um eine Perspektive zu erhalten. Und nein, "Schreiben Sie den gesamten Code selbst auf die Maschine" bezieht sich zunächst nicht auf die Generierung von Laufzeitcode, sondern lediglich auf die Erstellung von Originalarbeiten, anstatt sich auf andere Autoren zu verlassen, um Komponenten zu unterstützen.
Chris Stratton
1
Hier ist eine einfache Shell im vierten Stil für das Arduino, die Code aus einem der Speicherspeicher (SRAM, EEMEM, EEPROM) ausführt. Nicht der schnellste Interpreter, zeigt jedoch, wie der Befehlsabruf (Speicherzugriff) und der Befehlszeiger (Aufruf- / Rücksprungadressen) abstrahiert werden können. github.com/mikaelpatel/Arduino-Shell
Mikael Patel
1
Ich bin beeindruckt, Mikael. Ich habe vor Jahren einen Forth-Dolmetscher für den Apple II geschrieben. Ich bezweifle, dass ich heutzutage überhaupt den Code finden kann. Guter alter Forth, noch am Leben und munter! :)
Nick Gammon
1
@ NickGammon Ich habe kürzlich eine traditionellere vierte virtuelle Maschine (fvm) für das Arduino geschrieben. Es ermöglicht das Einbetten eines Bytebefehlsinterpreters in eine Arduino-Skizze, da es sich um Multitasking handelt (ermöglicht die Ausbeute des fvm). github.com/mikaelpatel/Arduino-FVM . Es gibt einen Token-Compiler (läuft auf dem Arduino :) und einen traditionellen vierten interaktiven Interpreter. Bitte beachten Sie die Beispielskizzen.
Mikael Patel