Cours/TD d informatique embarquée Utilisation d un microcontrôleur MBED Partie 5 Mémoires Memory and data Plan du cours 5.1. Mémoires électroniques 5.2. Mémoire vive (volatile) 5.3. Mémoire de masse (non-volatile) 5.4. Mémoire des processeurs 5.5. Utilisation des fichiers avec mbed 5.6. Utilisation de fprintf CV C/TD INFO2 - Partie 4 page 1
5.1. Mémoires électroniques L'unité de base est : deux états Un circuit électronique bistable permet de stocker une donnée : Autre possibilité : ( 1 ) ( 0 ) Le monde des mémoires se décompose en deux catégories : Les mémoires nécessitent pour conserver l enregistrement des informations. Les mémoires gardent l information même. 5.2 Mémoires volatiles (RAM) est un exemple de mémoire volatiles SRAM ( ) enregistre les données en utilisant des (bascule D par exemple) Nécessite 6 transistors pour 1 bit de donnée Consommation faible, facile à intégrer, peu coûteuse DRAM ( ) utilise pour enregistrer un bit de donnée DRAM plus petite en taille de silicium Nécessite un rafraîchissement de la donnée (la capacité se décharge) toutes les 10~100 ms les accès sont plus rapides qu'avec une SRAM La consommation est plus importante que la SRAM 5.3 Les mémoires non-volatiles (ROM) et PROMs (Programmable ROM) peuvent être programmée une fois seulement. (EPROM) peuvent être reprogrammées (process lent et compliqué) CV C/TD INFO2 - Partie 4 page 2
Electrically Erasable & Programmable Read Only Memory (EEPROM), les données peuvent être effacées, écrites et lues Une (clé USB) est un type Process très rapide pour effacer d où le nom. Inconvénient : la durée de vie est limitée(environ 100000 cycles) 5.3 Mémoires des processeurs Un microprocesseur a besoin de mémoire pour : Stocker Stocker Lors de la mise en marche (ou d un reset) il faut que le programme soit présent et prêt. On utilise donc une mémoire (Flash) La plupart du temps les données n ont pas besoin d être stockées lorsqu on éteint le microcontrôleur (ex: int i=0;), on préfère donc utiliser Rq : Si on veut sauver des données on utilisera la mémoire Flash Il existe 2 principales de processeurs : Architecture 1 seule mémoire = programme + data => accès successifs aux instructions et aux données => plus lent Architecture 2 mémoires = programme & data => accès simultané aux instructions et aux données => plus rapide (mais complexe ) Attention : ce qu on appelle ici «mémoire» peut être constituée de plusieurs types de mémoires (flash+ram+ = 1 mémoire) 5.5 Utilisation des fichiers avec mbed Il peut être utile de stocker des données même lorsque le microcontrôleur est parfois éteint. ex : mesure d une température toute les heures Le programme précise au compilateur où stocker les fichiers. Pour cela on utilise la déclaration de type LocalFileSystem : LocalFileSystem local( ("local"); CV C/TD INFO2 - Partie 4 page 3
Cela autorise à utiliser le même espace que celui où est stocké le programme (MonProgramme.bin) sur le microcontrôleur mbed. Les fonctions standards du langage C peuvent être utilisées pour ouvrir, lire et écrire les fichiers. Résumé des fonctions pour l utilisation des fichier sur mbed Str : chaîne de caractères (présence du caractère \0) Stream : pointeur vers un objet de type fichier, le pointeur est positionné là où sera écrit le prochain caractère Pour ouvrir un fichier : Le pointeur pfile pointe sur le prochain caractère à écrire dans le fichier MonFichier.txt Dans l exemple : "w" précise le mode écriture (écrase si le fichier existe, le crée s'il l n existe pas) "r" : lecture uniquement "a" : écriture à la fin du fichier (le pointeur est donc positionné à la fin de fichier) Remarque : si le fichier n existe pas il sera créé Une fois le traitement terminé, il convient de fermer le fichier avec fclose : Comment écrire des données dans un fichier Pour stocker des données, le plus simple est de stocker des entiers codés sur 1 octet = 1 char. La commande fputc le permet : char donnee_a_ecrire=0x0f; Remarque : à chaque écriture dans le fichier le pointeur pfile se déplace d une case mémoire... Comment lire des données dans un fichier CV C/TD INFO2 - Partie 4 page 4
Exemple : le programme écrit le caractère 0x23 dans un fichier et le sauve sur le mbed. Puis le fichier est ouvert, lu et le caractère est affiché sur le terminal. #include "mbed.h" Serial pc(usbtx,usbrx); LocalFileSystem local("local"); int donnee_a_ecrire; int donnee_lue; int main () { FILE* File1 = fopen("/local/datafile.txt","w"); donnee_a_ecrire =0x23; fputc(donnee_a_ecrire, File1); fclose(file1); FILE* File2 = fopen ("/local/datafile.txt","r"); donnee_lue = fgetc(file2); fclose(file2); pc.printf("input value = %c \n", donnee_lue); Exercice 1 : Commenter, réaliser et tester le programme ci-dessus. Ouvrez le fichier datafile.txt avec NotePad et vérifier le contenu. Exemple : Le programme écrit puis lit une chaîne de caractères avec les fonctions fgets et fputs #include "mbed.h" Serial pc(usbtx,usbrx); LocalFileSystem local("local"); char read_string[64]; int main () { FILE* File1 = fopen("/local/textfile.txt","w"); fputs("beaucoup de mots et de lettres...", File1); fclose(file1); FILE* File2 = fopen ("/local/textfile.txt","r"); fgets(read_string,256,file2); fclose(file2); pc.printf("text data: %s \n",read_string); Exercice 2 : Commenter, réaliser et tester le programme ci-dessus. Ouvrez le fichier textfile.txt avec NotePad et vérifier le contenu. CV C/TD INFO2 - Partie 4 page 5
5.6 Utilisation de fprintf fprintf permet de formater les données lors de l écriture (%c, %d ) Cette fonction est très similaire au printf, il faut juste passer un paramètre supplémentaire : un pointeur vers un fichier. fprintf(pfile,"la valeur de i est : %d",i); Nous l utiliserons pour stocker dans un fichier des données telles que : temps, valeurs de capteurs Exemple d'utilisation : #include "mbed.h" InterruptIn button(p30); DigitalOut led1(led1); Timer debounce; LocalFileSystem local("local"); void toggle(void); int main() { button.mode(pullup); debounce.start(); button.rise(&toggle); while(1); void toggle() { if (debounce.read_ms()>200) { led1.write(!led1.read()); FILE* pfile = fopen ("/local/log.txt","a"); fprintf(pfile,"time=%.3fs: setting led=%d\n\r",debounce.read(),led1.read()); fclose(pfile); // close file debounce.reset(); // reset debounce timer Exercice 3 : Que réalise le programme ci-dessus? Commenter, réaliser et tester le programme ci-dessus. Ouvrez le fichier log.txt avec NotePad et vérifier le contenu. Exercice 4 : Créer un programme qui utilise le terminal (teraterm), l'utilisateur saisit un texte dans la console et lorsqu'il appuie sur "entrée" le programme récupère la chaîne de caractère et l'enregistre dans un fichier. CV C/TD INFO2 - Partie 4 page 6
Exercice 5 : Créer un programme qui enregistre pendant 5 secondes la donnée d'une entrée analogique (affichage sur la console + enregistrement dans un fichier). Utiliser un potentiomètre pour faire varier la grandeur analogique. Remarque : Il sera nécessaire de définir une période d'échantillonnage entre 2 enregistrements de la donnée, disons 100ms. Assurez vous que 100ms sont suffisantes (lister les opérations à effectuer dans cet intervalle de 100ms). Exercice 6 : Créer un programme similaire, mais remplacer le potentiomètre par un capteur (luminosité, température, ou distance). Diminuer au maximum la période d'échantillonnage, ne faites plus l'affichage sur la console. CV C/TD INFO2 - Partie 4 page 7
Questions de cours : Q1) Expliquer ce que sont les mémoires volatiles et non-volatiles Q2) Expliquer ce que sont les bus de donnée et les bus d'adresse Q3) Expliquer la principale différence entre une architecture Harvard et une architecture Von Neumann Q4) Qu'est qu'une mémoire Flash? Q5) Si on écrit FILE* pfile = fopen("/local/monfichier.txt","w"); où se positionne le pointeur? Q6) Si on écrit FILE* pfile = fopen("/local/monfichier.txt","a"); où se positionne le pointeur? Q7) Quelle fonction me permet de me positionner à un endroit spécifique d'un fichier? Q8)Quel est l'intérêt de stocker des données dans un fichier sur le mbed? CV C/TD INFO2 - Partie 4 page 8