Cours - Programmation C pour systèmes embarqués.pdf
-
Upload
hichem-taghouti -
Category
Documents
-
view
221 -
download
0
Transcript of Cours - Programmation C pour systèmes embarqués.pdf
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
1/53
Programmation C poursystmes embarqus
Sylvain [email protected]
Btiment chablais, bureau 1304 79 75 86 86
Retrouver tous les documents de Cours/TD/TP sur le site
www.master-electronique.com
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
2/53
Universit de Savoie 2
Prsentation des cours : Sommaire
z Cours : 10.5 h en 7 sancesz 1re partie : Rappel sur le langage C (exercices de base)
z 2me partie : La programmation en langage C avance
z 3me partie : Implmentation de code sur cibleembarque (DSP TMS 320C5416)
z 4me partie : Prsentation du TP : Ralisation dunalgorithme de compression de donnes.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
3/53
Universit de Savoie 3
Prsentation TPzTD : 20 h en 5 sances
Le but de ce projet est d'crire un programme decompression de fichiers textes, sans perte d'information.On demande galement d'crire un dcompresseur quidevra restaurer le fichier original.
Lalgorithme propos ici est l'algorithme de Huffman.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
4/53
Universit de Savoie 4
Examen
z Une note :
z 14 points : Le droulement du TP/Projet jusqu lasoutenance.z 6 points sur la soutenance (prsentation de votre
projet et de lintgration sur le DSP)
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
5/53
Universit de Savoie 5
1re partie : Rappel sur le langage C
(exercices de base)z Donner lexcution du code suivant :
#i ncl ude #i ncl ude
int mai n(void){unsigned char i ;unsigned char t ab[ 5] ={1, 2, 4, 8, 16};
for (i =0; i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
6/53
Universit de Savoie 6
1re partie : Rappel sur le langage C
(exercices de base)z Donner lexcution du code suivant :
#i ncl ude
i nt mai n() {int i ,j ;
for(i =0; i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
7/53
Universit de Savoie 7
1re partie : Rappel sur le langage C
(exercices de base)z crire une fonction C calculant la longueur d'une
chane de caractres, donne en argument. Leprototype de la fonction est le suivant :
int longueur(char *s)
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
8/53
Universit de Savoie 8
1re partie : Rappel sur le langage C
(exercices de base)z crire une fonction C calculant la longueur d'une
chane de caractres, donne en argument.
#i ncl ude
int l ongueur (char *s) {int n = 0;
while (s[n] ! = ' \ 0' ) {n++;}
return n;}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
9/53
Universit de Savoie 9
1re partie : Rappel sur le langage C
(exercices de base)Soit un texte donn par une chane de caractres. Lebut est de compter le nombre d'occurrences dechaque lettre minuscule.
z Question 1 : Raliser les dclarations suivantes :z Le texte (chane de caractre constante) sera dclar dans un
tableau nomm ch . Vous afficherez la chane de caractre lcran.z Un tableau d'entiers statique nomm occ . pour compter
les occurrences de chaque lettre de lalphabet dont la taille
est fixe par une constante (correspondant au nombre delettre de lalphabet).z Un pointeur nomm p pour parcourir le texte.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
10/53
Universit de Savoie 10
1re partie : Rappel sur le langage C
(exercices de base)
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
11/53
Universit de Savoie 11
1re partie : Rappel sur le langage C
(exercices de base)#i ncl ude #def i ne NB_LETTRE 26;
voidmai n(void) {
/* dclaration d'une chane tableau de caractres. */
char ch[]="ceci est une cha ne de t est " ;
/* dclaration d'un pointeur sur une chane de caracteres. */
char *p = ch;
/* dclaration d'un tableau de 26 cases */
int occ[NB_LETTRE];
printf("Cha ne en mmoi r e : %s\ n", ch);}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
12/53
Universit de Savoie 12
1re partie : Rappel sur le langage C
(exercices de base)z Question 2 : Initialiser le tableau doccurrence
zro :
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
13/53
Universit de Savoie 13
1re partie : Rappel sur le langage C
(exercices de base)z Question 2 : Initialiser le tableau doccurrence
zro :
/* initialisation du tableau des occurrences 0. */
int i =0;
for (i =0; i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
14/53
Universit de Savoie 14
1re partie : Rappel sur le langage C
(exercices de base)z Question 3 : Compter les occurrences jusqu
la fin de la chane de caractre :
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
15/53
Universit de Savoie 15
1re partie : Rappel sur le langage C
(exercices de base)z Question 3 : Compter les occurrences jusqu
la fin de la chane de caractre :
/* parcours de la chane jusquau \0 */
while (*p ! = ' \ 0' ){
if ( ( *p >= ' a ) && ( *p
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
16/53
Universit de Savoie 16
1re partie : Rappel sur le langage C
(exercices de base)z Question 4 : Afficher le contenu du tableau occ
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
17/53
Universit de Savoie 17
1re partie : Rappel sur le langage C
(exercices de base)z Question 4 : Afficher le contenu du tableau occ
for (i =0; i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
18/53
18
2me partie : La programmation en
langage C avancez Lisibilit du code,z les types de variables,z
les typedef,z occupation mmoire,z port des variables,z les oprateurs,z
manipulation de registre,z les structures,z les pointeurs,z le main(),z
pointeurs,z la pile,z type de fonction,z allocation dynamique,z
les options doptimisations la compilation,z les erreurs classiques du C
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
19/53
Universit de Savoie 19
Lisibilit du code C
z Exercice :Raliser un code qui imprime les N premierslments d'un tableau dentier A[] en insrantun espace entre les lments et en
commenant une nouvelle ligne aprs chaquedixime chiffre.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
20/53
Universit de Savoie 20
Lisibilit du code C
void main(void){
int A[80],N,i;
scanf(%d,&N);
for (i=0; i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
21/53
Universit de Savoie 21
Lisibilit du code C
zVoici une deuxime faon de coder, trspratique mais beaucoup moins lisible.
void main(void){int A[80],N,i;
scanf(%d,&N);
for (i=0; i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
22/53
Universit de Savoie 22
Lisibilit du code C
z Quelques quivalences parfois viter
Op. Fonction Exemple Equivalence+= Addition et
affectation
nombre += 5; nombr e=nombr e+5
-= Soustraction et
affectation
nombr e - = 6;
*= Multiplication
et affection
nombr e *= 3;
/= Division et
affectation
nombr e / = 2;
%= Modulo et
affectation
nombr e %= 4; nombr e = nombr e % 4
++ Incrmentation nombr e++; nombr e = nombr e + 1;
-- Dcrmentation nombre- - ; nombre = nombre - 1;
y = x++ y = xx = x + 1
y = ++x x = x + 1y = x
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
23/53
Universit de Savoie 23
Lisibilit du code C#include main(t,_,a)char*a;{return!0
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
24/53
Universit de Savoie 24
Lisibilit du code C
z Rgle respecter :z Mettre des commentaires explicitesz Ne pas trop compresser le codez Respecter une homognit dans votre faon de
coder.z Organiser la mise en page de votre code, ou
respecter celle dj existante.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
25/53
Universit de Savoie 25
Les types de variables
z char = 1 octet (signed ou unsigned)
z Int, long, double, float dpendent de la cible processeur utilise.
Afin de connatre la taille (en octet) dune variable, on
utilise la fonction sizeof() :z printf( int=%d octets , sizeof(int));
Note : Il nexiste pas de type Boolen en C
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
26/53
Universit de Savoie 26
Les types de variables
z Cas dune compilation pour processeur 32 bits
z Voir le cas dun compilateur C pour PIC16F ou PIC18F (microchip)
z Voir le cas dun compilateur C pour DSP TMS320 (TexasInstruments) (page suivante)
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
27/53
Universit de Savoie 27
Les types de variables
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
28/53
Universit de Savoie 28
Les types de variables
z Donner la reprsentation binaire des nombres suivants :z char a=64;z unsigned char b=64;z char c=128;z unsigned char d=128;
z
Quel est laffichage des fonctions suivantes?z printf(%d , a);z printf(%d , c);z printf(%u , a);z printf(%u , c+a);
Note : Une dclaration est signed par dfaut.Note : %d -> entier signed / %u -> entier unsigned
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
29/53
Universit de Savoie 29
Les types de variables
z Conversion explicite :La conversion de type consiste transformer un type de valeur enun autre, en respectant la syntaxe suivante()
z Conversion implicite :Lorsque les deux oprandes sont de type diffrent, le compilateurprvoit une conversion implicite suivant l'ordre :{ char -> int -> long -> float -> double } et { signed ->
unsigned }
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
30/53
Universit de Savoie 30
Les types de variables
Dcrivez le conversion du type, ainsi que lesaffectations du code suivant :
i nt mai n( voi d){i nt n, m, l ;doubl e d;d = 5;
n = ( i nt ) 3. 4;n = 1;m = 5;d = 2;l = ( i nt ) ( m / d) ;d = n / m;d = n / ( ( doubl e) m) ;d = ' A' * 6. 0 m + 0xA2CL;r et ur n 0;
}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
31/53
Universit de Savoie 31
Porte des variables
z static : permet une variable locale dtre persistante et donc deconserver sa valeur pendant les appels successifs de la fonction.
#i ncl ude
voidf(void) {
static int i = 0; /* i ne sera initialis quune fois*/
int j = 0; /* j sera initialis chaque fois */;
i ++;
j ++;printf(" i vaut %d et j vaut %d. \ n" , i , j );
}
int mai n(void) {
f();
f();
f();
return 0;
}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
32/53
Universit de Savoie 32
Porte des variables
z static : Cas des variables globales.
Une variable globale est dj persistante. Lobjectif de la nommer en static est simplement de la privatiser au fichier o elle estdclare. Cest--dire quelle ne pourra pas tre utilise depuis un autre
fichier.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
33/53
33
Porte des variables
z extern : permet de spcifier que la variable a t dclarer dansun autre fichier. Si on omet ce terme, une nouvelle variable estcrer avec une nouvelle allocation mmoire.
/* File : ext.c */
#i ncl ude
voi d next ( voi d) ;voi d next 1( voi d) ;i nt a1=1; / * def i ni t i on of ext er nal ( non st at i c) */
voi d mai n( voi d) {
a1=2;pr i nt f ( "a1=%d\ n" , a1) ; / / a1=2next();next 1( ) ;pr i nt f ( "a1=%d\ n, a1) ;
}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
34/53
34
Porte des variables
/* File file1.c */
i nt b1=0;voi d next ( voi d){
char a1;a1=' a' ;b1=77;
}
/* File file2.c */
ext er n i nt a1;
voi d next 1( voi d){f l oat b1;b1=19. 2;a1=13;
}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
35/53
Universit de Savoie 35
Qualificateur de variables
z Le C dfinit des qualificateurs pouvant influer sur unevariable :
z const : pour dfinir une variable dont la valeur ne devrait jamaischanger ;
z volatile : dsigne une variable pouvant tre modifie notamment
par une source externe indpendante du programme.
Une variable peut avoir plusieurs qualificateurs
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
36/53
Universit de Savoie 36
Qualificateur de variables
Qualificateur 'const'La classe const indique au compilateur que la valeur de la
variable ne doit pas changer. Il est donc impratif d'assigner unevaleur la dclaration de la variable, sans quoi toute tentative demodification ultrieure entranera une erreur de la part ducompilateur :
tudier les codes suivants :
const int i = 0;i = 1;
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
37/53
Universit de Savoie 37
Qualificateur de variables
char * const poi nt eur = "Sal ut t out l e monde ! " ;poi nt eur = "Hel l o wor l d ! " ;
voidf onct i on( const char * poi nt eur )
{ poi nt eur [0] = 0;poi nt eur = "Nouvel l e cha ne de car act r es" ;
}
const char * const poi nt eur = "Sal ut t out l e monde ! " ;poi nt eur = "Hel l o wor l d ! " ;
poi nt eur [0] = 0;
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
38/53
Universit de Savoie 38
Qualificateur de variables
Qualificateur 'volatile'
Ce mot-cl sert spcifier au compilateur que la variable peuttre modifie son insu. Cela annule toute optimisation que lecompilateur pourrait faire, et l'oblige procder chaque lectureou criture dans une telle variable tel que le programmeur l'acrit dans le code.
z On peut combiner const et volatile dans certaines situations. Parexemple :
extern const volatile int horloge_temps_reel;>>dclare une variable entire, qu'on ne peut modifier partir duprogramme, mais dont la valeur peut changer quand mme. Elle pourraitdsigner une valeur incrmente rgulirement par une horloge interne.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
39/53
Universit de Savoie 39
valuation des expressions boolennes (1)
z Le C ne possde pas de type boolen ddi. Dans ce langage,n'importe quelle valeur diffrente de zro est considre vraie,zro tant considr comme faux. Ce qui veut dire que n'importe
quelle expression peut tre utilise l'intrieur des tests (entier,rels, pointeurs, tableaux, etc.). Cela peut conduire desexpressions pas toujours trs claires, comme :
z On prfrera :
z Attention :
int a;a = une_f onct i on();
if (a) { /* ... */}
int a;a = une_f onct i on();if (a ! = 0) { /* ... */}
int a = 0; b = 2;if (a = b) { /* Le code qui suit sera toujours excut ... */}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
40/53
Universit de Savoie 40
valuation des expressions boolennes (2)
z Les oprateurs logiques de comparaisons (&& et ||, similairessmantiquement leur quivalent binaire & et |) ont uneexcution totalement diffrente.
z Dans le cas du ET logique (&&), si l'oprande gauche s'value faux (valeur zro), on sait dj que le rsultat du ET sera faux etdonc ce n'est pas la peine d'valuer l'oprande droite. De lamme manire si l'oprande gauche d'un OU logique (||) est
valu vrai, le rsultat sera aussi vrai (valeur !=0) et doncl'valuation de l'oprande droite est inutile.
if (z ! = 0 && a / z < 10){
printf("Tout va bi en\ n");}
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
41/53
Universit de Savoie 41
Les manipulations de bits (1)
z Les manipulations de bits sont beaucoup utilises danslembarqu. Pour contrler un priphrique matriel,
on retrouve des registres de 8, 16 ou 32 bits quil fautmodifier.z Mettre 1 le bit 4 de a :
z Mettre zro le bit 3 de a :
unsigned a = 0x000F; /* 0000 0000 0000 1111 */
unsigned a = 0x000F; /* 0000 0000 0000 1111 */
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
42/53
Universit de Savoie 42
Les manipulations de bits (1)
z Les manipulations de bits sont beaucoup utilises danslembarqu. Pour contrler un priphrique matriel,
on retrouve des registres de 8, 16 ou 32 bits quil fautmodifier.z Mettre 1 le bit 4 de a :
z Mettre zro le bit 3 de a :
unsigned a = 0x000F; /* 0000 0000 0000 1111 */unsigned b = 0x0010; /* 0000 0000 0001 0000 */unsigned c = a | b; /* 0000 0000 0001 1111 soit 0x001F */
unsigned a = 0x000F; /* 0000 0000 0000 1111 */unsigned b = 0xFFF7; /* 1111 1111 1111 0111 */unsigned c = a & b; /* 0000 0000 0000 0111 soit 0x0007 */
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
43/53
43
Les manipulations de bits (2)
z Tester si le bit 2 de a est 1 :
z Tester si le bit 3 de a est 1 et si le bit 15 est 0 :
unsigned a = 0x000F; /* 0000 0000 0000 1111 */
unsigned a = 0x000F; /* 0000 0000 0000 1111 */
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
44/53
44
Les manipulations de bits (2)
z Tester si le bit 2 de a est 1 :
z Tester si le bit 3 de a est 1 et si le bit 15 est 0 :
unsigned a = 0x000F; /* 0000 0000 0000 1111 */
if (a & (1u
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
45/53
Universit de Savoie 45
Le main()
z Le main() est le point dentre dune application. Dansun systme embarque sans systme dexploitation, le
point dentre du programme sera prcis dans laphase ddition de liens par linitialisation du vecteurdinterruption nomm RESET.
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
46/53
Universit de Savoie 46
A quoi sert un pointeur ?
L t bl (1)
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
47/53
Universit de Savoie 47
Les tableaux (1)
z Un tableau est un regroupement conscutif dedonne de mme type et de taille fixe.
// Tableau 1 dimension
void main(void){
int tableau[4];int i;
for(i=0i
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
48/53
Universit de Savoie 48
Les tableaux (2)
tableau[3]
tableau[2]tableau[1]tableau[0]
tableau[3][2]tableau[3][1]
tableau[2][2]tableau[2][1]
tableau[1][2]tableau[1][1]
tableau[0][2]tableau[0][1]
tableau[3][0]
tableau[2][0]
tableau[1][0]
tableau[0][0]
L t bl (3)
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
49/53
Universit de Savoie 49
Les tableaux (3)
z Passage de paramtre des tableaux des fonctions :
z Un tableau nest jamais pass enparamtre, cest son adresse qui est
fournie.
O i ti l i i ll
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
50/53
Universit de Savoie 50
Organisation logicielle
0x00000000
0xFFFFFFFF
address space
code segment
(=program)
Data : (static and global)
heap(dynamically allocated)
stack
PC (Program Counter)
SP (Stack Pointer)
data segment
O i ti l i i ll
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
51/53
Universit de Savoie 51
Organisation logicielle
z Code segment : Emplacement ou se trouve le codecompil.
z Data segment :z Data : contient toutes les variables static et globales
(initialises ou non)z Heap : Le tas est gr dynamiquement. Cest une zone de
donne qui grossi la rservation de zone mmoire (malloc)et qui se rduit lors de la libration (free).
z Stack : Cest une zone de stockage de type LIFO. Ellecontient les adresses de retour des fonctions et les
variables locales. Cette zone mmoire est beaucoupplus rapide que lutilisation du Heap.
Optimisation du code
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
52/53
Universit de Savoie 52
Optimisation du code
z Dans le contexte de lembarqu, il est important de connatre lesoptions de compilation doptimisation. Il y a en effet un compromis trouver entre la taille de lexcutable produit et le temps dexcution.
Optimisation du code
-
7/29/2019 Cours - Programmation C pour systmes embarqus.pdf
53/53
Universit de Savoie 53
Optimisation du code
z Option -O0 (niveau 0)z Allocates variables to registersz Performs loop rotationz Eliminates unused codez Simplifies expressions and statements
z Option -O1 (niveau 1)z Performs all -O0 optimizations, and:z Removes unused assignmentsz Eliminates local common expressions
z Option -O2 (niveau 2) (default optimization level)z Performs all -O1 optimizations, and:z Performs loop optimizations