Puis-je écrire dans la mémoire flash à l'aide de PROGMEM?


11

Sur la documentation d'Arduino, je cite:

http://playground.arduino.cc/Learning/Memory Remarque: la mémoire Flash (PROGMEM) ne peut être remplie qu'au moment de la gravure du programme. Vous ne pouvez pas modifier> les valeurs dans le flash après le démarrage du programme.

Et sur la description PROGMEM:

http://arduino.cc/en/Reference/PROGMEM Stockez les données dans la mémoire flash (programme) au lieu de SRAM. Il existe une description des différents types de mémoire disponibles sur une carte Arduino.

Le mot clé PROGMEM est un modificateur de variable, il ne doit être utilisé qu'avec les types de données définis dans pgmspace.h. Il indique au compilateur "de mettre ces informations dans la mémoire flash", plutôt que dans SRAM, où elles iraient normalement.

Alors, pouvons-nous ou non? Ou ce n'est pas la même chose?


Bien que vous puissiez écrire dans la mémoire du programme (flash) au moment de l'exécution (à moins qu'elle ne soit verrouillée), le processus est un peu plus complexe et ne peut pas être accompli avec la directive PROGMEM, qui contrôle simplement le processus d'allocation. Si vous voulez voir comment cela peut être fait, regardez la source du chargeur de démarrage.
Chris Stratton

Les blocs d'écriture de page ne rendent pas l'écriture au flash impossible. En fait, son quelque chose attendait avec impatience.
Anothercg Gmail

Réponses:


9

La réponse courte est non: les données PROGMEM sont en lecture seule.

Limitations de la mémoire flash
La première chose à comprendre est que la mémoire flash (où se trouve l'espace du programme) est conçue pour un stockage fixe à long terme. La lecture est très rapide et précise. Cependant, d'une manière générale, vous ne pouvez pas le modifier octet par octet (par exemple en changeant une variable spécifique). Vous devez généralement l'effacer et le réécrire en gros blocs. Cela le rend complètement impraticable pour la manipulation au moment de l'exécution, car vous devrez stocker beaucoup d'informations redondantes ailleurs pendant que vous effectuez le cycle d'effacement et d'écriture.

Ce que fait réellement PROGMEM
Toutes les données littérales spécifiées dans votre code (telles que des chaînes et des nombres) résident toujours dans l'espace programme au départ (c'est-à-dire dans Flash). Cependant, lorsque votre esquisse veut réellement utiliser ces données au moment de l'exécution, il doit normalement lui allouer de l'espace dans SRAM et le copier. Cela signifie que vous vous retrouvez avec deux copies: l'original fixe dans Flash et la copie temporaire dans SRAM.

Lorsque vous utilisez le modificateur PROGMEM, vous lui dites de ne pas faire cette deuxième copie dans SRAM. Au lieu de cela, votre croquis accédera simplement à l'original dans Flash. C'est très utile si vous n'avez qu'à lire les données, car cela évite les opérations d'allocation et de copie.

Cependant, sa copie sur SRAM est essentielle si vous souhaitez modifier les données. Mis à part les limitations de Flash que j'ai mentionnées ci-dessus, c'est aussi une question de sécurité du code.

Si vous êtes en mesure de modifier les données stockées dans l'espace programme, il s'ensuit logiquement que vous pouvez également modifier le code stocké dans l'espace programme. Cela signifierait qu'une simple erreur (ou en théorie une attaque malveillante) pourrait entraîner la réécriture partielle ou complète de votre esquisse au moment de l'exécution. Cela pourrait avoir des résultats très imprévisibles, allant du simple arrêt du travail à l'endommagement / destruction de tout équipement connecté.

Plus d'informations
Vous pouvez en savoir plus sur les trucs PROGMEM de bas niveau ici:

Une ancienne version du même tutoriel PROGMEM est disponible ici:


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.