Stocker des données dans la mémoire programme

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

Les différentes mémoires

Il existe trois types de mémoires dans les microcontrôleurs utilisés dans les cartes Arduino. (Atméga 168 / 328 etc …)

  • La mémoire FLASH ou mémoire programme est la mémoire dans laquelle est stockée le programme que vous avez composé.
  • La mémoire SRAM ou mémoire vive est la mémoire ou le programme stocke et gère les variables lorsqu'il s'exécute.
  • La mémoire EEPROM est la mémoire dans laquelle le programmeur peut stocker des données qui ne seront pas effacées après la mise hors tension de la carte.

La mémoire SRAM ne peut contenir que très peu de données 1Ko ou 2Ko selon le microcontrôleur. Si nous devons accéder à un tableau de grande dimension, nous serons vite limité. L'espace de stockage de la mémoire FLASH peut être utilisé, il faut cependant garder à l'esprit que ne seront stocké que des données non modifiables.

Pour forcer le compilateur à stocker le tableau dans l'espace programme, il faut utiliser le mot-clef PROGMEM lors de la déclaration de la donnée. const uint8_t tableau[tailleTableau] PROGMEM = {0, 0, 0, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2};

Cet attribut est déclaré dans le fichier d'en-tête, <avr/pgmspace.h>, pour cela il faut utiliser la directive include

  1. include <avr/pgmspace.h>

Pour accéder à ces données, il existe une méthode, prgm_read_byte() : byte valeur = pgm_read_byte(&tableau[compteur]);

Pour les entiers qui sont stockés sur deux octets il est nécessaire d'utiliser la méthode pgm_read_word.

Le paramètre passé à cette méthode est une adresse, d'où le caractère & avant le nom de la donnée.

Un exemple fonctionnel

Fichier:Verin.zip

Liens externes

Description des mémoires de l'Arduino : http://arduino.cc/fr/Main/ApprendreMemoire

Tutoriel GCC et l'attribut PROGMEM : http://deans-avr-tutorials.googlecode.com/svn/trunk/Progmem/Output/Progmem.pdf

Détail de pgmspace de la librairie AVR libc : http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html