Quali sono le implicazioni dell'utilizzo di PROGMEM?


12

Con grandi quantità di variabili di testo, ho trovato necessario memorizzarle nella memoria Flash usando PROGMEM . Quali sono le conseguenze positive e negative della memorizzazione di grandi variabili in Flash (usando PROGMEM) vs SRAM vs EEPROM su Arduino?

Risposte:


10

Ecco un rapido confronto tra FLASH, EEPROM e SRAM su AtMega328, il microcontrollore in molte delle attuali schede Arduino (esclusi Due, Leonardo, Arduinos precedenti e alcune altre schede compatibili).

  • FLASH: 10.000 cicli di scrittura / cancellazione. L'accesso è veloce, ma più lento di SRAM. Accesso al codice tramite PROGMEM.
  • EEPROM: 100.000 cicli di scrittura / cancellazione. L'accesso è slooooooow, in millisecondi. Procedura di accesso relativamente complessa.
  • SRAM: cicli illimitati di scrittura / cancellazione. L'accesso è molto veloce, 2 cicli di clock. Accesso diretto tramite codice.

Pertanto, la principale ipotetica conseguenza negativa dell'utilizzo di PROGMEM è il limite del ciclo di scrittura di 10.000 . La conseguenza negativa chiave dell'utilizzo di EEPROM è la complessità del codice per leggere / scrivere / copiare i dati. SRAM, ha una capacità molto limitata .


Dove stai ottenendo le informazioni sull'accesso EEPROM? Da un po 'di ricerca su , sembra che EEPROM legge prendere qualcosa come cicli di clock ~ 5. La scrittura è lenta, ma non la lettura.
Connor Wolf,

OP vuole archiviare molte cose.
Anindo Ghosh,

Sì, ma è quello che scrivi una volta, leggi molti o il contrario? Le "variabili di testo" sono probabilmente qualcosa che viene specificato al momento della compilazione, masterizzato sul dispositivo e che non è mai stato modificato successivamente (ad es. Testo del menu o sommat).
Connor Wolf,

Ho letto lo store nella domanda come "store at compilation / upload time". Se una variabile deve essere utilizzata in lettura / scrittura in fase di esecuzione, sicuramente non deve essere memorizzata in FLASH. Non esiste la restrizione aggiuntiva che FLASH non può essere modificato senza prima cancellare l'intera pagina?
microtherion,

... variabili di testo non costanti di stringa.
Anindo Ghosh,

2

L'implicazione principale è che non è possibile modificare le informazioni memorizzate in PROGMEM. Subirai anche un hit di prestazione (molto piccolo) poiché la stringa deve essere copiata 1 byte alla volta.

L'usura del FLASH non è una preoccupazione (primaria) poiché per apportare modifiche al programma è necessario riprogrammare il FLASH comunque.

Con l'introduzione IDE 1.x è stata inclusa la macro F (). Ciò semplifica il mantenimento delle stringhe in PROGMEM.

Ad esempio invece di usare: Serial.print ("Hello World!");

Ora puoi usare:

Serial.print (F ("Hello World!");

Nota che F () non è una funzione, è solo una macro, quindi il suo uso è alquanto limitato.


1

PROGMEM è utilizzato al meglio per dati immutabili. Se continuerai a cambiare rapidamente le variabili, la memorizzerei semplicemente nella SRAM. D'altra parte, se si desidera avere alcune variabili di testo immutabili (ad es. Elementi da visualizzare) che non verranno recuperati troppo spesso, PROGMEM è un'ottima idea.

Riguardo a EEPROM - prova a salvarlo per cose persistenti. IIRC è più lento recuperare i dati da EEPROM su SRAM / PROGMEM. Di solito io (e altri) copio i dati da EEPROM su SRAM (anche l' esempio ufficiale fa questo) prima di usarli.

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.