Cours-Programmation C Pour Systèmes Embarqués-Internet
-
Upload
omar-khayyam -
Category
Documents
-
view
235 -
download
1
Transcript of Cours-Programmation C Pour Systèmes Embarqués-Internet
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
1/49
Programmation C poursystmes embarqus
Sylvain [email protected]
Btiment chablais, bureau 1304 79 75 86 86
Retrouver tous les documents de Cours/TP sur le site
www.master-electronique.com
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
2/49
Universit de Savoie 2
Prsentation des cours : Sommaire
Cours : 10.5 h en 7 sances 1re partie : Rappel sur le langage C (Exercices de base)
2me partie : La programmation en langage C avance
3me partie : Prsentation du TP : Ralisation dunalgorithme de compression de donnes.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
3/49
Universit de Savoie 3
Prsentation TP et examen TP : 20 h en 5 sances
Le but de ce projet est d'crire un programme de compression defichiers textes, sans perte d'information. On demande galementd'crire un dcompresseur qui devra restaurer le fichier original.
Lalgorithme propos ici est l'algorithme de Huffman.
Une note : 18 points : Examen de TP avec une partie thorique. 2 points proviennent du travail fait en TP
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
4/49
Universit de Savoie 4
1re partie : Rappel sur le langage C
(exercices de base) 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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
5/49
Universit de Savoie 5
1re partie : Rappel sur le langage C
(exercices de base) Donner lexcution du code suivant :
#i ncl ude
i nt mai n() {int i ,j ;
for(i =0; i
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
6/49
Universit de Savoie 6
1re partie : Rappel sur le langage C
(exercices de base) 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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
7/49
Universit de Savoie 7
1re partie : Rappel sur le langage C
(exercices de base) crire une fonction C calculant la longueur d'une
chane de caractres, donne en argument.
int l ongueur (char *s) {int n = 0;
while(s[n] ! = ' \ 0') {n++;}
return n;}
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
8/49
Universit de Savoie 8
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.
Question 1 : Raliser les dclarations suivantes : Le texte (chane de caractre constante en lettre minuscule)
sera dclar dans un tableau nomm ch . Vous afficherezla chane de caractre lcran. Un tableau d'entiers nomm occ permet de compter les
occurrences de chaque lettre de lalphabet. La taille du
tableau est fixe par une constante (nombre de lettre delalphabet). Un pointeur nomm p pour parcourir le texte.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
9/49
Universit de Savoie
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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
10/49
Universit de Savoie 10
1re partie : Rappel sur le langage C
(exercices de base) Question 2 : Initialiser le tableau doccurrence zro :
Question 3 : Compter les occurrences jusqu la fin de la chanede caractre :
Question 4 : Afficher le contenu du tableau occ en prcisant lalettre : le nombre de a est le nombre de b est .
int i =0;
for(i =0; i = ' a ) && ( *p
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
11/49
11
2me partie : La programmation en
langage C avance Lisibilit du code, les types de variables,
les typedef, occupation mmoire, port des variables, les oprateurs,
manipulation de registre, les structures, les pointeurs, le main(),
pointeurs, la pile, type de fonction, allocation dynamique,
les options doptimisations la compilation, les erreurs classiques du C
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
12/49
12
Lisibilit du code C (1)
Exercice :
Raliser un code qui imprime les N premiers lments d'un
tableau dentier A[ ] en insrant un espace entre les lments eten commenant une nouvelle ligne aprs chaque dixime chiffre.
voidmai n( void) {int A[80], N, i ;
scanf( "%d" , &N) ; / / Sai s i e de Nfor ( i =0; i
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
13/49
Universit de Savoie 13
Lisibilit du code C (2)
Rgles respecter :
Mettre des commentaires explicites Ne pas trop compresser le code Respecter une homognit dans votre faon de coder. Dclarer des variables explicites Organiser la mise en page de votre code, ou respecter
celle dj existante.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
14/49
Universit de Savoie 14
Lisibilit du code C (3)
Voici une deuxime faon de coder, trs pratiquemais beaucoup moins lisible.
voidmai n(void){
int A[ 80] , N, i ;
scanf( "%d" , &N) ;
for ( i =0; i
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
15/49
Universit de Savoie 15
Lisibilit du code C (4)
Quelques quivalences parfois viter
Op. Fonction Exemple Equivalence+= Addition et
affectation
nombre += 5; nombr e=nombr e+5
-= Soustraction et
affectation
nombre - = 6;
*= Multiplication
et affection
nombre *= 3;
/= Division et
affectation
nombre / = 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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
16/49
Lisibilit du code C (5)#include main(t,_,a)char*a;{return!0
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
17/49
Universit de Savoie 17
Les types de variables (1)
char = 1 octet (signed ou unsigned)
Int, long, double, float dpendent de la cible processeur utilise.
Afin de connatre la taille (en octet) dune variable, on
utilise la fonction sizeof() :printf( " i nt =%d oct et s" , sizeof(int)) ;
Note : Il nexiste pas de type Boolen en C
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
18/49
Universit de Savoie 18
Les types de variables (2)
Cas dune compilation pour processeur 32 bits
Voir le cas dun compilateur C pour PIC16F ou PIC18F (microchip)
Voir le cas dun compilateur C pour DSP TMS320 (TexasInstruments) (page suivante)
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
19/49
Universit de Savoie 19
Les types de variables (3)
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
20/49
Universit de Savoie 20
Les types de variables (4)
Donner la reprsentation binaire des nombres suivants :char a=64;
unsigned char b=64;char c=128;
unsigned char d=128;
Quel est laffichage des fonctions suivantes?printf( "%d" ,a ) ;
printf( "%d" , c ) ;
printf( "%u" ,a ) ;
printf( "%u" , c+a) ;
Note : Une dclaration est signed par dfaut gnralement.Note : %d -> entier signed / %u -> entier unsigned
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
21/49
Universit de Savoie 21
Les types de variables (5)
Conversion explicite :
La conversion de type consiste transformer un type de valeur en unautre, en respectant la syntaxe suivante()
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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
22/49
22
Les types de variables (6)
Dcrivez le conversion du type, ainsi que lesaffectations du code suivant :
int mai n( voi d) {int n, m, l ;double d;d = 5;
n = ( int) 3. 4;n = 1;m = 5;d = 2;l = ( int) ( m / d) ;d = n / m;d = n / ( ( double) m) ;d = ' A' * 6. 0 m + 0xA2CL;return 0;
}
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
23/49
Universit de Savoie 23
Porte des variables
Globale / Locale Les variables locales sont dclares dans la fonction les utilisant.
les variables globales sont dclares en dbut de programme. Lelinker attribue une adresse fixe et dfinitive ces dernires(variable globale) pendant toute la dure du programme.
L'utilisation de variables locales amliore considrablement lalisibilit et la scurit des donnes dans un programme en C.Une variable locale existe exclusivement pendant lexcution dela fonction o est dclarer la variable.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
24/49
Classes de stockage et qualificateurs
Classes de stockage auto : Dfinition automatique pas utilise car implicite. register : Demande au compilateur dutiliser un registre (plus utile) static : La variable locale conserve sa valeur
extern : La variable est dclare dans un autre fichier
Qualificateurs const : Spcifie une variable non modifiable volatile : Limite les effets de loptimisation sur la variable
Universit de Savoie 24
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
25/49
Classe de stockage et qualificateur
classe autoCette classe nest pas utilis car elle est implicite pour lesvariables locales. En effet, Les variables locales sont par
dfaut "automatiques" , cres l'entre de la fonctionqui les dclare et dtruites la sortie. Pour cela ellessont ranges dans la pile.
25
voidf(void) {int j = 0;
printf(" j vaut %d" ,j);
}
voidmai n(void) {
f();
}
voidf(void) {auto int j = 0;
printf(" j vaut %d" ,j);
}
. . .Mais jamais utilise
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
26/49
Classe de stockage et qualificateur
classe static La classe static permet une variable locale dtre persistante et donc
de conserver sa valeur pendant les appels successifs de la fonction.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);}
voidmai n(void) {
f();
f();
}
Note : La classe static sur une variable globale ou une fonction aurapour objectif de privatiser lobjet au fichier o elle est dclare. Cest--
dire quelle ne pourra pas tre utilise depuis un autre fichier.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
27/49
27
Classe de stockage et qualificateur
classe extern (1) extern : permet de spcifier que la variable a t dclar dans un
autre fichier.
/* File : ext.c */
voidnext ( void) ;
voidnext 1( void) ;int a1=1; / * def i ni t i on of ext er nal ( non st at i c) */
voidmai n( void) {a1=2;
printf( "a1=%d\ n", a1) ;next( ) ;next1( ) ;
printf( "a1=%d\ n, a1) ;}
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
28/49
Classe de stockage et qualificateur
classe extern (2)
/* File file1.c */
int b1=0;
voidnext (void) {char a1;a1=' a' ;
b1=77;}
/* File file2.c */
extern int a1;
voidnext 1(void) {float b1;b1=19. 2;
a1=13;}
28
Si on omet le terme extern, une nouvelle variable estcrer avec une nouvelle allocation mmoire.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
29/49
Classe de stockage et qualificateur
classe register
On peut demander au compilateur de ranger une variable trsutilise dans un registre, laide de la classe register. Le nombre
de registres tant limit, cette requte ne sera satisfaite que silreste des registres disponibles. Cette technique permettantdacclrer les programmes a aujourdhui perdu tout son intrtgrce aux performances des optimiseurs de code intgrs aucompilateur.
Documentation du compilateur MikroC :
Universit de Savoie 29
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
30/49
Universit de Savoie 30
Classe de stockage et qualificateur
classe register Le C dfinit des qualificateurs pouvant influer sur une
variable :
const : pour dfinir une variable dont la valeur ne doit jamaischanger ;
volatile : dsigne une variable dont les accs ne doivent pas
tre optimiser par le compilateur. Cette variable sera reluedepuis son emplacement dorigine chaque accs. En effet,cela est important lorsque dautre sources (priphriquematriel, processus, etc) accde la variable en mme tempsque notre programme.
Une variable peut avoir plusieurs qualificateurs
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
31/49
Universit de Savoie 31
Classe de stockage et qualificateur
Qualificateur constLe qualificateur const indique au compilateur que la valeur de la variablene doit pas changer. Il est donc impratif d'assigner une valeur la
dclaration de la variable, sans quoi toute tentative de modificationultrieure entranera une erreur de la part du compilateur :tudier les codes suivants :
const int i = 0;
i = 1;
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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
32/49
Universit de Savoie 32
Classe de stockage et qualificateur
Qualificateur volatile
Le compilateur va optimiser la boucle while en considrantque la lecture de *pReg nest jamais modifie. En ralit,elle peut tre modifie par : Un priphrique dentre/sortie mapp en mmoire
Une interruption Une autre tche
int * pReg = ( int *) 0x 1234;
while ( * pReg == 0) {}
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
33/49
Universit de Savoie 33
valuation des expressions boolennes (1)
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 :
On prfrera :
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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
34/49
Universit de Savoie 34
valuation des expressions boolennes (2)
Les oprateurs logiques de comparaisons (&& et ||, similairessmantiquement leur quivalent binaire & et |) ont uneexcution totalement diffrente.
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/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
35/49
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
36/49
Universit de Savoie 36
Les manipulations de bits (1)
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. Mettre 1 le bit 4 de a :
Mettre zro le bit 3 de a :
unsigneda = 0x000F; /* 0000 0000 0000 1111 */unsignedb = 0x0010; /* 0000 0000 0001 0000 */
unsignedc = a | b; /* 0000 0000 0001 1111 soit 0x001F */
unsigneda = 0x000F; /* 0000 0000 0000 1111 */unsignedb = 0xFFF7; /* 1111 1111 1111 0111 */unsignedc = a & b; /* 0000 0000 0000 0111 soit 0x0007 */
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
37/49
37
Les manipulations de bits (2)
Tester si le bit 2 de a est 1 :
Tester si le bit 3 de a est 1 et si le bit 15 est 0 :
unsigneda = 0x000F; /* 0000 0000 0000 1111 */
unsigneda = 0x000F; /* 0000 0000 0000 1111 */
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
38/49
38
Les manipulations de bits (2)
Tester si le bit 2 de a est 1 :
Tester si le bit 3 de a est 1 et si le bit 15 est 0 :
unsigneda = 0x000F; /* 0000 0000 0000 1111 */
if ( a & ( 1
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
39/49
Universit de Savoie 39
Le main()
Le main() est le point dentre dune application. Dansun systme embarque sans systme dexploitation, lepoint dentre du programme sera prcis dans laphase ddition de liens par linitialisation du vecteur
dinterruption nomm RESET.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
40/49
Universit de Savoie 40
A quoi sert un pointeur ?
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
41/49
Universit de Savoie 41
Les tableaux (1)
Un tableau est un regroupement conscutif dedonne de mme type et de taille fixe.
// Tableau 1 dimension
voidmai n( void) {
int t abl eau[ 4] ;int i ;
for( i =0; i
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
42/49
Universit de Savoie 42
Les tableaux (2)
tableau[0]tableau[1]tableau[2]tableau[3]
tableau[0][0]tableau[0][1]tableau[0][2]tableau[1][0]
tableau[1][1]tableau[1][2]tableau[2][0]tableau[2][1]tableau[2][2]tableau[3][0]tableau[3][1]tableau[3][2]
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
43/49
Universit de Savoie 43
Les tableaux (3)
Passage de tableaux en paramtre des fonctions. Un tableau nest jamais pass en paramtre, cest son
adresse qui est fournie.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
44/49
Universit de Savoie 44
Organisation logicielle (1)
0x00000000
0xFFFFFFFF
address space
code segment(=program)
Data : (static and global)
heap(dynamically allocated)
stack
PC (Program Counter)
SP (Stack Pointer)
data segment
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
45/49
Universit de Savoie 45
Organisation logicielle (2)
Code segment : Emplacement ou se trouve le code compil (programme)
Data segment : Data : contient toutes les variables static et globales
(initialises ou non) Heap : Le tas est gr dynamiquement. Cest une zone de donne qui
grossi la rservation de zone mmoire (malloc) et qui se rduit lorsde la libration (free).
Stack : Cest une zone de stockage de type LIFO. Elle contient lesadresses de retour des fonctions et les variables locales.
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
46/49
46
Organisation logicielle (3)
Imposer une adresse physique pour une variable ou uneconstante
Les registres des microcontrleurs sont des adresses imposes
par le concepteur du C, or le linker d'un compilateur C a lecontrle total des adresses, il choisit o sont ranges variables etconstantes. On peut aussi imposer une adresse une variable.Attention, il faut tre certain que vous soyez le seul utilisercette adresse pour ne pas crer derreur de segmentation.
char c;voidmai n ( void) {
*(unsigned char
*) 0x80 = 0xAA;c= *( unsigned char *) 0x80;}
Organisation logicielle (4)
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
47/49
Organisation logicielle (4)Directive du linker
Il est possible de prciser lditeur de lien lendroit exact ou noussouhaitons que le code, les variables ou les constantes seront
positionnes. Exemple : Pour le linker MikroC, on utilise les directivessuivantes :
Directive absolute : Directive absolute specifies the starting address in RAM for avariable or a starting address in ROM for a constant..
Directive org : Directive org specifies a starting address of a routine in ROM.Directive org is appended to the function definition.
Directive orgall : If the user wants to place his routines, constants, etc, above aspecified address in ROM, #pragma orgall directive should be used.
Directive funcorg :You can use the #pragma funcorg directive to specify thestarting address of a routine in ROM using routine name only.
47
O ti i ti d d (1)
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
48/49
Universit de Savoie 48
Optimisation du code (1)
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.
O ti i ti d d (2)
-
7/25/2019 Cours-Programmation C Pour Systmes Embarqus-Internet
49/49
Universit de Savoie 49
Optimisation du code (2)
Option -O0 (niveau 0) Allocates variables to registers Performs loop rotation Eliminates unused code Simplifies expressions and statements
Option -O1 (niveau 1) Performs all -O0 optimizations, and: Removes unused assignments Eliminates local common expressions
Option -O2 (niveau 2) (default optimization level) Performs all -O1 optimizations, and: Performs loop optimizations