GELE5343 Chapitre 3 : Mémoire
Transcription
GELE5343 Chapitre 3 : Mémoire
GELE5343 Chapitre 3 : Mémoire Gabriel Cormier, Ph.D., ing. Université de Moncton Hiver 2013 Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 1 / 27 Introduction Contenu 1 Introduction 2 Chaı̂ne 3 Allocation de mémoire 4 Pointeurs 5 Bus mémoire 6 Configuration Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 2 / 27 Chaı̂ne Chaı̂nes Chaı̂ne : série de caractères (string) Initialisation (un caractère) : char c = 0x41 ou char c = ’a’ ; Plusieurs caractères : char s[5]: {’H’, ’E’, ’L’, ’L’, ’O’} char s[5]: "HELLO" char s[]: "HELLO" Le code \0 est automatiquement ajouté à la fin de la chaı̂ne (code de fin de chaı̂ne). Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 3 / 27 Chaı̂ne Caractère Peut être utilisé avec des incrémenteurs char c ; c = ’a ’ c++; // c r e p r é s e n t e m a i n t e n a n t ’ b ’ Ne fonctionne pas avec des chaı̂nes char s [ 1 5 ] ; s = ” Hello ! ” ; Gabriel Cormier (UdeM) // E r r e u r ! GELE5343 Chapitre 3 Hiver 2013 4 / 27 Chaı̂ne String.h string.h : manipuler des chaı̂nes strcpy( s, "Hello"); : copier une chaı̂ne dans une autre strcat( s, "World"); : ajouter une chaı̂ne à la fin d’une autre i = strlen( s) : Calcule la longueur de la chaı̂ne Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 5 / 27 Allocation de mémoire Allocation de mémoire Le compilateur génère le code qui manipule les variables. L’éditeur de liens (linker) détermine où les variables sont placées en mémoire (adresse physique) Ex : char s[] = "GELE5343 Systemes" Linker réserve 18 bytes continues en mémoire (dans région data) La valeur d’initialisation est placé dans une table de 18 bytes dans l’espace Flash (dans région rodata) Compilateur crée une routine qui sera appelée avant main() pour copier la valeur en RAM 2x la mémoire est utilisé : 1 fois en Flash et 1 fois en RAM Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 6 / 27 Allocation de mémoire Allocation de mémoire Si la chaı̂ne ne sera pas modifiée, utiliser const Seul l’espace en Flash (rodata) sera utilisé Pas besoin de routine d’initialisation Ne gaspille pas le RAM Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 7 / 27 Allocation de mémoire Table de mémoire Compilateur crée un fichier .map Montre l’allocation en mémoire (valeurs et addresses) Contient : Liste des fichiers inclus Configuration de la mémoire : position et taille de chaque espace mémoire Table de mémoire Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 8 / 27 Allocation de mémoire Table de mémoire Contient : Section .reset : code à exécuter après un reset Section .vector x : pointeurs aux sources d’interruption Section .startup : code d’initialisation Section .text : plusieurs régions, contiennent le code généré par le code source du programme Section .rodata : données constantes (read-only) Section .data : mémoire pour variables globales Section .data1 : autres variables Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 9 / 27 Pointeurs Pointeurs Pointe à l’adresse en mémoire Mécanisme puissant pour manipuler la mémoire Facile de causer des erreurs de mémoire Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 10 / 27 Pointeurs Exemple : int int int ∗ pi ; i; a [10]; // p o i n t e u r // compteur // m a t r i c e f o r ( i =0; i <10; i ++) a[ i ] = i ; pi = a ; // p o i n t e l ’ a d r e s s e de a f o r ( i =0; i <10; i ++) { ∗ pi = i ; p i ++; } Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 11 / 27 Pointeurs Exemple Boucle 1 : Multiplie la valeur de i par la dimension (4 bytes) pour trouver le décalage de l’adresse Ajoute le décalage à l’adresse initiale Assigne la valeur de i en mémoire Boucle 2 : Le pointeur incrémente automatiquement l’adresse Assigne la valeur en mémoire Simplifié à : *pi++ = i; Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 12 / 27 Pointeurs Tas (Heap) Espace mémoire réservé pour les objets alloués dynamiquement Outils dans stdlib.h Fonctions fondamentales : void *malloc(sizet size) : Réserve un bloc mémoire de la dimension demandée et retourne un pointeur à ce bloc void free(void *ptr) : Libère le bloc de mémoire pointé par ptr Pour le PIC32, la quantité de mémoire réservée pour le tas doit être explicitée par le programme ; la valeur par défaut est 0 Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 13 / 27 Bus mémoire Bus mémoire PIC32 : Bus mémoire de type Von Neumann Un bus donne accès à la mémoire de programme (Flash) et à la mémoire de données (RAM) Permet d’exécuter du code de la mémoire RAM Utilise un pipeline à 5 étages et cache pre-fetch pour avoir une instruction par cycle d’horloge Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 14 / 27 Configuration Configuration Le PIC 32 possède plusieurs bits de configuration Utilisés pour les réglages d’horloges (affectent la consommation de puissance) Varient selon le modèle du PIC32 (vérifier les fiches) Appliquées avec commandes #pragma Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 15 / 27 Configuration Horloges Le PIC 32 possède 5 oscillateurs (sources d’horloge) Oscillateur interne (FRC) : pour opération à haute vitesse avec faible consommation de puissance. Ne nécessite aucun composant externe ; 8 MHz±2% Oscillateur à basse fréquence (LPRC) : opération à basse fréquence et faible consommation de puissance. Ne nécessite aucun composant externe ; 32 kHz, faible précision Oscillateur primaire externe (POSC) : opération à haute fréquence et précision. Cristaux de fréqence max 20 MHz peuvent être branchés (OSCI, OSCO) Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 16 / 27 Configuration Horloges Oscillateur secondaire (SOSC) : opération à basse fréquence et faible consommation de puissance. Branchés à SOSCI et SOSCO ; 32.768 kHz, très grande précision Source externe (EC) : permet à un circuit externe de complètement remplacer l’oscillateur Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 17 / 27 Configuration Horloges Contraintes de puissance : La consommation de puissance va déterminer la taille des batteries à utiliser ; pour des applications mobiles, c’est très critique La performance détermine la quantité de travail effectuée par le microcontrôleur Plus la fréquence d’horloge est élevée, plus la consommation de puissance est élevée Ex : le PIC32M4 consomme 11 mA à 4 MHz, mais 64 mA à 72 MHz Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 18 / 27 Configuration Contrôle d’horloges Le PIC32 offre les caractéristiques suivantes : Commutation pendant l’opération entre les sources externes et internes d’oscillateurs Contrôle pendant l’opération des diviseurs d’horloge Contrôle pendant l’opération du circuit PLL (multiplicateur de fréquence) Mode IDLE (inactif), où le CPU est arrêté et les périphériques continuent Mode SLEEP (sommeil), où le CPU et les périphériques sont arrêtés Contrôle du diviseur d’horloge de périphérique (PBCLK) séparément du CPU Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 19 / 27 Configuration Running 147 Oscillateur principal PIC32 So when using the Explorer 16du board or the PIC32 Starter Kit, to respect the first rule we will need to reduce the input frequency from 8 MHz to 4 MHz. Looking at the block diagram in Figure 7.1 or the simplified diagram in Figure 7.3, you will notice how the input divider is conveniently available to us to perform the first frequency reduction. Input Divider 8 MHz 1:2 Output Divider PLL 4 MHz 1 18 72 MHz 1:1 System Clock 72 MHz Figure 7.3: Primary oscillator clock chain. Le PLL nécessite une fréquence ≤4 MHz, donc il faut diviser la The multiplication factor of the PLL fréquence du cristal par 2 can be selected among a number of values ranging from 15 all the way up to 24 and it is controlled by the PLLMULT bits. Since the On contrôle du registre par maximum operating l’ensemble frequency of àthel’aide PIC32MX is (at the 32bit time ofOSCCON, this writing) ou restricted to 75configuration MHz, selecting a#pragma factor of 18 will give 72 MHz, the closest match compatible with the device operating specifications. The output divider block provides us with a final opportunity to manage the clock frequency. When we will need the maximum performance, we will leave the output divider set to a 1:1 ratio. Should our application require it, we will be able to reduce the power consumption by dividing the output Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 20 / 27 (4 MHz). Second, we need to allow it time to stabilize or “lock” before we attempt to Configuration execute code and synchronize with it. A simple control mechanism is provided (via the OSCCON register illustrated in Figure 7.2) to select the frequency multiplication factor Registre OSCCON (PLLMULT) and to verify the proper locking (SLOCK). U-0 — bit 31 U-0 — R/W-x R/W-0 DRMEN bit 23 R-0 SOSCRDY U-0 — U-0 — R-0 R/W-x R/W-x PLLODIV2:0 R/W-x R/W-x R/W-x FRCDIV2:0 bit 24 R/W-x R/W-x PBDIV1:0 R/W-x R/W-x R/W-x PLLMULT2:0 bit 16 R-0 R-0 U-0 R/W-x R/W-x R/W-x NOSC2:0 — COSC2:0 bit 8 bit 15 R/W-0 CLKLOCK bit 7 r-0 — R-0 SLOCK R/W-0 SLPEN R/W-0 CF r-0 — R/W-0 SOSCEN R/W-0 OSWEN bit 0 Figure 7.2: The OSCCON register. Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 21 / 27 Configuration Registre OSCCON Input divider : FRCDIV Effet FRC divisé FRC divisé FRC divisé FRC divisé FRC divisé FRC divisé FRC divisé FRC divisé Gabriel Cormier (UdeM) par par par par par par par par 1 2 (défaut) 3 4 5 6 10 12 Bit 000 001 010 011 100 101 110 111 GELE5343 Chapitre 3 Config (#pragma) FPLLIDIV = DIV 1 FPLLIDIV = DIV 2 FPLLIDIV = DIV 3 FPLLIDIV = DIV 4 FPLLIDIV = DIV 5 FPLLIDIV = DIV 6 FPLLIDIV = DIV 10 FPLLIDIV = DIV 12 Hiver 2013 22 / 27 Configuration Registre OSCCON Multiplicateur PLL : PLLMULT Effet Horloge Horloge Horloge Horloge Horloge Horloge Horloge Horloge Gabriel Cormier (UdeM) multipliée multipliée multipliée multipliée multipliée multipliée multipliée multipliée par par par par par par par par 15 16 17 18 19 20 21 24 Bit 000 001 010 011 100 101 110 111 GELE5343 Chapitre 3 Config (#pragma) PLLMULT = MUL 15 PLLMULT = MUL 16 PLLMULT = MUL 17 PLLMULT = MUL 18 PLLMULT = MUL 19 PLLMULT = MUL 20 PLLMULT = MUL 21 PLLMULT = MUL 24 Hiver 2013 23 / 27 Configuration Registre OSCCON Multiplicateur de sortie : PLLODIV Effet Sortie Sortie Sortie Sortie Sortie Sortie Sortie Sortie PLL PLL PLL PLL PLL PLL PLL PLL Gabriel Cormier (UdeM) divisée divisée divisée divisée divisée divisée divisée divisée par par par par par par par par 1 2 4 8 16 32 64 256 Bit 000 001 010 011 100 101 110 111 GELE5343 Chapitre 3 Config (#pragma) FPLLODIV = DIV 1 FPLLODIV = DIV 2 FPLLODIV = DIV 4 FPLLODIV = DIV 8 FPLLODIV = DIV 16 FPLLODIV = DIV 32 FPLLODIV = DIV 64 FPLLODIV = DIV 256 Hiver 2013 24 / 27 Configuration Registre OSCCON Sélection d’oscillateur : COSC Effet FRC FRC avec PLL Oscillateur principal (XT, HS ou EC) Oscillateur principal avec PLL Oscillateur secondaire (SOSC) Oscillateur interne faible puissance (LPRC) Oscillateur interne rapide divisé par 16 Oscillateur interne rapide divisé par FRCDIV Bit 000 001 010 011 100 101 110 111 Config FNOSC FNOSC FNOSC FNOSC FNOSC FNOSC FNOSC FNOSC (#pragma) = FRC = FRCPLL = PRI = PRIPLL = SOSC = LPRC = FRCDIV16 = FRCDIV Le PIC32 consomme plus de puissance avec le PLL activé Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 25 / 27 Configuration Registre DEVCFG1 Sélection d’oscillateur principal : POSCMD Effet EC (Horloge externe) XT (Résonateur externe) HS (Haute vitesse) Désactivé Gabriel Cormier (UdeM) Bit 00 01 10 11 GELE5343 Chapitre 3 Config (#pragma) POSCMD = EC POSCMD = XT POSCMD = HS POSCMD = OFF Hiver 2013 26 / 27 Configuration Registre DEVCFG1 Configuration de base : #pragma c o n f i g POSCMOD=XT, FNOSC=PRIPLL #pragma c o n f i g FPLLIDIV=DIV 2 , FPLLMUL=MUL 20 #pragma c o n f i g FPLLODIV=DIV 1 On utilise le cristal externe de 8 MHz, divisé par 2 pour entrée au PLL, puis multiplié par 20 (pour obtenir 80 MHz), puis finalement divisé par 1. Gabriel Cormier (UdeM) GELE5343 Chapitre 3 Hiver 2013 27 / 27