Was ist schneller, Ausführen eines Programms aus ROM oder RAM?

Die meisten von uns, die einen Elektronikhintergrund haben, wissen, dass SRAM schneller als DRAM ist. Aber wenn es darum geht, RAM mit ROM zu vergleichen, bin ich mir nicht sicher.

Meine Frage bezieht sich auf den Mikrocontroller: "Wenn ein Code direkt vom RAM / ROM ausgeführt wird, dessen Leistung besser ist? 1) Ausführung vom RAM oder 2) Ausführung vom ROM oder 3) beide werden gleich ausgeführt."

Auch unter Berücksichtigung der Tatsache, dass ROMs für höhere Lesegeschwindigkeiten ausgelegt sind. während für RAM ein Kompromiss zwischen Lesegeschwindigkeit und Schreibfähigkeit besteht.

Lesen Sie das Datenblatt (gründlich) ist der beste Weg. Manchmal ist es schneller, ein Programm aus dem RAM auszuführen als aus dem Flash-Speicher. Einige Mikros können überhaupt keine Programme aus dem RAM ausführen und andere können mit der gleichen Geschwindigkeit ausgeführt werden.
Ich kann noch keinen Kommentar hinzufügen, versuche nur, hilfreich zu sein. Hängt davon ab, ob das ROM tatsächlich schneller ist als das von Ihnen verwendete RAM. Sind sie gleich schnell?
Viele aktuelle ARM Cortex-M-Teile sind hervorragende Beispiele für solche, die vom SRAM ausgeführt werden können , dabei aber langsamer sind , da der dedizierte Befehlspfad zum Flash nicht verwendet werden kann. Umgekehrt kann der Datenzugriff auf Flash langsamer sein als auf RAM
Aber mit etwas älteren ARM7-Chips (meine Erfahrung war mit LPC2106 und LPC2148) ist die Ausführung vom RAM oft SCHNELLER als vom FLASH. Was zusammen mit der Antwort von Chris beweist, dass das Einzige, was wir sagen können, "es kommt darauf an".
Wenn Sie bereits über die Hardware verfügen, ist es am einfachsten, die beiden Szenarien einfach auszuführen und zu vergleichen. Wenn nicht, sind Datenblätter die beste Wahl.

Antworten (3)

Das Datenblatt sollte Ihnen sagen, wie lange jede Anweisung dauert und welche Unterschiede es gegebenenfalls zwischen der Ausführung von RAM oder ROM gibt.

Für Mikrocontroller, die die Option der Ausführung aus dem RAM bieten, ist dies wahrscheinlich schneller, was wahrscheinlich der Hauptgrund dafür ist, zusätzlichen RAM-Speicherplatz zum Ausführen von Code zu verwenden. Es kann auch zu Problemen mit Abrufüberschneidungen kommen. In einigen Fällen kann die Ausführung vom ROM schneller sein, da es sich um einen separaten Speicher handelt und der RAM-Zugriff gleichzeitig stattfinden kann.

Auch hier ist der einzige Weg, dies für ein bestimmtes Mikro herauszufinden, das DATENBLATT ZU LESEN .

Es ist sogar noch schneller, vom Register aus auszuführen.
@Joshua Haben Sie Beispiele dafür, was Sie mit einem Programm tun könnten, das aus Registern ausgeführt wird? Es scheint sündhaft clever zu sein, ist aber auf eine eher kleine Programmgröße beschränkt. Ich habe von 64-kB-Grafikdemos gehört, aber eine 16-Register-Demo? =)
@CortAmmon: Ich habe eines auf meinem Schreibtisch mit 512 Registern, von denen 400 Programmcode enthalten. Der RAM ist dreimal langsamer und der ROM ist so langsam, dass er beim Start in den RAM kopiert wird (was 100 Millisekunden dauert). Ich habe einen SD-Karten-Initialisierer/Leser, der in 300 Register passt, ohne Hardware-Unterstützung über GPIO-Pins hinaus. Der Writer benötigt weitere 100 Register, sodass das Ganze nicht in das Register passt (dies würde nicht ausreichen, um etwas Interessantes zu tun), aber ich brauche den Initialisierer nicht mehr, also überschreibe ich.

Es hängt ganz von der Speicher- und CPU-Architektur ab. Als Faustregel gilt, dass SRAM schneller als Flash ist, insbesondere auf schnelleren MCUs (>100 MHz). SRAM-Bitzellen erzeugen einen (mehr oder weniger) logischen Ausgang, während Flash-Speicher einen langsameren Stromerfassungsprozess durchlaufen müssen.

