49
GELE5343 Chapitre 2 : evision de la programmation en C Gabriel Cormier, Ph.D., ing. Universit´ e de Moncton Hiver 2013 Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 1 / 49

GELE5343 Chapitre 2 : Révision de la programmation en C · 2013-04-16 · GELE5343 Chapitre 2 : R evision de la programmation en C Gabriel Cormier, Ph.D., ing. Universit e de Moncton

  • 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

Gabriel Cormier (UdeM) GELE5343 Chapitre 2 Hiver 2013 21 / 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