Quelles sont les implications de l'utilisation de PROGMEM?

12

Avec de grandes quantités de variables de texte, j'ai trouvé nécessaire de les stocker dans la mémoire Flash à l'aide de PROGMEM . Quelles sont les conséquences positives et négatives du stockage de grandes variables dans Flash (en utilisant PROGMEM) vs SRAM vs EEPROM sur l'Arduino?


la source

Réponses:

10

Voici une comparaison rapide de FLASH, EEPROM et SRAM sur l'AtMega328, le microcontrôleur de la plupart des cartes Arduino actuelles (à l'exception de Due, Leonardo, des Arduinos plus anciens et de certaines autres cartes compatibles).

  • FLASH: 10 000 cycles d'écriture / effacement. L'accès est rapide, mais plus lent que SRAM. Le code accède via PROGMEM.
  • EEPROM: 100 000 cycles d'écriture / effacement. L'accès est lent, en millisecondes. Procédure d'accès relativement complexe.
  • SRAM: cycles d'écriture / effacement illimités. L'accès est très rapide, 2 cycles d'horloge. Accès direct par code.

Ainsi, la principale conséquence négative hypothétique de l'utilisation de PROGMEM est la limite de 10 000 cycles d'écriture . La principale conséquence négative de l'utilisation de l'EEPROM est la complexité du code pour lire / écrire / copier des données. SRAM, sa capacité est juste très limitée .

Anindo Ghosh
la source
Où obtenez-vous les informations sur l'accès EEPROM? D'un peu de recherche au sujet , il semble que l' EEPROM lit prendre quelque chose comme ~ 5 cycles d'horloge. L'écriture est lente, mais pas la lecture.
Connor Wolf
OP veut stocker beaucoup de choses.
Anindo Ghosh
Oui, mais est-ce écrire une fois, en lire plusieurs ou l'inverse? Les "variables de texte" sont probablement quelque chose qui est spécifié au moment de la compilation, gravé sur le périphérique et jamais changé après cela (par exemple, le texte du menu ou le sommat).
Connor Wolf
J'ai lu le magasin dans la question comme "magasin au moment de la compilation / téléchargement". Si une variable est destinée à être utilisée en lecture / écriture au moment de l'exécution, elle ne doit certainement pas être stockée dans FLASH. N'y a-t-il pas la restriction supplémentaire selon laquelle FLASH ne peut pas être modifié sans effacer d'abord la page entière?
microtherion
... les variables de texte et non les constantes de chaîne.
Anindo Ghosh
2

L'implication principale est que vous ne pouvez pas modifier les informations stockées dans PROGMEM. Vous prendrez également un (très petit) coup de performance car la chaîne doit être copiée 1 octet à la fois.

L'usure du FLASH n'est pas une préoccupation (principale) car pour apporter des modifications à votre programme, vous devrez de toute façon reprogrammer le FLASH.

Avec l'introduction IDE 1.x, la macro F () a été incluse. Cela facilite la conservation des chaînes dans PROGMEM.

Par exemple, au lieu d'utiliser: Serial.print ("Hello World!");

Vous pouvez désormais utiliser:

Serial.print (F ("Bonjour tout le monde!");

Notez que F () n'est pas une fonction, c'est juste une macro donc son utilisation est quelque peu limitée.

baldengineer
la source
1

PROGMEM est mieux utilisé pour les données immuables. Si vous voulez continuer à changer rapidement les variables, je les stocke simplement dans la SRAM. D'un autre côté, si vous voulez avoir des variables de texte immuables (par exemple des éléments à afficher) qui ne seront pas récupérées trop souvent, PROGMEM est une excellente idée.

Concernant l'EEPROM - essayez de l'enregistrer pour des éléments persistants. IIRC il est plus lent de récupérer les données de l'EEPROM sur SRAM / PROGMEM. Habituellement, je (et d'autres) copie les données de l'EEPROM vers SRAM (même l' exemple officiel le fait) avant de les utiliser.

Manishearth
la source