Cours-Programmation C Pour Systèmes Embarqués-Internet

Embed Size (px)

Citation preview

  • 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