Hi, mir ist da eine eventuelle blöde Idee gekommen: Ob man teile eines
Programms irgendwie ins RAM eines Attiny bzw. ATmega verschieben kann
und dort laufen lassen kann? Mir ist klar, es macht eventuell wenig Sinn
weil die Attinys haben nur wenig RAM und es läuft da auch nicht
schneller. Mir geht es nur um's Prinzip, wie würde man das Verschieben
machen? Und wie würde man das Programm/die Funktion im RAM dann
anstarten?
Schwimmbadpinkler schrieb:> Hi, mir ist da eine eventuelle blöde Idee gekommen: Ob man teile eines> Programms irgendwie ins RAM eines Attiny bzw. ATmega verschieben kann> und dort laufen lassen kann?
Wenn du nicht gerade einen Interpreter schreibst, der sich sein Programm
aus dem SRAM holt, dann ist die Antwort ein klares 'nein'. Genau das ist
der Sinn einer Harvard Architektur mit getrennten Adressräumen, dass
genau das nicht möglich ist und sich ein Programm nicht durch gewollte
und ungewollte Programm-'features' selbst verändern kann.
Nein, das geht beim ATmega nicht. RAM und Flash werden unterschiedlich
angesprochen, Programmcode aus dem RAM ist von der Architektur her nicht
möglich.
Viele Grüße, Stefan
Stefan schrieb:> Programmcode aus dem RAM ist von der Architektur her nicht> möglich.
auch nicht wenn er durch eine Routine den Code im Flash verändert?
mir ist so als wenn Bootloader den flash ändern können, gleichwohl
könnte ich Programmcode im RAM haben, ok etwas kontruiert, aber
unmöglich?
Joachim B. schrieb:> Stefan schrieb:>> Programmcode aus dem RAM ist von der Architektur her nicht>> möglich.>> auch nicht wenn er durch eine Routine den Code im Flash verändert?
Ich würde das allerdings jetzt eher als 'gewolltes Hintertürchen' sehen.
Die einzuhaltenden Auflagen, damit das auf einem AVR möglich ist sind
dergestalt, dass man das sicherlich nicht als 'regulären
einzuschlagenden Weg' in 08/15 Programmen sehen kann.
> könnte ich Programmcode im RAM haben, ok etwas kontruiert, aber> unmöglich?
Von der Sache her hast du natürlich recht. Möglich ist es über Umwege
Code aus dem RAM zur Ausführung zu bringen, wenn auch nicht direkt.
Trotzdem würde ich es mehr als notwendiges Übel ansehen, denn als
Feature einer Architektur.
Joachim B. schrieb:> Stefan schrieb:>> Programmcode aus dem RAM ist von der Architektur her nicht>> möglich.>> auch nicht wenn er durch eine Routine den Code im Flash verändert?>> mir ist so als wenn Bootloader den flash ändern können, gleichwohl> könnte ich Programmcode im RAM haben, ok etwas kontruiert, aber> unmöglich?
nein. Die CPU lädt ja selbstständig den nächsten Befehl und das macht
sie bei dem Atmel nur vom Flash.
Man müsste dafür die CPU um verdrahten.
Karl Heinz schrieb:> Von der Sache her hast du natürlich recht. Möglich ist es über Umwege> Code aus dem RAM zur Ausführung zu bringen.
Zur Ausführung bringen kannst du den Code wirklich nur aus dem Flash.
Aus dem RAM geht nicht. Wenn man den Vorschlag von Joachim ansiehr,
möchte er den Code ja von RAM in den Flash laden und dann im Flash
ausführen.
Im RAM kannst du ihn auf keinen Fall ausführen.
Nein, auch der Bootloader läuft im Flash. Der ATmega kann seine Opcodes
nur aus dem Flash laden. Natürlich gibt es Möglichkeiten, das Flash aus
dem Programmfluss heraus zu ändern (dafür gibt es einen speziellen
Opcode). Aber dieser Opcode wird wiederum NUR aus dem Flash heraus
ausgeführt.
Schau Dir mal den Wiki-Eintrag an, da ist das ganz gut erklärt:
http://de.wikipedia.org/wiki/Harvard-Architektur
Viele Grüße, Stefan
Schwimmbadpinkler schrieb:> Ob man teile eines> Programms irgendwie ins RAM eines Attiny bzw. ATmega verschieben kann> und dort laufen lassen kann??!? schrieb:> Zur Ausführung bringen kannst du den Code wirklich nur aus dem Flash.Stefan schrieb:> Nein, auch der Bootloader läuft im Flash. Der ATmega kann seine Opcodes> nur aus dem Flash laden.
ist klar habe ich auch verstanden, im RAM läuft nix, aber das heisst
nicht das Code aus dem RAM nicht zum Laufen gebracht werden kann ;-)
Also Du meinst:
* Code von irgendwoher (Schnittstelle ..) ins RAM laden
* Code vom RAM ins Flash kopieren
* den kopierten Code im Flash starten
Ja das geht.
Genauso funktioniert ja auch der Bootloader.
Viele Grüße, Stefan
Joachim B. schrieb:> ist klar habe ich auch verstanden, im RAM läuft nix, aber das heisst> nicht das Code aus dem RAM nicht zum Laufen gebracht werden kann ;-)
:-)
mit derselben Argumentation könnte man allerdings dann auch sagen, dass
ein AVR Code von einem Barcode ausführen kann.
:-)
Karl Heinz schrieb:> mit derselben Argumentation könnte man allerdings dann auch sagen, dass> ein AVR Code von einem Barcode ausführen kann.> :-)
richtig... Oder von der Festplatte. Nichts anderes machst du ja, wenn du
den µC über ISP programmierst. Deswegen kann man ja auch nicht sagen:
"mein µC führt sein Programm von der Festplatte aus". :-)
Irgendwo muß man mal eine Grenze setzen. Und die ist für mich beim Wort
"ausführen" erreicht. Ausführen kann man den Code nur vom Flash. Woher
man den Code und über welchen Weg in den Flash befördert, ist doch nicht
von Belang. Ausgeführt wird er nur aus dem Flash heraus.