Perché eseguire il codice dalla RAM?


27

Ho appena trovato alcune macro per il mio compilatore di microcontrollori per forzare (o suggerire) una funzione da eseguire dalla RAM.

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 quali casi è prezioso? Perché non eseguirei sempre dalla RAM se il vantaggio è solo una maggiore velocità? Questo generalmente causa un assorbimento di corrente più elevato?


13
L'esecuzione del codice dalla RAM assorbe meno corrente (non sono sicuro che sia vero per tutte le CPU / SoC). Una volta ho realizzato un progetto in cui abbiamo messo la maggior parte del codice su RAM perché era un dispositivo a batteria e volevamo che vivesse il più a lungo possibile. Se è possibile eseguire il codice solo dalla RAM, è anche possibile spegnere i blocchi flash su alcuni SoC e risparmiare ancora più energia.
Al Bundy,

4
@pipe - Immagino che il motivo per cui è stato fatto un commento piuttosto che una risposta è che non risponde alla domanda reale, motivo per cui non vorrai usare sempre la RAM per eseguire il tuo codice.
Jules,

1
@Jules Sì, immagino sia inteso come un "utile aneddoto". Le cose che Stack Exchange è progettato per prevenire, per ottime ragioni.
pipe,

1
Perché non hai abbastanza registri da eseguire dal registro. (Ho quel chip.)
Joshua,

Oltre a tutto: l'esecuzione del codice dalla RAM dinamica in particolare potrebbe far parte di un elaborato hack del software per perpetuare l'aggiornamento della DRAM. :)
Kaz,

Risposte:


32

Oltre alla velocità e ad altre funzionalità che altri hanno già menzionato, l'esecuzione del codice dalla RAM può essere utile nei bootloader in cui è necessario riprogrammare il flash del micro: non è possibile eseguire il codice dal flash che si sta nel mezzo della cancellazione e riprogrammare.


4
dipende da quanti blocchi flash hai e da quali il tuo bootloader ti permette di modificare, quanti ram ti sono rimasti per mettere in scena i dati per il blocco successivo, ecc. ma vero per trampolino fuori dal flash in modo da poter modificare il ram flash è buono per quello ...
old_timer

1
Questo sembra rispondere solo a metà della domanda (la parte titolare). OP ha anche chiesto "Perché non dovrei solo eseguire sempre dalla RAM se il vantaggio è solo una maggiore velocità?", E questa risposta non spiega perché uno potrebbe non voler eseguire dalla RAM.
Doktor J,

2
Fin qui tutto bene, ma cosa succede se si perde potenza (e quindi RAM) nel mezzo di riscrivere il flash? Questo può essere risolto, ma proprio come qualsiasi altro progetto per un bootloader, deve essere considerato.
AaronD,

19

Non ho dato un'occhiata al foglio dati per quel micro. Tuttavia, accade spesso in questa situazione che il recupero dalla RAM sia più veloce del recupero dal flash da cui è implementata la memoria del programma.

Il vantaggio del flash è che grandi quantità possono essere relativamente economiche. I produttori di microcontrollori pertanto a volte mettono molto flash su un chip, quindi forniscono uno spazio RAM più limitato da cui il codice può eseguire. Ciò consente di copiare routine critiche in termini di tempo nella RAM, quindi di eseguirle da lì.

L'opzione del compilatore a cui fai riferimento probabilmente funziona con il linker e contrassegna la sezione di Flash che deve essere copiata nella RAM dal codice di runtime del compilatore che viene eseguito dal ripristino. Diverse implementazioni varieranno nei dettagli.


17

Quando si desidera eseguire in RAM perché è più veloce, di solito è perché quella RAM è SRAM su chip. Questa è una risorsa scarsa, che probabilmente vorrai per i dati che richiedono l'accesso in lettura / scrittura.

Usandolo per il codice quando già hanno il codice nella ROM / lampeggiare significa che è necessario X quantità di flash e un importo aggiuntivo X di RAM.

Richiede anche una fase di copia aggiuntiva all'avvio o quando si desidera eseguirlo, anche se è per lo più insignificante.

Tradizionalmente, questo viene risolto con una cache di istruzioni, ma in un microcontrollore può avere più senso mantenere generico il SRAM interno, perché non si utilizza un microcontrollore perché si desidera la massima velocità di esecuzione.

C'è anche un problema di affidabilità: l'esecuzione del codice nella ROM effettiva è difficile da modificare con il codice errato.


14

Oltre a tutte le buone risposte:

Perché non eseguirei sempre dalla RAM se il vantaggio è solo una maggiore velocità?

Perché in un sistema incorporato, di solito non hai la quantità richiesta di RAM. Ad esempio un STM32 con 32kB o RAM e 512kB di EEPROM. Per poter eseguire l'intero programma nella RAM, è necessario disporre di una dimensione della RAM più grande della EEPROM.


