Hallo zusammen, ich versuche nun seit einigen Tagen zu verstehen, ob ein
Von Neumann-µC grundsätzlich immer in der Lage ist, Code aus einem
externen RAM auszuführen. Kann mir da jemand weiterhelfen?
Was ich nämlich nicht kapiere ist folgendes: Die 8051-Serie (mal
unabhängig davon, ob nun von Neumann oder nicht) kann Code aus einem
externen ROM (und so wie ich das verstanden hab mit Tricks auch aus
einem externen RAM) ausführen und besitzt auch extra ausgezeichnete
Ports für Adress- und Datenleitungen.
Wenn ich mir nun den 68HC08 ansehe, dann scheint das ein reiner Von
Neumann-Controller zu sein. Nur hab ich bisher nirgendwo Artikel darüber
gefunden, ob und wenn ja wie man Code aus einem externen RAM mit ihm
ausführen kann. Ist der Schlüssel dazu diese Mapped-I/O-Funktionalität?
Würde mich freuen, wenn jemand meine Verwirrung diesbezüglich etwas
eingrenzen kann :-)
(Und ich weiß, dass die Frage vielleicht etwas komisch gestellt ist,
besser kann ichs aber nicht in Worte fassen)
Wenn ein Controller externes Program-ROM unterstützt kann man
stattdessen auch ein RAM einsetzen. Man muss sich nur überlegen, wie man
es gefüllt bekommt.
Von Neumann bedeutet, dass Programm und Daten im selben Adressraum
liegen. Ein 8051 hat für Programm und Daten 2 getrennte Adressräume (je
max. 64k XDATA und CODE) zur Verfügung. Daher hat er bei "normaler"
Beschaltung mit EPROM und RAM eigentlich eine Harvard-Architektur.
Bei alten Entwicklungssystemen (vor FLASH-EEPROM-Zeiten) wurde jedoch
ein Teil des RAMs in den Programmspeicherbereich gemappt, um daraus zu
arbeiten. Ein Bootloader/Monitorprogramm ermöglichte dort den Start des
Systems und den Download in das RAM. Vom Monitor aus konnte man dann an
den Anfang seines Programms springen und es ausführen. Nach Abschalten
der Spannung ist bei diesen Systemen aber das Programm weg. Trotzdem
konnte das eigene Programm nicht in den Programmspeicher schreiben. Über
den Adressdecoder wurden die XDATA-Zugriffe auf einen anderen
RAM-Bereich umgeleitet.
Moderne 8051-Derivate mit FLASH sind wieder reine Harvard-Rechner, weil
die Speicherbereiche strikt getrennt sind. Ein integrierter Bootloader
ermöglicht hier, das FLASH umzuprogrammieren. Der Controller behält das
Programm hier auch nach Abschalten der Versorgungsspannung, externes RAM
ist oft im Chip integriert (!!), also als XDATA ansprechbar.
DR schrieb:> ich versuche nun seit einigen Tagen zu verstehen,> ob ein> Von Neumann-µC grundsätzlich immer in der Lage ist, Code aus einem> externen RAM auszuführen.
Nein, natürlich nicht. Von-Neumann-Architektur bedeutet ja nur, daß Code
und Daten in einem gemeinsamen Speicher liegen können.
Es sagt allerdings nichts darüber aus, ob dieser intern oder extern ist
oder ob beides (eventuell auch gleichzeitig) geht. Und es sagt auch
nichts darüber aus, ob die prinzipelle Möglichkeit des gemeinsamen
Speichers nicht zur Laufzeit für bestimmte Speicherbereiche auch wieder
eingeschränkt werden kann. Es muß nur irgendwann mal gehen.
DR schrieb:> ich versuche nun seit einigen Tagen zu verstehen, ob ein> Von Neumann-µC grundsätzlich immer in der Lage ist, Code aus einem> externen RAM auszuführen
Ein solcher Prozessor hat einen einheitlichen Adressraum und kann Code
an jeder Adresse ausführen, egal ob ROM oder RAM, die Frage ist nur, ob
man überhaupt extern RAM anschliessen kann (ob der Bus herausgeführt
ist).
Es ist auch egal, ob es sich um RAM handelt, solange dort Code steht,
der kann ja auch anderweitig hineingekommen sein, etwa bei einem
Emulator vom PC gesteuert.
Der 8051 kann aber nur Code ausführen, der im Adressbereich für Code
steht, auch egal ob dort ROM oder RAM angeschlossen ist - ist also
Harvard.
Gruss Reinhard
Reinhard Kern schrieb:> Ein solcher Prozessor hat einen einheitlichen Adressraum und kann Code> an jeder Adresse ausführen, egal ob ROM oder RAM,
Nö. Du schreibst sehr vom hohen Roß aus und liegst dabei falsch. Kleines
Beispiel: Viele ARM-Controller haben RAM-Stücke eingebaut, die zwar im
vereinheitlichten Adreßvolumen liegen und wo man auch Daten unterbringen
kann, aber das Ausführen von Code daraus geht NICHT.
Also nicht so vorschnell "bei v.Neumann geht immer alles" trompeten. Es
kommt immer auf die konkrete Realisierung an und die erfährt man nur aus
dem jeweiligen Manual - ohne Verallgemeinerungsfähigkeit.
W.S.
DR schrieb:> Hallo zusammen, ich versuche nun seit einigen Tagen zu verstehen, ob ein> Von Neumann-µC grundsätzlich immer in der Lage ist, Code aus einem> externen RAM auszuführen. Kann mir da jemand weiterhelfen?
Falsche Fragestellung. Du willst wissen, ob der Controller X das kann.
Nicht ob John von Neumann sich damals Gedanken über internes und
externes RAM gemacht hatte (hat er nicht).
Denn H vs vN hilft dir hier nicht weiter. Es gibt Prozessoren, die
mehrere RAM Banks für Daten haben und in manchen davon Code ausführen
können, in anderen nicht. Da hilft nur die konkrete Frage nach Typ X.
Die Klassifizierung realer heutiger Prozessoren in H oder vN hat heute
ohnehin etwas von der Swift'schen existentiellen Frage, an welchem Ende
man das Ei aufschlägt.
Spätestens seit Intels Execution-bit in den X86-reihen sollte auch dem
Letzten klar sein, daß reine von-Neumann- oder Harward-Architekturen nur
auf dem Papier existieren.
Heute ist das eher so ein Mittelding: per Bootloader, externer
Beschaltung, Ausführungsschicht, Adressmaskierung etc, werden bestimmte
Bereiche als "nur Daten", "nur Programm" oder gar als "Nur Execute, kein
Read"=auslesegeschützt markiert.
Welche CPU was wie genau macht, muß man halt nachlesen - hier kocht
jeder Hersteller sein eigenes Süppchen.
Achja: Selbst zu Z80-Zeiten (eine Lehrbuch-von-Neumann-Architektur)
konnte man ganz-simpel Adressbereiche aus der Programmausführung
ausklammern: Einfach für die entsprechenden Adressen das Signal M1 als
"disable" mitdekodieren.
Andy P. schrieb:> Spätestens seit Intels Execution-bit in den X86-reihen sollte auch dem> Letzten klar sein, daß reine von-Neumann- oder Harward-Architekturen nur> auf dem Papier existieren.
Da die Harvard Architektur ihren Namen dem Rechner Harvard Mark I
verdankt, war das doch deutlich mehr als blosses Papier. ;-)
Eine gewisse Folgerichtigkeit liegt aber darin, dass eines der ersten
Programme dieses 5 Tonnen Kolosses auf John von Neumann zurückgeht.
Vielen lieben Dank für die ganzen Antworten! :-)
Das hilft mir auf jeden Fall weiter.
A. K. schrieb:> Falsche Fragestellung. Du willst wissen, ob der Controller X das kann.> Nicht ob John von Neumann sich damals Gedanken über internes und> externes RAM gemacht hatte (hat er nicht).>> Denn H vs vN hilft dir hier nicht weiter. Es gibt Prozessoren, die> mehrere RAM Banks für Daten haben und in manchen davon Code ausführen> können, in anderen nicht. Da hilft nur die konkrete Frage nach Typ X.
Das ist mir jetzt auch endlich klar geworden :-)
Deshalb also die Frage: Könnt Ihr mir bitte Prozessoren/Controller
(gerne auch ältere) nennen, die Code aus einem externen Speicher
ausführen können? Bei den 8051ern ist das nach meinem Verständnis
möglich.
Verrätst du uns auch noch genauer, was du tun willst?
Über was für eine Schnittstelle soll der externe Speicher angebunden
sein?
Warum muss er extern sein? Könntest du nicht einen Prozessor mit genug
internem Speicher nehmen?
Oder geht es dir darum, dass du den Code zur Laufzeit ändern kannst (RAM
statt ROM)?
Käme es auch in Frage, einen (Bytecode-) Interpreter laufen zu lassen
(dann geht es nämlich immer)?
Muss zusätzlich ein ROM da sein, oder wärs auch ok, wenn es nur aus dem
RAM läuft (also: Wäre x86 eine Antwort auf deine Frage?)
sebastian schrieb:> Verrätst du uns auch noch genauer, was du tun willst?
Ich möchte, nachdem ich bereits eine Zeit lang mit Atmels ATtinys und
ATmegas gebastelt hab, nun gerne eine Art "Retrocomputer" bauen - oder
zumindest mit dem Bau anfangen. Ich weiß, dass das ein ziemlich hohes
Ziel ist, mir gehts aber weniger um das Ergebnis als vielmehr um den Weg
dorthin, da ich dadurch glaub ich sehr viel lernen könnte.
Zu diesem Zweck möchte ich einen möglichst abgespeckten Controller -
also fast schon einen Prozessor - nutzen und diesen um die Peripherie
erweitern, die ich für sinnvoll halte und die mich interessiert. Wichtig
ist mir, dass das ganze ab einem gewissen Zeitpunkt autark sein soll,
ich also auf dem selbstgebauten Computer Programme für ebendiesen
schreiben kann (womit ich momentan nur Assembler-Programme meine, über
Compilerbau kann ich mir immer noch später den Kopf zerbrechen, falls
ich bis dahin überhaupt komme). Deshalb möchte ich im laufenden Betrieb
Programme laden und beenden können, weshalb ich mich gegen Flashen per
Bootloader oder einen Interpreter entschieden hab. Ein Interpreter würde
zwar auch funktionieren, allerdings interessieren mich Interpreter nicht
sonderlich.
sebastian schrieb:> Über was für eine Schnittstelle soll der externe Speicher angebunden> sein?
Da kenn ich mich nicht aus, eben so, dass die dort liegenden Programme
vom Controller mit möglichst wenig Aufwand ausgeführt werden können.
sebastian schrieb:> Warum muss er extern sein? Könntest du nicht einen Prozessor mit genug> internem Speicher nehmen?
Extern deshalb, damit ich mir auch Dinge wie Bank Switching und so
(unabhängig davon, ob das nun veraltet ist oder nicht) mal ansehen kann.
Ich möchte mich außerdem bewusst etwas einschränken (z.B. max.
16-Bit-Controller, nicht mehr als vielleicht 40MHz, etc.), im Zuge
dessen wäre externer Speicher eben praktisch: Ich könnte zunächst bspw.
8KB RAM nutzen und sehen, wie weit ich damit komme. Wenn ich damit
definitiv nichtmehr weiter komme erweiter ich den Speicher auf 16KB usw.
sebastian schrieb:> Muss zusätzlich ein ROM da sein, oder wärs auch ok, wenn es nur aus dem> RAM läuft
Es sollte beim "Booten" ein ROM vorhanden sein, von dem das
Startprogramm gelesen wird (da ich nicht z.B. das Programm per
Bootloader über die serielle Schnittstelle o.ä. laden will). Ob das ROM
intern oder extern sein soll weiß ich noch nicht genau.
sebastian schrieb:> Wäre x86 eine Antwort auf deine Frage?
Mit x86 hab ich mich noch nie auseinandergesetzt, ich werd dazu morgen
mal querlesen.
Bisher sind mir zwei Controllerfamilien aufgefallen: Die 8051 (insb. der
AT89S52, da sich der interne Flash mit den Standard-Atmel-Programmern
programmieren lässt) sowie die HC(S)08- und HC(S)12-Reihen von
Freescale. Letztere hatten eben zu meiner Verwirrung geführt: Ich hatte
im Internet gelesen, dass sie in der Lage seien, Code von einem externen
RAM auszuführen. In den Datenblättern hab ich dazu aber nichts gefunden.
Geht das nun oder nicht? Und wo kann man dazu was nachlesen? Jedenfalls
hab ich das dann irgendwie mit Von Neumann in einen Topf geworfen und
war dann vollends verwirrt...
Mir ist klar, dass dieses Vorhaben weder zeitgemäß noch sonderlich
elegant ist und meine Begründungen streckenweise willkürlich sind, mich
interessierts einfach :-)
Hallo DR
bei 8051ern ist das möglich und auch nicht schwer. Zum fetchen
(Programmcode lesen) aus dem Programmspeicher aktiviert er das
PSE-Signal (Program Store Enable - Low aktiv). Zum lesen aus dem RAM
aktiviert er das RD-Signal (Read Low-aktiv). Verknüpft man beide Signale
UND, wird der Ausgang des Gatters bei beiden Signalen Low. So wird aus
"Harvard" "von Neumann" und der gemeinsame Programm- und
Datenspeicherzugriff funktioniert tadellos. Ich habe das vor einigen
Jahren, mit AT89S8253 gemacht, hat problemlos funktioniert.
Gruß Tom.
DR schrieb:> Ich möchte ... eine Art "Retrocomputer" bauen> ...> Wichtig ist mir, ...> ich also auf dem selbstgebauten Computer Programme für ebendiesen> schreiben kann (womit ich momentan nur Assembler-Programme meine ...)> ...> Deshalb möchte ich im laufenden Betrieb Programme laden> ...> Extern deshalb, damit ich mir auch Dinge wie Bank Switching und so> (unabhängig davon, ob das nun veraltet ist ...) mal ansehen kann> ...> Mir ist klar, dass dieses Vorhaben weder zeitgemäß noch sonderlich> elegant ist ..., mich interessierts einfach
Schau dir das mal an
http://www.mikrocontroller.net/articles/8bit-CPU:_bo8
Vielen Dank Euch allen, ich les mich mal weiter in die Materie ein.
Dieser Thread hat mir auf jeden Fall geholfen, einige grundlegende
Verständnisprobleme zu beseitigen :-)
DR schrieb:> Vielen Dank Euch allen, ich les mich mal weiter in die Materie> ein.> Dieser Thread hat mir auf jeden Fall geholfen, einige grundlegende> Verständnisprobleme zu beseitigen :-)
Ein 8051 läßt sich problemlos mit einem RAM zusätzlich zu externem ROM
aus statten. Dazu sind hardwaremäßig nur zwei NAND-Gatter erforderlich,
welche Verknüpfungen zwischen den Signalen PSEN, RD und WR machen.
Könnte ich aber noch mal nach sehen, ich hab ja solche Boards. Man kann
dann, wie schon jemand schrieb, über einen Bootlader im ROM den Code vom
PC ins RAM transferieren, und dort ausführen. Auch ist es möglich, im
RAM Code während der Laufzeit zu manipulieren, und auch Daten darin zu
speichern.
Der 8085 ist auch ein besonderer Retro-Kandidat, den man sich dafür
anschauen kann. Der ist wieder von Neumann, ROM und RAM teilen sich den
Adreßraum. Der 8085 braucht ohnehin externes RAM für Daten, und
besonders für den Stack. Er ist gar nicht so viel älter als der 8051,
aber eher ein µP als ein µC. Es ist sogar möglich, mit dem Ding eine
absolut minimalistische Hardware zu bauen, die nur das externe ROM hat.
Jedoch muß man im Programm auf Stack und Calls und Interrupts
verzichten, und mit 6 Datenbytes aus kommen. Ich habs nur scherzeshalber
mal versucht. ;-)
Meiner 8085-Platine verpaßte ich nur 32k ROM und 32k SRAM. Damals hätten
sie davon geträumt. Der 8085 hat damit einen riesigen Stack, von dem
wieder ein 8051 träumt. Auch verpaßte ich dem einen Timer, was er ja
auch nicht hat. Der Timer 8253 war noch gar nicht mal so uninteressant
und schlecht! Und die I/O 8255. Dann hatte ich keine Lust mehr, es
sollte ja einfach nur eine 8085-Demo werden. Einen Interrupt-Controller
hätte ich noch gerne mal getestet, aber da gibt es noch so vieles mehr.
Mit einem ARM in Form eines LPC21xx hatte ich auch zu tun. Die
Speicherbereiche liegen zwar in einem Adreßraum, aber dort gab es bei
einer nicht erlaubten Flash-Adresse oder RAM-Adresse eine Exception. Das
ist was ähnliches wie ein Interrupt, in dem man einen Error-Handler
programmieren kann. Auf jeden Fall muß man dort für die Exceptions
wenigstens Dummys programmieren, wenn man seine Arbeit ernst nimmt,
sonst stürzt die Kiste dort ab. Ich glaube, dort lag ein kleiner
RAM-Bereich innerhalb des Flash. Aber es ist eine Weile her, müßte alles
wieder nach schauen. Diese µC sind schon etwas aufwändiger als ein 8085
oder 8051. Deswegen finde ich manchmal merkwürdig, daß absoluten
Anfängern hier im Forum sowas empfohlen wird.
>ob ein Von Neumann-µC grundsätzlich immer in der Lage ist,
Ein typischen "Von Neumann-µC" gibt es (wie schon geschrieben) nicht,
eher Mischformen davon.
Die Vorteile von Harv. u vNeum können (je nach Kosten) im uC auch
kombiniert werden.
Grössere Controller-Familien (bzw mache Derivate davon) erlauben
Progr-Ausführung sowohl ausm int. als auch ausm ext. Speicher.