Flash e RAM: esecuzione del codice


13

Di recente ho iniziato a studiare assembly e sono venuto a conoscenza degli script dei linker e di altri dettagli di basso livello della programmazione hardware. Sto anche insegnando a me stesso l'architettura del computer e da qualche parte lungo la linea ho avuto paura che la mia immagine del modello di memoria potesse essere stata sbagliata da sempre.

Secondo quello che ho capito attualmente, tutto il codice e i dati risiedono sulla memoria non volatile subito dopo aver "masterizzato" il binario su un processore: la RAM volatile non contiene nulla al momento del ripristino. Quando il programma inizia a "eseguirsi", lo fa dall'indirizzo 0x0000 che è quasi sempre (AFAIK) l'indirizzo più basso in Flash. Pertanto, le istruzioni vengono bloccate sul bus che collega Flash al core della CPU ed è qui che avviene l'esecuzione effettiva. Tuttavia, quando parliamo della CPU che recupera o memorizza dati dalla memoria, di solito parliamo di RAM - Sono consapevole che possiamo leggere / scrivere anche dati dalla memoria del programma (l'ho visto fatto su AVR) ma non è così comune? È perché la RAM è più veloce della ROM che preferiamo archiviare i dati lì?

La risposta accettata a questa domanda afferma che la maggior parte dei pezzi di codice viene eseguita dalla RAM.

Questo significa che il codice di runtime di avvio (che viene eseguito da Flash) deve copiare tutti i codici operativi del programma da Flash a RAM e in qualche modo mappa gli indirizzi in Flash per puntare alla RAM in modo che la CPU recuperi i codici operativi da lì? È simile al processo in cui spostiamo le sezioni .data dalla ROM alla RAM all'avvio?

Posso immaginare che ciò sia più semplice nelle architetture von Neumann in cui il programma e le memorie dei dati condividono un bus, ma nelle architetture di Harvard non significherebbe che tutto il codice e i dati devono passare prima attraverso i registri della CPU?

Come probabilmente puoi immaginare, sono un po 'troppo confuso da tutta questa faccenda. Avendo sempre programmato a un livello di astrazione più elevato, sono facilmente turbato da tali dettagli. Qualsiasi aiuto è apprezzato.


2
Nei microcontrollori semplici non è necessario copiare dalla memoria del programma (spesso flash oggigiorno) alla RAM per eseguire.
David

È tutto perché una RAM è più veloce di Flash, ma poiché perde dati dopo l'interruzione dell'alimentazione, arriva la memoria non volatile Flash. All'accensione, i dati vengono caricati da Flash a RAM e la CPU inizia a funzionare, tutto ciò che si ripete.
Lazar

Risposte:


13

Questo dipende dal dispositivo.

La RAM può essere costruita più velocemente di Flash; questo inizia a diventare importante in una gamma di circa 100 MHz.

Microcontrollori semplici

Piccoli microcontrollori lenti vengono eseguiti direttamente da Flash. Questi sistemi di solito hanno anche più Flash di SRAM.

Sistemi di fascia media

Una volta che il dispositivo diventa più veloce, la situazione è leggermente diversa. Anche i sistemi ARM di fascia media possono farlo, oppure possono avere un bootloader ROM maschera che fa qualcosa di più intelligente: forse il download di codice da USB o EEPROM esterne nella SRAM interna.

Sistemi di grandi dimensioni

I sistemi più grandi e più veloci avranno DRAM esterna e Flash esterno. Questo è tipico dell'architettura di un telefono cellulare. A questo punto, c'è molta RAM disponibile ed è più veloce di Flash, quindi il bootloader lo copia ed esegue. Ciò può comportare la pala attraverso i registri della CPU o può comportare un trasferimento DMA se è disponibile un'unità DMA.

Le architetture di Harvard sono in genere piccole, quindi non preoccuparti della fase di copia. Ho visto un ARM con "ibrido harvard", che è un singolo spazio di indirizzi contenente vari ricordi ma due diverse unità di recupero. Codice e dati possono essere recuperati in parallelo, purché non provengano dalla stessa memoria. Quindi puoi recuperare il codice da Flash e i dati dalla SRAM, oppure il codice dalla SRAM e i dati dalla DRAM ecc.


1

La RAM è generalmente più veloce del flash, ma non importa fino a quando non raggiungi una velocità di clock superiore a 80-100 MHz o giù di lì - fintanto che il tempo di accesso al flash è più veloce del tempo necessario per eseguire un'istruzione, non dovrebbe importare.

