Cours - Programmation C Pour Systèmes Embarqués
Cours - Programmation C Pour Systèmes Embarqués
Cours - Programmation C Pour Systèmes Embarqués
1re partie : Rappel sur le langage C (Exercices de base) 2me partie : La programmation en langage C avance 3me partie : Prsentation du TP : Ralisation dun algorithme de compression de donnes.
Universit de Savoie
Prsentation TP
l TP
: 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 :
l l
18 points : Examen de TP avec une partie thorique. 2 points proviennent du travail fait en TP
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
Universit de Savoie
11
Universit de Savoie
12
Universit de Savoie
13
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
14
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.
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(" "); }
15
Universit de Savoie
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
16
nombre += 5;
nombre -= 6; nombre *= 3; nombre /= 2; nombre %= 4; nombre++;
Equivalence nombre=nombre+5
Universit de Savoie
Rgles respecter :
l l l
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
19
Afin de connatre la taille (en octet) dune variable, on utilise la fonction sizeof() :
l
Universit de Savoie
20
l l
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
21
Universit de Savoie
22
char a=64; unsigned char b=64; char c=128; unsigned char d=128;
, , , ,
Note : Une dclaration est signed par dfaut gnralement. Note : %d -> entier signed / %u -> entier unsigned
Universit de Savoie 23
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
24
Les variables locales sont dclares dans la fonction les utilisant. les variables globales en dbut de programme. Le linker attribue une adresse fixe et dfinitive ces dernires pendant toute la dure du programme. L'utilisation de variables locales amliore considrablement la lisibilit et la scurit des donnes dans un programme en C. Les variables locales sont par dfaut "automatiques" , cres l'entre de la fonction qui les dclare et dtruites la sortie. Pour cela elles sont ranges dans la pile, zone mmoire particulire, destine primairement au stockage des donnes de retour des sous programmes.
Universit de Savoie
26
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 27
Cas des variables globales et Static . 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
28
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
29
30
const : pour dfinir une variable dont la valeur ne doit jamais changer ; volatile : dsigne une variable dont les accs ne doivent pas tre optimiser par le compilateur. Cette variable sera relue depuis son emplacement dorigine chaque accs. En effet, cela est important lorsque dautre sources (priphrique matriel, processus, etc) accde la variable en mme temps que notre programme.
const int i = 0; i = 1;
Universit de Savoie
32
Universit de Savoie
33
uint8_t * pReg = (uint8_t *) 0x1234; // Wait for register to become non-zero while (*pReg == 0) { } // Do something else
Universit de Savoie
34
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 35
Universit de Savoie
36
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 int a = 0x000F; /* 0000 0000 0000 1111 */
37
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 */
39
Le main()
l
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
41
Universit de Savoie
42
Universit de Savoie
Passage de tableaux en paramtre des fonctions. Un tableau nest jamais pass en paramtre, cest son adresse qui est fournie.
Universit de Savoie
45
address space
heap (dynamically allocated) data segment Data : (static and global) code segment (=program) PC (Program Counter)
0x00000000
Universit de Savoie
46
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 47
Les registres des microcontrleurs sont des adresses imposes par le concepteur du C, or le linker d'un compilateur C a le contrle total des adresses, il choisit ou sont ranges variables et constantes. On peut aussi imposer une adresse une variable. Attention, il faut tre certain que vous soyez le seul utiliser cette adresse pour ne pas crer derreur de segmentation.
#define mamem *(unsigned char *)0x80 char c; void main (void){ mamem = 0xAA; c=mamem; }
48
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
49
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