Posso scrivere sulla memoria flash usando PROGMEM?


11

Sulla documentazione di Arduino, cito:

http://playground.arduino.cc/Learning/Memory Nota: la memoria Flash (PROGMEM) può essere popolata solo al momento della masterizzazione del programma. Non è possibile modificare> i valori nella memoria flash dopo l'avvio del programma.

E sulla descrizione di PROGMEM:

http://arduino.cc/en/Reference/PROGMEM Memorizza i dati nella memoria flash (programma) anziché in SRAM. C'è una descrizione dei vari tipi di memoria disponibili su una scheda Arduino.

La parola chiave PROGMEM è un modificatore di variabile, deve essere utilizzata solo con i tipi di dati definiti in pgmspace.h. Indica al compilatore "metti queste informazioni nella memoria flash", anziché in SRAM, dove andrebbe normalmente.

Quindi possiamo o no? O non è la stessa cosa?


Mentre è possibile scrivere nella memoria del programma (flash) in fase di esecuzione (a meno che non sia bloccato), il processo è un po 'più coinvolto e non può essere realizzato con la direttiva PROGMEM, che in pratica controlla semplicemente il processo di allocazione. Se vuoi vedere come può essere fatto, guarda l'origine del bootloader.
Chris Stratton,

I blocchi di scrittura della pagina non rendono impraticabile la scrittura su Flash. In realtà è qualcosa che non vedeva l'ora.
Anothercg Gmail,

Risposte:


9

La risposta breve è no: i dati PROGMEM sono di sola lettura.

Limitazioni della memoria flash
La prima cosa da capire è che la memoria Flash (dove vive lo spazio del programma) è progettata per l'archiviazione fissa a lungo termine. Leggere da esso è molto veloce e preciso. Tuttavia, in generale, non è possibile modificarlo su una base byte per byte (ad esempio, cambiando una specifica variabile). Di solito devi cancellarlo e riscriverlo in grandi blocchi. Ciò lo rende completamente poco pratico per la manipolazione del runtime, perché dovresti archiviare molte informazioni ridondanti altrove mentre esegui il ciclo di cancellazione e scrittura.

Cosa fa effettivamente PROGMEM
Tutti i dati letterali specificati nel codice (come stringhe e numeri) risiedono sempre inizialmente nello spazio del programma (ovvero in Flash). Tuttavia, quando lo schizzo desidera effettivamente utilizzare tali dati in fase di esecuzione, normalmente deve allocare spazio per esso in SRAM e copiarlo. Ciò significa che si ottengono due copie: l'originale fisso in Flash e la copia temporanea in SRAM.

Quando si utilizza il modificatore PROGMEM, si sta dicendo di non fare quella seconda copia in SRAM. Invece, il tuo schizzo accederà semplicemente all'originale in Flash. È molto utile se devi sempre leggere i dati, poiché evita le operazioni di allocazione e copia.

Tuttavia, copiarlo su SRAM è essenziale se si desidera modificare i dati. A parte le limitazioni di Flash che ho menzionato sopra, è anche una questione di sicurezza del codice.

Se sei in grado di modificare i dati memorizzati nello spazio del programma, ne consegue logicamente che puoi anche modificare il codice memorizzato nello spazio del programma. Ciò significherebbe che un semplice errore (o in teoria un attacco malevolo) potrebbe comportare la riscrittura parziale o totale del tuo schizzo in fase di esecuzione. Ciò potrebbe avere risultati molto imprevedibili, che vanno dal semplice smettere di funzionare, fino a danneggiare / distruggere qualsiasi apparecchiatura collegata.

Ulteriori informazioni
Puoi saperne di più sulle cose PROGMEM di basso livello da qui:

Una versione precedente dello stesso tutorial PROGMEM è disponibile qui:


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.