Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
GELE5343 Chapitre 2 :Revision de la programmation en C
Gabriel Cormier, Ph.D., ing.
Universite de Moncton
Hiver 2013
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 1 / 49
Introduction
Contenu
1 Introduction
2 Flot de programmation
3 Variables et evaluations
4 Boucles
5 Optimisation
6 Compteur
7 Interruptions
8 Ports
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 2 / 49
Introduction
Rappel : C
On s’interesse seulement aux commandes communes deprogrammation pour des microcontroleurs.
Ressources web :
www.cprogramming.comC: WikipediaThe C book
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 3 / 49
Flot de programmation
Flot de programmation
FonctionsDefinitions
Programme principalmain()
DeclarationsInitialisation des fonctions
Commandes de preprocesseur
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 4 / 49
Flot de programmation
Declarations
Commandes avec “#” sont pour le preprocesseur
Preprocesseur : passe a travers le document 1 fois avant de compiler
#include <stdio.h> : Va chercher le contenu du fichier stdio.hpour le placer dans le fichier actuel
#define foo bar : cherche pour foo dans le fichier et le remplacepar bar. Utile pour des constantes.
#pragma : Commandes propres a l’implementation : depend ducompilateur. Si ces commandes ne sont pas comprises par lecompilateur, elles sont ignorees.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 5 / 49
Variables et evaluations
Types de variables
Entiers :
int : entier, a 32 bits. Utilisera 4B en memoire. De −231 a 231 − 1
short : entier a 16 bits (2B en memoire). De −215 a 215 − 1
long long : entier a 64 bits (8B en memoire). De −263 a 263 − 1
unsigned : permet d’avoir des entiers positifs seulement. Ex :unsigned short, de 0 a 65 535
char : pour des caracteres ; 8 bits. Utile pour des compteurs de −128a 127 (ou 0 a 255).
Ex : int i = 22 ou int i = 0x0016 (en hexadecimal)
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 6 / 49
Variables et evaluations
Types de variables
Autres :
float : chiffre a virgule flottante, 32 bits
long double : chiffre a virgule flottante a 64 bits
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 7 / 49
Variables et evaluations
Quel type utiliser ?
Multiplication Bits Cycles Performance relativeInt Float
char 8 6 1 –
short 16 6 1 –
int 32 6 1 –
long long 64 21 3.5 –
float 32 71 11.8 1
long double 64 159 26.5 2.23
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 8 / 49
Variables et evaluations
Vecteurs et matrices
On ajoute des parentheses carrees lors de la declaration.
char c[10] : matrice de 10 entiers de 8 bits
Le premier element est l’element 0 :
Selon l’exemple, on a c[0] a c[9].
Il faut initialiser le vecteur au complet avant de l’utiliser ; on ne peutpas avoir de matrice de dimension inconnue.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 9 / 49
Variables et evaluations
Evaluation de variables
Evaluations logiques
Faux est represente par 0
Vrai est represente par n’importe quel entier sauf 0
|| : operateur OU (OR)
&& : operateur ET (AND)
! : operateur NON (NOT)
Ex : Si a = 17 et b = 1,
a || b est VRAIa && b est VRAI!a est FAUX
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 10 / 49
Variables et evaluations
Comparaison de variables
== “est egal a”
!= “n’est pas egal a”
> “plus grand que”
>= “plus grand ou egal a”
< “plus petit que”
<= “plus petit ou egal a”
Exemple : si a = 10,
a>1 est VRAI-a >= 0 est FAUXa == 17 est FAUXa != 3 est VRAI
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 11 / 49
Variables et evaluations
Incrementation
Deux autres operateurs :
++ :
i++ equivalent a i = i+1
--
i-- equivalent a i = i-1
Peut etre applique avant ou apres une assignation. Ex : soit a = 0 etb = 1 :
a = b++ donne a = 1, b = 2a = ++b donne a = 2, b = 2
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 12 / 49
Boucles
Boucles
Trois types principaux de boucles :
Boucle for
Boucle while
Boucle do - while
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 13 / 49
Boucles
Boucle for
char i ;
f o r ( i =0; i <5; i ++) {// f a i r e q u e l q u e chose// s e r a e x e c u t e pour i = 0 , 1 , 2 , 3 e t 4
}
Les trois arguments :
i=0 : initialise le compteur
i<5 : verifie s’il faut s’arreter avec une expression logique
i++ : incremente le compteur
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 14 / 49
Boucles
Boucle while
whi le ( x ) {// f a i r e q u e l q u e chose
}
x : n’importe quelle expression logique
Le code dans la boucle sera execute aussi longtemps que x est vrai.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 15 / 49
Boucles
Boucle do
do {// f a i r e q u e l q u e chose
} whi le ( x )
x : n’importe quelle expression logique
Le code dans la boucle sera execute 1 fois, puis ensuite aussilongtemps que x est vrai.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 16 / 49
Optimisation
Optimisation du programme
Espace memoire limite sur un microcontroleur
Espace RAM limite
Il faut faire plus attention a la programmation
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 17 / 49
Optimisation
Memoire
Eviter les grosses librairies (ex : printf)
Eviter l’allocation dynamique de memoire
Eviter les structures complexes
Attention aux declarations de variables (ne pas utiliser int si charest suffisant)
Les calculs en virgule flottante sont beaucoup plus longs
Il peut etre plus efficace d’utiliser des tables pour les fonctionscomplexes (sin, cos, etc.) que de faire le calcul directement.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 18 / 49
Compteur
Compteurs
Le PIC32 a 6 compteurs, mais seulement 5 devraient etre utilises.
Le compteur de coeur du CPU ne devrait pas etre utilise (il estcependant accessible).
Les compteurs utilisent l’horloge de peripherique (qui est plus petiteou egale a l’horloge CPU).
Controles par 3 SFR (Special Function Register), ex pour Timer1 :
TMR1 : contient la valeur (16 bit) du compteurT1CON : controle l’activation et le mode d’operationPR1 : Periode du compteur (16 bit : valeur max 65 535)
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 19 / 49
Compteur
Compteurs
Timer1 est 16 bits, Timer2 a Timer5 peuvent etre combines pour 32bits (mais 16 bits par defaut)
Les compteurs utilisent l’horloge de peripherique PBCLK
Il faut regler le diviseur d’horloge FBDIV correctement (valeur pardefaut = 8 ; PBCLK = CLK/8) ;
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 20 / 49
Compteur
Compteurs
T1CON :
7 : 0 TGATE — TCKPS < 1 : 0 > — TSYNC TCS —
15 : 8 TON FRZ SIDL TMWDIS TMWIP — — —
Bit 15/7 Bit 14/6 Bit 13/5 Bit 12/4 Bit 11/3 Bit 10/2 Bit 9/1 Bit 8/0
Les bits 16 a 31 ne sont pas utilises
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 22 / 49
Compteur
Compteur T1
TON : Active le compteur
TCS : Horloge du compteur : 0 = horloge interne
TCKPS : Multiplicateur ; 00 = 1, 01 = 8, 10 = 64, 11 = 256
SIDL : comportement en mode inactif du CPU (0 si pas important)
TSYNC : Synchronisation avec une horloge externe = 1 (0 sinon)
TGATE : Pour horloge externe
FRZ : Pour le debogage (0 par defaut)
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 23 / 49
Compteur
Exemple
Supposons qu’on veut un compteur de periode 0.2s, avec une horloge de36MHz interne.
T =1
fpb×MPS × PRx
ou fpb est la frequence de l’horloge de peripherique, MPS est lemultiplicateur du compteur, et PRx est le nombre de cycles necessaire pouravoir le delai voulu.
0.2 =1
36× 106(256)(PRx)
donc PRx = 28 125.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 24 / 49
Compteur
Exemple (suite)
Avec Timer1 :
TON = 1 : Activer le Timer
TCS = 0 : On utilise l’horloge interne
TCKPS = 11 : Multiplicateur = 256
TGATE = 0, TSYNC = 0 : On utilise l’horloge interne
SIDL = 0 : Mode veille pas important
7 : 0 TGATE — TCKPS < 1 : 0 > — TSYNC TCS —
15 : 8 TON FRZ SIDL TMWDIS TMWIP — — —
Bit 15/7 Bit 14/6 Bit 13/5 Bit 12/4 Bit 11/3 Bit 10/2 Bit 9/1 Bit 8/0
T1CON = 1000 0000 0011 0000
T1CON = 0x8030
PR1 = 28 125Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 25 / 49
Compteur
Compteurs
T2CON :
7 : 0 TGATE TCKPS < 2 : 0 > T32 — TCS —
15 : 8 TON — SIDL — — — — —
Bit 15/7 Bit 14/6 Bit 13/5 Bit 12/4 Bit 11/3 Bit 10/2 Bit 9/1 Bit 8/0
Les bits 16 a 31 ne sont pas utilises. TCKPS est 3 bits pour Timer2-5
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 26 / 49
Compteur
Compteur T2
TON : Active le compteur
TCS : Horloge du compteur : 0 = horloge interne
TCKPS : Multiplicateur ; (valeur a 3 bits)000 = 1, 001 = 2, 010 = 4, 011 = 8100 = 16, 101 = 32, 110 = 64, 111 = 256
SIDL : comportement en mode inactif du CPU (0 si pas important)
T32 : 0 = mode 16 bit, 1 = mode 32 bit
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 27 / 49
Interruptions
Interruptions
Interruption : evenement interne ou externe qui demande rapidementl’attention du CPU
PIC32 : 64 sources d’interruption
L’action a effectuer : ISR (Interrupt Service Routine)
Generalement asynchrone
3 – 4 cycles entre l’interruption et l’action correspondante
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 28 / 49
Interruptions
Exception
Exception : perturbe le fonctionnement normal du programme
Exception
Interruption
Reset
Division par 0
Erreur memoire
· · ·
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 29 / 49
Interruptions
Quelques regles...
Le compilateur s’occupe des procedures complexes d’interruption, si :
Le ISR ne retourne pas de valeur (type void) : asynchrone
Aucun parametre est retourne au ISR (parametre void)
N’est pas appele par d’autres fonctions
Idealement, ne devrait pas appeler d’autres fonctions : rendement
Le langage C n’a pas ete concu pour utiliser des interruptions...
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 30 / 49
Interruptions
Sources d’interruption
Sources externes :
5 pins externes avec detection du niveau
22 pins externes branchees au module de notification de changement
5 entrees Input Capture
5 sorties Output Compare
2 interfaces port serie (UART)
4 interfaces series synchrone (SPI et I2C)
1 port parallele
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 31 / 49
Interruptions
Sources d’interruption
Sources internes :
1 compteur interne 32 bit
5 compteurs internes 16 bit
1 convertisseur analogique-numerique
1 module comparateur analogique
1 horloge et calendrier
1 controleur Flash
1 moniteur d’horloge
2 interruptions logiciel
4 canaux DMA
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 32 / 49
Interruptions
Priorites
Chaque source d’interruption a 7 bits de controle :
Interrupt Enable : -IE ; un seul bit :
0, l’evenement ne genere pas d’interruption ;1, l’interruption peut etre evaluee.
La valeur par defaut est 0 pour toutes les interruptions.
Interrupt Flag : -IF ; un seul bit, est active (valeur 1) chaque fois quel’evenement a lieu, independamment de IE. If faut le remettre a 0manuellement a la fin de la routine d’interruption, sinon l’interruptionest re-activee immediatement.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 33 / 49
Interruptions
Priorites
Group Priority Level : -IP ; il y a 7 niveaux de priorite, de ipl1 aipl7. Si deux interruptions ont lieu en meme temps, celle avec lapriorite la plus elevee est effectuee en premier. Necessite 3 bits. Pardefaut, toutes les interruptions sont a ipl0.
Subpriority Level : 4 niveaux de priorite dans le meme groupe
En cas d’equivalence, le tableau 5.2 pp. 86–88 donne les priorites.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 34 / 49
Interruptions
Declarations
void a t t r i b u t e ( ( i n t e r r u p t ( i p l X ) , v e c t o r ( 0 ) ) )I n t e r r u p t H a n d l e r ( void ) {
// code i c i}
ou
#pragma i n t e r r u p t I n t e r r u p t H a n d l e r i p l X v e c t o r 0void I n t e r r u p t H a n d l e r ( void ) {
// code i c i}
InterruptHandler est le nom de l’interruption
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 35 / 49
Interruptions
Declarations : macros PIC32
void I S R ( 0 , i p l X ) I n t e r r u p t H a n d l e r ( void ) {// code i c i
}
Definit dans sys/attribs.h
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 36 / 49
Interruptions
Librairie
Librairie int.h : #include <int.h>
Plusieurs macros pour simplifier l’implantation
Compris dans #include <plib.h>
Macros commencent par m :
INTEnableSystemSingleVectoredInt() : fonction pour initialisercorrectement le module de controle des interruptions. A utiliser ! ! !mXXSetIntPriority( x) : Assigne le niveau de priorite del’interruption XX. Les abreviations sont donnees dans le tableau 5.2 pp.86 – 88 du manuel.mXXClearIntFlag() : permet de remettre a 0 le IF d’une interruption.
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 37 / 49
Interruptions
Interruption : Exemple
#i n c l u d e <p32xxxx . h>#i n c l u d e <p l i b . h> // i n c l u s macros pour i n t e r r u p t i o n s
i n t count ;
#pragma i n t e r r u p t I n t e r r u p t H a n d l e r i p l 1 v e c t o r 0vo id I n t e r r u p t H a n d l e r ( vo id ) {
count++;m T 2 C l e a r I n t F l a g ( ) ; // −IF = 0
}main ( ) {
PR2 = 1 5 ; // P e r i o d e du compteurT2CON = 0 x8030 ; // C o n t r o l e du compteurm T 2 S e t I n t P r i o r i t y ( 1 ) ; // P r i o r i t e 1 a c a u s e de i p l 1I N T E n a b l e S y s t e m S i n g l e V e c t o r e d I n t ( ) ;mT2IntEnable ( 1 ) ;
whi le ( 1 ) ;}
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 38 / 49
Interruptions
Interruptions multiples
Priorite resout seulement une partie du probleme
Decide seulement laquelle est executee si 2 sont declenchees en memetemps
Si une interruption est deja active, qu’arrive-t’il si une 2e estdeclenchee ?
Par defaut, il faut attendre la fin de l’interruption avant de declencherla 2e.
Parfois une interruption de plus haute priorite doit interrompre une demoindre priorite
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 39 / 49
Interruptions
Interruptions multiples
On doit manuellement reetablir les interruptions aussitot dans le ISR
Necessite une instruction assembleur MIPS
asm("ei") : reactiver les interruptions (enable interrupt)
Verifier par code la source de l’interruption : ex, mT3GetIntFlag()pour verifier si l’interruption liee a Timer3 a ete declenchee
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 40 / 49
Interruptions
Interruptions multiples : Exemple
vo id I S R ( 0 , i p l 1 ) I n t e r r u p t H a n d l e r ( vo id ) {asm ( ” e i ” ) ;i f ( mT3GetIntFlag ( ) ){
// codem T 3 C l e a r I n t F l a g ( ) ;
}e l s e i f ( mT2GetIntFlag ( ) ){
// codem T 2 C l e a r I n t F l a g ( ) ;
}}
main ( ) {PR3 = 2 0 ; // P e r i o d e du compteur 3 ; exemplePR2 = 1 5 ; // P e r i o d e du compteur 2 ; exempleT3CON = 0 x8030 ; // C o n t r o l e du compteurT2CON = 0 x8030 ; // C o n t r o l e du compteurm T 3 S e t I n t P r i o r i t y ( 3 ) ; // P l u s haute p r i o r i t em T 2 S e t I n t P r i o r i t y ( 1 ) ;I N T E n a b l e S y s t e m S i n g l e V e c t o r e d I n t ( ) ;mT3IntEnable ( 1 ) ;mT2IntEnable ( 1 ) ;
wh i l e ( 1 ) ;}
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 41 / 49
Interruptions
Interruptions multiples
Les versions plus recentes du PIC ont les interruptions imbriquees pardefaut
L’exemple precedent n’est plus recommande
La commande asm("ei") est activee par defaut a l’appel de laroutine
On modifie l’appel a la routine :void ISR Single( 0, ipl1) InterruptHandler( void)
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 42 / 49
Interruptions
Interruptions multiples : approche multi-vecteurs
Le PIC32 offre une approche alternative pour gerer des interruptionsmultiples
Vecteurs multiples et registres multiples
Tableau 5.3 pp. 99 – 100 montre les differents vecteurs du PIC32
64 vecteurs pour 96 interruptions (limites dues au MIPS)
Ex : Timer1 : le vecteur est TIMER 1 VECTOR , vecteur no 4
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 43 / 49
Interruptions
Interruptions multiples : approche multi-vecteurs
L’utilisation de vecteurs differents accelere l’application desinterruptions
Pour vitesse max, utiliser ipl7 : registres speciaux
L’approche imbriquee est quand meme valide
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 44 / 49
Interruptions
Interruptions multiples : approche multi-vecteurs : Exemple
vo id I S R ( TIMER 3 VECTOR , i p l 7 ) T 3 I n t e r r u p t H a n d l e r ( vo id ) {// code
m T 3 C l e a r I n t F l a g ( ) ;}
vo id I S R ( TIMER 2 VECTOR , i p l 1 ) T 2 I n t e r r u p t H a n d l e r ( vo id ) {asm ( ” e i ” ) ;
// codem T 2 C l e a r I n t F l a g ( ) ;
}}
main ( ) {PR3 = 2 0 ; // P e r i o d e du compteur 3 ; exemplePR2 = 1 5 ; // P e r i o d e du compteur 2 ; exempleT3CON = 0 x8030 ; // C o n t r o l e du compteurT2CON = 0 x8030 ; // C o n t r o l e du compteurm T 3 S e t I n t P r i o r i t y ( 7 ) ; // P l u s haute p r i o r i t em T 2 S e t I n t P r i o r i t y ( 1 ) ;I N T E n a b l e S y s t e m S i n g l e V e c t o r e d I n t ( ) ;mT3IntEnable ( 1 ) ;mT2IntEnable ( 1 ) ;
wh i l e ( 1 ) ;}
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 45 / 49
Ports
Ports entree-sortie (I/O)
Ports A a G sont programmables I/O
TRISx : direction, 1 = Input, 0 = Output.
Ex : TRISA = 1 veut dire que le port A est en mode entree.
PORTx : lecture / ecriture au port.
Ex : PORTD = 0x0020 veut dire que le bit 5 du port D est haut.
En mode lecture, acceptent jusqu’a 5 V en entree.
En mode sortie, la tension est 3.3 V
Par defaut, les ports sont en mode lecture (Input)
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 46 / 49
Ports
Librairies
La librairie plib.h donne acces a plusieurs macros
Ex : mPORTASetBits( BIT 8 | BIT 10)
Ex : PORTSetBits( IOPORT A, BIT 8 | BIT 10)
Pour regler les ports comme entree ou sortie :
PORTSetPinsDigitalIn(IOPORT x, BIT y)
PORTSetPinsDigitalOut(IOPORT x, BIT y)
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 47 / 49
Ports
Lecture
Fonctions et macros de lecture :
mPORTxRead()
mPORTxReadBits()
PORTRead(IO PORT ID) : lecture de tous les bits
PORTReadBits(IO PORT ID, bits) : lecture des bits specifies
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 48 / 49
Ports
Ecriture
Fonctions et macros d’ecriture :
mPORTxWrite(bits)
mPORTxSetBits(bits)
mPORTxClearBits(bits)
mPORTxToggleBits(bits)
PORTWrite(IO PORT ID) : ecriture de tous les bits
PORTSetBits(IO PORT ID, bits) : ecriture des bits specifies (a 1)
PORTClearBits(IO PORT ID, bits) : ecriture de 0 aux bits specifies
PORTToggleBits(IO PORT ID, bits) : inverse la valeur des bitsspecifies
Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 49 / 49