Warum Code aus dem RAM ausführen?

27

Ich bin gerade auf einige Makros gestoßen, mit denen mein Mikrocontroller-Compiler die Ausführung einer Funktion aus dem RAM erzwingen (oder vorschlagen) soll.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

In welchen Fällen ist das wertvoll? Warum würde ich nicht einfach immer aus dem RAM ausführen, wenn der Vorteil nur eine höhere Geschwindigkeit wäre? Verursacht dies im Allgemeinen eine höhere Stromaufnahme?

Tarabyte
quelle
13
Das Ausführen von Code aus dem RAM verbraucht weniger Strom (ich bin nicht sicher, ob dies für alle CPUs / SoCs zutrifft). Ich habe einmal ein Projekt gemacht, bei dem wir den größten Teil des Codes in den Arbeitsspeicher gestellt haben, weil es sich um ein Akkugerät handelte und wir wollten, dass es so lange wie möglich funktioniert. Wenn Sie Code nur aus dem RAM ausführen können, können Sie auf einigen SoCs sogar Flash-Blöcke ausschalten und noch mehr Strom sparen.
Al Bundy
4
@pipe - Ich stelle mir vor, dass der Grund dafür, dass es sich eher um einen Kommentar als um eine Antwort handelt, darin besteht, dass die eigentliche Frage nicht beantwortet wird. Aus diesem Grund möchten Sie nicht immer RAM für die Ausführung Ihres Codes verwenden.
Jules
1
@Jules Ja, ich stelle mir vor, es ist eine "hilfreiche Anekdote". Die Dinge, die Stack Exchange verhindern soll, haben gute Gründe.
Pipe
1
Weil Sie nicht genug Register haben, um sie auszuführen. (Ich habe diesen Chip.)
Joshua
Zusätzlich zu allem: Das Ausführen von Code aus dem dynamischen RAM könnte Teil eines aufwändigen Software-Hacks sein, um DRAM-Aktualisierungen durchzuführen. :)
Kaz

Antworten:

32

Zusätzlich zu der Geschwindigkeit und anderen Funktionen, die bereits erwähnt wurden, kann das Ausführen von Code aus dem RAM in Bootloadern nützlich sein, in denen Sie den Flash Ihres Mikros neu programmieren müssen. Sie können keinen Code aus Flash ausführen, der gerade gelöscht wird. Neuprogrammierung.

brhans
quelle
4
Dies hängt davon ab, wie viele Flash-Blöcke Sie haben und welche Ihr Bootloader modifizieren darf, wie viel RAM Sie noch haben, um die Daten für den nächsten Block zu speichern, usw. Dies ist jedoch zutreffend, wenn Sie das Flash-RAM ausschalten, um es zu modifizieren gut dafür ...
old_timer
1
Dies scheint nur die Hälfte der Frage zu beantworten (der Titelteil). OP fragte auch "Warum würde ich nicht immer aus dem RAM ausführen, wenn der Nutzen nur die Geschwindigkeit erhöht?", Und diese Antwort erklärt nicht, warum man möglicherweise nicht aus dem RAM ausführen möchte.
Doktor J
2
Soweit so gut, aber was passiert, wenn Sie während des Überschreibens des Flashs an Leistung (und damit an RAM) verlieren? Dies kann gelöst werden, muss aber wie jedes andere Design für einen Bootloader berücksichtigt werden.
AaronD
19

Ich habe mir das Datenblatt für dieses Mikro nicht angesehen. In dieser Situation ist es jedoch häufig der Fall, dass das Abrufen aus dem RAM schneller ist als das Abrufen aus dem Flash, aus dem der Programmspeicher implementiert ist.

Der Vorteil von Flash ist, dass große Mengen relativ billig sein können. Hersteller von Mikrocontrollern setzen daher manchmal viel Flash auf einen Chip und stellen dann einen begrenzten RAM-Speicher zur Verfügung, aus dem Code ausgeführt werden kann. Auf diese Weise können zeitkritische Routinen in den Arbeitsspeicher kopiert und von dort ausgeführt werden.

Der Compiler-Schalter, auf den Sie sich beziehen, funktioniert wahrscheinlich mit dem Linker und markiert den Flash-Abschnitt, der vom Compiler-Laufzeitcode, der nach dem Zurücksetzen ausgeführt wird, in den Arbeitsspeicher kopiert werden soll. Unterschiedliche Implementierungen variieren in den Details.

Olin Lathrop
quelle
17

Wenn Sie im RAM ausführen möchten, weil es schneller ist, liegt dies normalerweise daran, dass es sich bei dem RAM um einen On-Chip-SRAM handelt. Dies ist eine knappe Ressource, die Sie wahrscheinlich für Daten benötigen, die Lese- / Schreibzugriff erfordern.

Verwenden sie für Code , wenn Sie bereits haben Sie den Code in ROM / Flash bedeutet , dass Sie eine Menge X von Blitz und eine zusätzliche X Menge an RAM benötigen.

Es erfordert auch eine zusätzliche Kopierphase beim Booten oder wenn Sie es ausführen möchten, obwohl es größtenteils unbedeutend ist.

Traditionell wird dies mit einem Anweisungs-Cache gelöst, aber in einem Mikrocontroller kann es sinnvoller sein, den internen SRAM-Generic beizubehalten, da Sie keinen Mikrocontroller verwenden, weil Sie die schnellste Ausführungsgeschwindigkeit wünschen.

Es gibt auch ein Zuverlässigkeitsproblem - Code, der im tatsächlichen ROM ausgeführt wird, kann nur schwer durch fehlerhaften Code geändert werden.

Rohr
quelle
14

Neben allen guten Antworten:

Warum würde ich nicht einfach immer aus dem RAM ausführen, wenn der Vorteil nur eine höhere Geschwindigkeit wäre?

In einem eingebetteten System ist normalerweise nicht genügend RAM vorhanden. Zum Beispiel ein STM32 mit 32kB oder RAM und 512kB EEPROM. Um das gesamte Programm im RAM ausführen zu können, benötigen Sie einen RAM, der größer als das EEPROM ist.

Marko Buršič
quelle
5
„Weil in einem System eingebettet, in der Regel Sie nicht über die erforderliche Menge an RAM.“ - und weil , wenn Sie tun genug RAM haben , dies zu tun, können Sie mit ziemlicher Sicherheit die Kosten senken , indem sie mit weniger RAM zu einer Verbilligung des MCU geschaltet wird . Denn wenn Sie die Frage stellen, gibt es immer eine billigere MCU mit weniger RAM (die kleinsten und billigsten MCUs verwenden die Harvard-Architektur, können also nicht vom RAM ausgeführt werden)
Jules
13

Andere Antworten scheinen nicht viel über den Stromverbrauch gesprochen zu haben, nach dem Sie speziell gefragt haben.

Die Antwort ist, dass es etwas vom Mikrocontroller abhängt, aber oft kann die Ausführung über RAM den Stromverbrauch reduzieren, da weniger Energie benötigt wird, um Anweisungen aus dem RAM als aus dem Flash-Speicher zu lesen.

Ein typischer Verwendungszweck ist die Ausführung einer Energiesparfunktion aus dem RAM bei ausgeschaltetem Flash-Speicher. Der Stromverbrauch wird nicht nur reduziert, sondern wenn der Mikrocontroller schnell aufwachen muss (z. B. als Reaktion auf einen externen Interrupt), gibt es keine Verzögerung, während der Flash-Speicher wieder eingeschaltet wird.

Einige Teile, wie z. B. einige der Atmel SAM-Reihe, verfügen über einen speziellen Arbeitsspeicher mit besonders geringem Stromverbrauch, der für diesen Zweck verwendet werden kann. Dadurch kann eine kleine Menge Code in den speziellen RAM geladen werden, während der Großteil des verfügbaren RAM und aller anderen Speicher abgeschaltet wird und der Mikrocontroller in einen Tiefschlafmodus wechselt.

Benutzer
quelle
7

Abgesehen von den möglichen Geschwindigkeitsvorteilen, die von anderen erwähnt werden, ist der RAM-Code auch dynamisch und kann im laufenden Betrieb durch einen Anpassungscode im FLASH nach Bedarf geändert werden.

Dies kann so einfach wie das Ändern einiger Parameter sein, oder es können ganze Handler-Routinen remote hochgeladen werden.

Trevor_G
quelle
Oder der Code im RAM kann von der Festplatte (zB SD) oder vom Netzwerk geladen werden
teambob
4

Das Ausführen von Code aus dem RAM ist erheblich schneller als das Ausführen von Code aus dem Flash-Speicher. Die meisten CPUs sind stark für den schnellstmöglichen RAM-Zugriff optimiert, und selbst der schnellste Flash-Speicher erreicht nur einen Bruchteil der RAM-Geschwindigkeit.

Beachten Sie jedoch, dass das Verschieben des Codes von Flash in den Arbeitsspeicher ebenfalls einige Zeit in Anspruch nimmt. Wenn Code nur einmal ausgeführt wird, muss er nur einmal gelesen werden, und Sie verlieren Zeit, ihn zuerst in den Arbeitsspeicher zu kopieren, anstatt ihn direkt auszuführen. Wenn Code gelegentlich ausgeführt wird (das Kopieren in den Arbeitsspeicher würde die Ausführung beim zweiten Aufruf erhöhen), das System jedoch im Allgemeinen inaktiv ist, würden Sie diesen Code schneller ausführen, indem Sie ihn in den Arbeitsspeicher kopieren, aber das interessiert niemanden hat genug Zeit zu verbringen.

Solche Optimierungen sind also nur dann die Mühe wert, wenn der Code häufig ausgeführt wird und Sie ihn als einen Erstickungspunkt des Systems eingeschätzt haben.

Andererseits muss der RAM die gespeicherten Daten aktiv halten, während der Flash-Speicher dies nicht tut. Daher steigt der Gesamtstromverbrauch, wenn der RAM aktiv gehalten werden muss. Dies ist jedoch nur relevant, wenn der Arbeitsspeicher ansonsten gar nicht genutzt wird, aber die meisten modernen Systeme auf die eine oder andere Weise den verfügbaren Arbeitsspeicher bereits nutzen und ihn daher bereits aktiv halten.

TwoThe
quelle
4

Es gibt zwei sehr häufige Gründe, Code aus dem RAM auszuführen:

  1. Einige Mikroprozessoren können während der Flash-Programmierung nicht vom Flash ausgeführt werden - obwohl viele dies tun können, solange sich der Code in einem anderen Block als der zu schreibende Flash befindet. Flash-Schreibvorgänge programmieren möglicherweise die Anwendung neu (Bootloader-Fall) oder wenn Flash zum Speichern nichtflüchtiger Programminformationen (Konfiguration, Kalibrierung usw.) verwendet wird.

  2. Auf vielen Mikroprozessoren ist RAM viel schneller als Flash. Bei diesen Geräten können kleine geschwindigkeitskritische Routinen aus dem RAM ausgeführt werden, obwohl der RAM in der Regel viel kürzer ist als der Flash-Speicher.

Dave Nadler
quelle
2

Ein weiterer Verwendungszweck für RAM ist die Ausführungssicherheit gegen zufällige Bitflips. Wir verwenden dieses Modell für unseren kleinen Cubesat, da die Hauptplatine über einen ECC-RAM verfügt, der Bitflips aufgrund von Strahlung toleriert. Das gesamte Betriebssystem wird in den RAM geladen, da eine RAM-Disk beim Start vollständig in einer ECC-Umgebung ausgeführt wird.

Der Flash-Speicher ist nicht ECC-geschützt (standardmäßige Standard-Micro-SD-Karten). Wir haben jedoch andere Methoden, um nach Beschädigungen zu suchen (mehrere Bilder, Prüfsummen usw.).

Tejas Kale
quelle
Ich hätte angenommen, dass so etwas wie ein EEPROM oder ein Flash viel "schwerer" durch Strahlung zu flippen ist, dh mehr Energie benötigt.
Rohr
Das ist in der Tat so, aber da wir nur Standard-Flash ohne spezielle ECC-Funktionen verwenden, ist die Verwendung von RAM für diesen Zweck viel besser.
Tejas Kale