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.
http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM
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?
microcontroller
ram
Tarabyte
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
Neben allen guten Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Es gibt zwei sehr häufige Gründe, Code aus dem RAM auszuführen:
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.
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.
quelle
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.).
quelle