La costruzione fisica della RAM ci consente di costruire dispositivi molto veloci; molto più veloce del flash. A questo punto, ha senso copiare blocchi di codice nella RAM prima dell'esecuzione. Ciò comporta anche ulteriori vantaggi per lo sviluppatore, ad esempio la possibilità di modificare il codice in fase di esecuzione.

nelle architetture von Neumann in cui il programma e le memorie dei dati condividono un bus ma nelle architetture di Harvard questo non significherebbe che tutto il codice e i dati devono passare prima attraverso i registri della CPU?

Non necessariamente. È qui che entra in gioco l' indirizzamento virtuale . Invece del codice di programma che fa riferimento agli indirizzi RAM dell'hardware grezzo, fa effettivamente riferimento a uno spazio di indirizzi virtuali. I blocchi di spazio degli indirizzi virtuali vengono mappati su dispositivi di memoria fisica, che possono essere RAM, ROM, flash o persino buffer di dispositivo.

Ad esempio, quando si fa riferimento all'indirizzo 0x000f0004 su un micro, si potrebbe leggere l'indirizzo 0x0004 dal flash. L' indirizzo virtuale è 0x000f0004, ma l'indirizzo fisico è solo 0x0004: l'intero spazio degli indirizzi 0x000fxxxx è mappato su un dispositivo di memoria fisica 4KB. Questo è solo un esempio, ovviamente, e il metodo di gestione e organizzazione dello spazio di indirizzi virtuali differisce notevolmente tra le architetture.

Pertanto, quando si afferma che "il programma inizia a [...] eseguire dall'indirizzo 0x0000 che è quasi sempre l'indirizzo più basso in flash", non si garantisce che sia corretto. In effetti, molti microcontrollori iniziano a 0x1000.


3
Avrei detto che la distinzione diventa rilevante intorno a 20-40 MHz, non a 100 MHz, poiché la maggior parte dei dispositivi flash che ho visto iniziano a richiedere uno stato di attesa attorno a quel punto. In molti casi, il codice flash includerà i circuiti in modo che ogni recupero catturi più parole di istruzione, in modo che per molti tipi di codice la "penalità" per l'esecuzione da flash sarà solo del 5-10% circa, ma per alcuni altri tipi di codice (ad es. con molti salti) la penalità può essere molto più severa.
supercat

Non si tratta di indirizzamento virtuale, ma di I / O mappati in memoria (la regione di memoria si associa a I / O usando una periferica, il nome su molte MCU è "Static Memory Controller"). Naturalmente, l'I / O raggiunge un'altra memoria, quindi a volte non la consideriamo come I / O. Ma sicuramente non è un mapping di memoria virtuale.
Ben Voigt,

1

Quello che stai dicendo non è completamente vero o falso. Esistono diversi scenari per questo.

Dipende se stai programmando sull'hardware grezzo o sull'hardware installato con il sistema operativo.

Il sistema operativo in esecuzione sul computer per uso generico recupera il codice dall'HDD e lo memorizza nella RAM per un accesso più rapido. Se il processore tenta di recuperare direttamente dall'HDD su base continuativa, le operazioni sarebbero molto più lente a causa della mancata corrispondenza della velocità tra due. Quindi la tua RAM entra in gioco dove è memorizzato un pezzo del tuo codice ripetitivo per un accesso più veloce. E anche questo è reso ancora più disponibile nella memoria cache dei processori per renderlo ancora più veloce.

Ora, quando si lavora su un microcontrollore, dipende totalmente da dove si trovano i dati sul chip. Se i dati sono statici, potresti volerli localizzare nella memoria del codice che salverà la tua RAM che è relativamente più piccola della memoria del codice. Nel linguaggio C quando si inizializza il tipo di dati utilizzando statico o in alcuni prefissi const del compilatore i dati verranno archiviati nella memoria del codice oppure verranno archiviati nella RAM. E nell'assembly si utilizza direttamente DB (Define Byte in caso di Basic 8051) per inizializzare i dati in una posizione particolare. Ora anche in alcuni controller come PIC ARM è possibile scrivere ROM in fase di esecuzione ma il recupero dei dati richiederà molto tempo.

Inoltre ci sono hardware di boot loader di livello medio e controller sofisticati che indicano ai controller o al processore da dove eseguire il codice di avvio o è esso stesso il codice di avvio che è effettivamente segmentato nella memoria Quindi ci sono molte possibilità di avanzamento , Preferirei dire il sostegno ibrido nel settore che mescola l'intero concetto di RAM ROM e memorie convenzionali. Quindi fondamentalmente la tua confusione è valida.

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.