Virtual machine zur "Harvard-Umgehung"

Gast #628018
Lesenswert?

Wie bekannt, dann ein AVR (und viele andere 8Bitter in Harvard 
Architektur) keinen Code aus dem int. SRAM ausführen.

Immer wenn man ein zusätzliches Speichermedium angeschlossen hat, wie 
z.B. eine SD-Karte mit Unmengen Speicher, ärgert mich das.

Außerdem fände ich es praktisch, wenn ich dem Kunden sagen könnte: "Für 
ein Firmware Upgrade oder Feature bla und muh laden sie die Datei 
foo.bin von der Webseite und speichern sie sie auf die SD-Karte"

Gut, ich weiß, dass man das mit einem Bootloader machen könnte.

Ich überlege aber, ob ich nicht eine kleine virtual machine schreibe, um 
so etwas zu ermöglichen. Bei könnte der "RAM" und "ROM" zugriff auch 
gleich komplett abstrahiert sein, sodass man ein Programm z.B. direkt 
von der SD-Karte ausführen kann.

Ich denke da nicht an eine "Komplettlösung" wie NanoVM, die eine Menge 
Programmspeicher braucht sondern quasi als Plugin-Schnittstelle.

(Ich hab auch schon mal eine VM für was anderes geschrieben, das ist 
also nicht das Problem. Der Assembler dafür schon eher, ein richtiger 
Compiler wäre natürlich super, der Aufwand explodiert aber.)

Was denkt ihr so dazu? Bzw. welche Features (im Sinn von Instruktionen, 
Registern) würdet ihr begrüßen?
Gast #628043
Lesenswert?

wie wäre es mit einer scriptsprache? hab noch nie sowas probiert und 
weiß auhc nicht ob sich ein lexer und parser auf der speichergröße 
implementieren lassen. Aber zum beispiel perl oder ähnliches? die CPU 
treibt nur die SD karte, den lexer und parser für das script und führt 
dieses aus. Ganz grobe idee also bitte nicht umbringen :).
Gast #628055
Lesenswert?

du hast recht. naja ich hab auch schon mehrfach über sowas nachgedacht 
aber VM und skriptsprache scheinen die einzig guten lösungen zu sein. 
Ein bootloader gefällt mir auch nicht besonders. Ich hatte mal vor einen 
mini Computer auf avr basis zu designen aber das scheiterte genau an 
dieser geschichte. Die von Neumann rechner haben da klar ihre vorteile, 
für mich zumindest.
Gast #628064
Lesenswert?

Dann ist das wohl der Zeitpunkt, an dem man sich einen Prozessor mit von 
Neumann-Architektur auswählen sollte. Mir ist durchaus klar, dass ein 
AVR für viele Dinge ausreicht, aber solche Klimmzüge? Nein. Das schreit 
z.B. nach MSP430 oder ARM. Oder eben auf dieses Feature verzichten, weil 
ein AVR dafür einfach nicht ausgelegt ist.
#628065
Lesenswert?

Wie dynamisch gedenkst du das alles denn zu erstellen? Ich persönliche 
würde für einen Mikrocontroller ja eher die Variante bevorzugen, das 
Programm jeweils mit dem Inhalt einer Datei überschreiben zu lassen und 
dieses dann nativ ausführen zu lassen. Also so wie du es oben 
beschrieben hast. Das muss ja nicht auf Firmware-Upgrades beschränkt 
sein, bei etwa 10'000 Erase/Write-Zyklen vom Flash lässt sich das 
Programm ja schon einige Male ändern.
Eine komplette VM zu implementieren, die den Code nur interpretiert 
halte ich für weniger sinnvoll, das wird auf einem Mikrocontroller 
dieser Grösse doch einfach zu langsam. Ausser man will etwas in der Art 
einer SPS oder so.
Gast #628076
Lesenswert?

Im Moment siehts eher so aus, als ob es doch ein Bootloader werden 
würde.

Erstens, weil es interpretiert erheblich langsamer wird (das lezte mal 
als ich sowas gemacht hatte, hatte ich ca 1:50. War aber auch nicht sehr 
optimiert.) und 2. weil der Aufwand enorm ist.
Gast #628089
Lesenswert?

Hi, wiesi,

wie bewertest Du Forth in dieser Sache?

Ich spiele für meine Projekte immer wieder mal mit dem Gedanken, Forth 
einzusetzen, zumal sich die Geschwindigkeiten in Grenzen halten.
Aber jedesmal entscheide ich mich dann doch, mit den alten Sourcen 
Puzzle zu spielen und setze sie neu zusammen.

Meine Anwendungen programmiere ich mkit JTAG-ICE, aber in Deiner 
Situation (Kunden, große Programme, nachladbar), da wachsen die Chancen 
einer Interpretersprache wie Forth gegenüber einer Compilersprache.


Cioa
Wolfgang Horn
Admin Persönliche Seite #628124
Lesenswert?

Schau dir mal Lua an. Ob der AVR reicht weiß ich jetzt nicht auswendig, 
aber auf kleinen ARMs wurde das schon erfolgreich implementiert. Wenn 
man die Highlevel-Funktionen des Interpreters nutzt und nicht alles zu 
Fuß macht muss das Programm nicht viel langsamer sein als ein 
kompiliertes, und man kann auch einfach eigene C-Funktionen einbinden.

Für ein Firmware-Update, wo ja i.d.R "alles" austauschbar sein soll, ist 
ein Bootloader aber die bessere Wahl.
Gast #628214
Lesenswert?

An das habe ich auch schon gedacht. Das Problem ist, dass laut ARM-Lager 
der Lua interpreter (ohne bytecode compiler) ca. 25-60k braucht. Ok. Auf 
den größeren AVRs wäre das drin, aber da ist man auch schon wieder weit 
weg von "klein".
Das größere Problem scheint RAM zu sein.

@Wolfgang ich kenne zwar Forth ganz grob, muss es mir bei Gelegenheit 
mal näher ansehen.

Im Moment ist das Ganze so realisiert: Das Gerät ist quasi eine 
Ablaufsteuerung. Momentan ist da schon ein "Interpreter" drauf, der aber 
nur ganz einfachen linearen Code der Reihe nach durchsteppt. 
Wahrscheinlich wird das auch genügen.

Für den Fall, dass es nicht genügen sollte, habe ich mir eben den Kopf 
zerbrochen, weil ich gerade Zeit habe.

Ich bin zum Schluss gekommen, dass es, wenn die Momentane Lösung nicht 
ausreicht wahrscheinlich ein abgespeckter PIC14 Befehlssatz+Assembler 
werden wird.
Das werde ich aber erst bei Bedarf machen.

Soweit danke für Eure Vorschläge.
Gast #628366
Lesenswert?

Ich habe auch mal eine Anwendung mit AVR gehabt, die eine 
programmierbare Ablaufsteuerung beinhaltete. Der Code für die 
Ablaufsteuerung sollte über die serielle Schnittstelle nachzuladen sein. 
Ich habe dazu eine virtuelle Maschine programmiert. Als Assembler für 
die VM benutze ich den IAR Assembler, der selbstdefinerte Makros in 
Binärcode übersetzt. So kann man sich auch komfortable Befehle 
definieren. Dieses Verfahren hat sich gut bewährt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren