Cours - Programmation C pour systèmes embarqués.pdf

Embed Size (px)

Citation preview

  • 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