5
"Perché in un sistema embedded, di solito non è necessario la quantità necessaria di RAM." - e perché se fare avere abbastanza RAM per fare questo, si può quasi certamente ridurre i costi passando a una MCU più conveniente con meno RAM. Perché se stai ponendo la domanda, c'è sempre un MCU più economico con meno RAM (i MCU più piccoli ed economici usano l'architettura Harvard quindi non possono essere eseguiti dalla RAM)
Jules

13

Altre risposte non sembrano aver discusso molto del consumo di energia, di cui hai specificamente chiesto.

La risposta è che dipende in qualche modo dal microcontrollore, ma spesso l'esecuzione da RAM può ridurre il consumo energetico perché richiede meno energia per leggere le istruzioni dalla RAM che dalla memoria flash.

Un uso tipico sarebbe quello di eseguire una funzione di "sospensione" a basso consumo dalla RAM, con la memoria flash spenta. Non solo si riduce il consumo di energia, ma se il microcontrollore deve svegliarsi rapidamente (ad es. In risposta a un interruzione esterna), non vi è alcun ritardo mentre la memoria flash si riaccende.

Alcune parti, come alcune della gamma Atmel SAM, hanno una RAM speciale a bassissima potenza che può essere utilizzata per questo scopo. Ciò consente di caricare una piccola quantità di codice nella RAM speciale, mentre la maggior parte della RAM disponibile e tutte le altre memorie viene spenta e il microcontrollore entra in modalità di sospensione profonda.


7

Oltre ai potenziali vantaggi di velocità menzionati da altri, il codice RAM è anche dinamico e può essere modificato al volo da un codice di sartoria in FLASH come richiesto.

Questo potrebbe essere semplice come modificare alcuni parametri o potrebbero essere caricate in remoto intere routine di gestori.


Oppure il codice nella RAM può essere caricato dal disco (es. SD) o dalla rete
teambob

4

L'esecuzione del codice dalla RAM è significativamente più veloce dell'esecuzione dalla memoria flash. La maggior parte delle CPU è fortemente ottimizzata per l'accesso RAM più veloce possibile, e anche la memoria flash più veloce raggiunge solo una frazione della velocità della RAM.

Tuttavia, tieni presente che anche spostare il codice da Flash a RAM richiede tempo. Se il codice viene eseguito solo una volta, è necessario leggerlo solo una volta, quindi si perderebbe del tempo per copiarlo prima nella RAM invece di eseguirlo direttamente. Se il codice viene eseguito di tanto in tanto (quindi copiarlo nella RAM aumenterebbe l'esecuzione la seconda volta che viene chiamato), ma il sistema è generalmente inattivo, quindi eseguiresti quel codice più velocemente copiandolo nella RAM, ma a nessuno importa, perché il sistema ha abbastanza tempo da trascorrere.

Quindi tali ottimizzazioni valgono lo sforzo solo se il codice viene eseguito frequentemente e lo hai misurato come un punto di soffocamento del sistema.

D'altra parte, la RAM deve conservare attivamente i dati archiviati, mentre la memoria flash no, quindi il consumo totale di energia aumenta se la RAM deve essere mantenuta attiva. Ciò è tuttavia rilevante solo se la RAM non viene utilizzata affatto, ma la maggior parte dei sistemi moderni, in un modo o nell'altro, utilizzerà già la RAM disponibile e quindi la terrà già attiva.


4

Esistono due motivi molto comuni per eseguire il codice dalla RAM:

  1. Alcuni microprocessori non possono essere eseguiti dal flash durante la programmazione flash, anche se molti possono farlo fintanto che il codice si trova in un blocco diverso dal flash in fase di scrittura. Le scritture flash potrebbero riprogrammare l'applicazione (caso del caricatore di avvio) o quando flash viene utilizzato per memorizzare informazioni sul programma non volatile (configurazione, calibrazione, ecc.)

  2. Su molti microprocessori, la RAM è molto più veloce del flash. Per questi dispositivi, dalla RAM possono essere eseguite piccole routine critiche per la velocità, sebbene di solito la RAM abbia una disponibilità molto più breve rispetto al flash.


2

Un altro caso d'uso per la RAM esegue solo la sicurezza contro bitflip casuali. Usiamo questo modello sul nostro piccolo cubesat perché la scheda madre del computer principale ha un ram ECC che tollera i bit-bit a causa delle radiazioni. L'intero sistema operativo viene caricato in ram come un ramdisk all'avvio viene eseguito completamente in un ambiente ECC.

Il flash non è protetto ECC (standard micro SD card standard) ma abbiamo altri metodi per verificare la corruzione (immagini multiple, checksum ecc.)


Avrei supposto che qualcosa come EEPROM o flash sarebbe molto più "difficile" da diffondere dalle radiazioni, cioè richiedere più energia.
pipe

In effetti è così, ma dal momento che usiamo solo il flash standard senza particolari funzioni ECC, usare ram è molto meglio per questo scopo.
Tejas Kale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.