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?
la source
Réponses:
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:
la source