Beruflich Dokumente
Kultur Dokumente
1re partie : Rappel sur le langage C (exercices de base) 2me partie : La programmation en langage C avance 3me partie : Implmentation de code sur cible embarque (DSP TMS 320C5416) 4me partie : Prsentation du TP : Ralisation dun algorithme de compression de donnes.
Universit de Savoie
Prsentation TP
z TD
: 20 h en 5 sances
Le but de ce projet est d'crire un programme de compression de fichiers textes, sans perte d'information. On demande galement d'crire un dcompresseur qui devra restaurer le fichier original. Lalgorithme propos ici est l'algorithme de Huffman.
Universit de Savoie
Examen
Une note :
z
14 points : Le droulement du TP/Projet jusqu la soutenance. 6 points sur la soutenance (prsentation de votre projet et de lintgration sur le DSP)
Universit de Savoie
Universit de Savoie
Universit de Savoie
crire une fonction C calculant la longueur d'une chane de caractres, donne en argument. Le prototype de la fonction est le suivant :
Universit de Savoie
crire une fonction C calculant la longueur d'une chane de caractres, donne en argument.
#include <stdlib.h> int longueur(char *s) { int n = 0; while (s[n] != '\0') { n++; } return n; }
Universit de Savoie
Le texte (chane de caractre constante) sera dclar dans un tableau nomm ch . Vous afficherez la chane de caractre lcran. 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 de lettre de lalphabet). Un pointeur nomm p pour parcourir le texte.
Universit de Savoie
Universit de Savoie
10
/* dclaration d'un pointeur sur une chane de caracteres. */ char *p = ch; /* dclaration d'un tableau de 26 cases */ int occ[NB_LETTRE]; printf("Chane en mmoire : %s\n",ch); }
Universit de Savoie
11
Universit de Savoie
12
Universit de Savoie
13
Universit de Savoie
14
Universit de Savoie
15
Universit de Savoie
16
Universit de Savoie
17
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
18
Lisibilit du code C
z
Exercice : Raliser un code qui imprime les N premiers lments d'un tableau dentier A[] en insrant un espace entre les lments et en commenant une nouvelle ligne aprs chaque dixime chiffre.
Universit de Savoie
19
Lisibilit du code C
void main(void){ int A[80],N,i; scanf(%d,&N); for (i=0; i<N; i=i+1){ printf("%d", A[i]); if ((i%10) == 9) printf("\n"); else printf(" "); }
Universit de Savoie
20
Lisibilit du code C
z
Voici une deuxime faon de coder, trs pratique mais beaucoup moins lisible.
void main(void){ int A[80],N,i; scanf(%d,&N); for (i=0; i<n; i++) printf("%d%c", a[i], (i%10==9)?'\n':' '); }
Universit de Savoie
21
Lisibilit du code C
z Quelques
Op. Fonction += Addition et affectation
-= Soustraction et affectation *= Multiplication et affection /= Division et affectation %= Modulo et affectation ++ Incrmentation
nombre += 5;
nombre -= 6; nombre *= 3; nombre /= 2; nombre %= 4; nombre++;
Universit de Savoie
Lisibilit du code C
#include <stdio.h> main(t,_,a)char*a;{return!0<t?t<3?main(-79,-13,a+main(-87,1_,main(-86,0,a+1)+a)):1,t<_?main( t+1, _, a ):3,main( -94, 27+t, a )&&t == 2 ?_ <13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main( _, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+ ,/#{l,+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/ +#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/"):t<-50?_==*a ?putchar(31[a]):main(-65,_,a+1):main((*a == '/') + t, _, a + 1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
Universit de Savoie 23
Lisibilit du code C
z Rgle
z z z
respecter :
Mettre des commentaires explicites Ne pas trop compresser le code Respecter une homognit dans votre faon de coder. Organiser la mise en page de votre code, ou respecter celle dj existante.
Universit de Savoie
24
Afin de connatre la taille (en octet) dune variable, on utilise la fonction sizeof() :
z
Universit de Savoie
25
z z
Voir le cas dun compilateur C pour PIC16F ou PIC18F (microchip) Voir le cas dun compilateur C pour DSP TMS320 (Texas Instruments) (page suivante)
Universit de Savoie
26
Universit de Savoie
27
char a=64; unsigned char b=64; char c=128; unsigned char d=128;
, , , ,
Note : Une dclaration est signed par dfaut. Note : %d -> entier signed / %u -> entier unsigned
Universit de Savoie 28
Conversion explicite :
La conversion de type consiste transformer un type de valeur en un autre, en respectant la syntaxe suivante (<type>) <expression>
Conversion implicite :
Lorsque les deux oprandes sont de type diffrent, le compilateur prvoit une conversion implicite suivant l'ordre : { char -> int -> long -> float -> double } et { signed -> unsigned }
Universit de Savoie
29
Universit de Savoie
30
static : permet une variable locale dtre persistante et donc de conserver sa valeur pendant les appels successifs de la fonction.
#include <stdio.h> void f(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 main(void) { f(); f(); f(); return 0; }
Universit de Savoie 31
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 est dclare. Cest--dire quelle ne pourra pas tre utilise depuis un autre fichier.
Universit de Savoie
32
extern : permet de spcifier que la variable a t dclarer dans un autre fichier. Si on omet ce terme, une nouvelle variable est crer avec une nouvelle allocation mmoire.
/* File : ext.c */ #include <stdio.h> void next(void); void next1(void); int a1=1; /* definition of external (non static)*/ void main(void){ a1=2; printf("a1=%d\n",a1); next(); next1(); printf("a1=%d\n,a1); }
// a1=2
33
/* File file2.c */ extern int a1; void next1(void) { float b1; b1=19.2; a1=13; }
34
Qualificateur de variables
z
const : pour dfinir une variable dont la valeur ne devrait jamais changer ; volatile : dsigne une variable pouvant tre modifie notamment par une source externe indpendante du programme.
Universit de Savoie
35
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 une valeur la dclaration de la variable, sans quoi toute tentative de modification ultrieure entranera une erreur de la part du compilateur : tudier les codes suivants :
const int i = 0; i = 1;
Universit de Savoie
36
Qualificateur de variables
void fonction( const char * pointeur ) { pointeur[0] = 0; pointeur = "Nouvelle chane de caractres"; } char * const pointeur = "Salut tout le monde !"; pointeur = "Hello world !"; const char * const pointeur = "Salut tout le monde !"; pointeur = "Hello world !"; pointeur[0] = 0;
Universit de Savoie
37
Qualificateur de variables
Qualificateur 'volatile'
Ce mot-cl sert spcifier au compilateur que la variable peut tre modifie son insu. Cela annule toute optimisation que le compilateur pourrait faire, et l'oblige procder chaque lecture ou criture dans une telle variable tel que le programmeur l'a crit dans le code.
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 des expressions pas toujours trs claires, comme :
int a; a = une_fonction(); if (a) { /* ... */ }
On prfrera :
int a; a = une_fonction(); if (a != 0) { /* ... */ }
Attention :
int a = 0; b = 2; if (a = b) { /* Le code qui suit sera toujours excut ... */ }
Universit de Savoie 39
Universit de Savoie
40
Les manipulations de bits sont beaucoup utilises dans lembarqu. Pour contrler un priphrique matriel, on retrouve des registres de 8, 16 ou 32 bits quil faut modifier. Mettre 1 le bit 4 de a :
unsigned a = 0x000F; /* 0000 0000 0000 1111 */
Universit de Savoie
41
Les manipulations de bits sont beaucoup utilises dans lembarqu. Pour contrler un priphrique matriel, on retrouve des registres de 8, 16 ou 32 bits quil faut modifier. Mettre 1 le bit 4 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 */
43
Le main()
z
Le main() est le point dentre dune application. Dans un systme embarque sans systme dexploitation, le point dentre du programme sera prcis dans la phase ddition de liens par linitialisation du vecteur dinterruption nomm RESET.
Universit de Savoie
45
Universit de Savoie
46
Universit de Savoie
47
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]
Universit de Savoie 48
de paramtre des tableaux des fonctions : z Un tableau nest jamais pass en paramtre, cest son adresse qui est fournie.
Universit de Savoie
49
Organisation logicielle
0xFFFFFFFF stack SP (Stack Pointer)
address space
heap (dynamically allocated) data segment Data : (static and global) code segment (=program) PC (Program Counter)
0x00000000
Universit de Savoie
50
Organisation logicielle
z z
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 lors de la libration (free).
Stack : Cest une zone de stockage de type LIFO. Elle contient les adresses de retour des fonctions et les variables locales. Cette zone mmoire est beaucoup plus rapide que lutilisation du Heap.
Universit de Savoie 51
Optimisation du code
z
Dans le contexte de lembarqu, il est important de connatre les options de compilation doptimisation. Il y a en effet un compromis trouver entre la taille de lexcutable produit et le temps dexcution.
Universit de Savoie
52
Optimisation du code
z
Allocates variables to registers Performs loop rotation Eliminates unused code Simplifies expressions and statements
Performs all -O0 optimizations, and: Removes unused assignments Eliminates local common expressions