Wie viel schneller (wenn überhaupt) hängt wiederum von der Architektur ab – der Wortgröße der Speicher, der Anzahl der Wartezustände in jedem, dem Vorhandensein von Caching, der Größe der CPU-Anweisungen usw. Wenn Sie bei a Bei einer ausreichend niedrigen Frequenz könnten Flash und RAM keine Wartezustände haben, sodass sie möglicherweise mit derselben Geschwindigkeit ausgeführt werden.

Auch der Code spielt eine Rolle. Wenn Ihr Code streng linear ist (keine Verzweigung), könnte der Flash Anweisungen schnell genug vorab abrufen, um die CPU auch bei höheren Frequenzen ausgelastet zu halten. Wie Olin sagte, könnte eine CPU mit Harvard-Architektur mit getrennten Programm- und Datenlesepfaden anders funktionieren, wenn sich Code und Daten in unterschiedlichen Speichern befinden.

Metall-ROMs (und andere nichtflüchtige Speicher wie FRAM) haben ihre eigenen Eigenschaften und können so schnell wie SRAM sein oder nicht. Die Fähigkeit zu schreiben macht nicht unbedingt einen Unterschied; es geht mehr um die Eigenschaften der Bitzellen-Ausgangs- und Erfassungsschaltungen.

Das Datenblatt gibt Ihnen eine ungefähre Vorstellung vom Geschwindigkeitsunterschied, aber die einzige Möglichkeit, dies sicher zu wissen, besteht darin, Ihren Code zu profilieren.

"Ein Programm ausführen" erfordert eine CPU mit einer synchronen Uhr. Langsamer Speicher kann angepasst werden, indem entweder das gesamte System mit einem ausreichend langsamen Takt betrieben wird oder indem wait states(zusätzliche Do-Nothing-Taktzyklen zwischen den Abruf- und Decodierphasen) eingefügt werden, die nur für bestimmte Adressbereiche aktiv sind (siehe zum Beispiel den alten 8085). Der CPU-Befehlsabruf weiß oder kümmert sich nicht genau, wann die Daten auf ihren endgültigen Wert gesetzt werden, solange sie sich während des Setup/Hold-Intervalls nicht ändern.

Ein Mikrocontroller hat normalerweise seinen gesamten Speicher auf dem Chip, also würde ich, sofern nicht anders angegeben, davon ausgehen, dass das Speichersystem alle im Null-Wartezustand ist. (aber lesen Sie das Datenblatt zur Bestätigung). Typische Mikrocontroller sollen im Vergleich zu einem Desktop einfachere Einzelchip-Lösungen sein, daher sind Wartezustände in einem Mikrocontroller unwahrscheinlich. Daher ist es unwahrscheinlich, dass ein Mikrocontroller die On-Chip-Speichergeschwindigkeiten nicht angepasst hätte.

Schnellerer Speicher kostet im Allgemeinen einen Aufpreis (höhere Spannung, niedrigere Kapazität, mehr Bedarf). Ein 80xx86 hat schnellen SRAM im L2-Cache und noch schnelleren SRAM im L1-Cache und viele langsamere DRAMs außerhalb des Chips, die an einen Speichercontroller angeschlossen sind. Diese Art von System ist viel komplizierter als ein Mikrocontroller und geht über den Rahmen der Frage hinaus. (Aber von großem Interesse für einen Computeringenieur!)

Eigentlich ist ein perfekt abgestimmtes Design ohne Zwänge nicht möglich. Ein Prozessor trennt entweder Befehls- und Datenspeicher, nutzt die Speichergeschwindigkeit in Nicht-Speicherdatenbefehlen nicht aus, leidet unter Wartezuständen oder verwendet Multiport-Speicher.
Wartezustände sind in leistungsfähigeren Mikrocontrollern ziemlich üblich. Blitz ist langsam.
@AdamHaun: Auf der anderen Seite können viele interne Flash-Arrays viele Wörter gleichzeitig lesen; Wenn der Code an eine beliebige Stelle im Flash springt, kann es einige Zyklen dauern, bis die erste Anweisung abgerufen ist, aber sobald diese abgerufen ist, können die nächsten paar Anweisungen ohne weitere Verzögerung verfügbar sein. In vielen Fällen bereitet der Zugriff auf etwas nahe dem Ende des Puffers das System darauf vor, den nächsten Wortsatz zu laden.