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