Réaliser par: Mohamed EMHARRAF Royaume du Maroc Université Mohammed Premier Ouj

Réaliser par: Mohamed EMHARRAF Royaume du Maroc Université Mohammed Premier Oujda Ecole Nationale des Sciences Appliquées Oujda (ENSAO) « » CH3: C pour l’embarqué 2 3 Informatique embarquée • Définition wikipédia : on désigne sous le terme informatique embarquée les aspects logiciels se trouvant à l'intérieur des équipements n'ayant pas une vocation purement informatique. L'ensemble logiciel, matériel intégré dans un équipement constitue un système embarqué. • Contraintes : réactivité, autonomie, robustesse, fiabilité.... occupation mémoire, consommation d’énergie. Introduction 4 Informatique embarquée • langage de programmation : C principalement mais aussi assembleur • Aujourd'hui, l'informatique embarquée est présente partout : appareils électroménager, téléphone portable, automobile, scanner ou lecteur de code-barres des caisses enregistreuses automatisées des commerces. • Le domaine des transports incluant les véhicules, mais aussi les satellites peut être considéré comme le domaine privilégié de l'informatique embarqué. Introduction 5 Programmation des systèmes embarqués: • Programmation directe sur le système en assembleur => difficile, lent et peu réutilisable • Programmation sur un ordinateur en langage haut niveau avec un environnement dédié et souvent un simulateur et en système de test après implantation dans le système embarqué. => chaine complète de compilation sur l’ordinateur => implantation du code par une liaison série; USB Introduction 6 #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);} Lisibilité du code C 7 Règles à respecter : • Mettre des commentaires explicites • Ne pas trop compresser le code • Respecter une homogénéité dans votre façon de coder. • Déclarer des variables explicites • Organiser la mise en page de votre code, ou respecter celle déjà existante. Lisibilité du code C 8 Exercice : Réaliser un code qui imprime les N premiers éléments d'un tableau d’entier A[ ] en insérant un espace entre les éléments et en commençant une nouvelle ligne après chaque dixième chiffre. Lisibilité du code C 9 Voici une façon de coder, très 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‘ : ' '); } Lisibilité du code C 10 Quelques équivalences… parfois à éviter Lisibilité du code C Opération Fonction Exemple Equivalence += Addition et affectation nombre += 5; nombre = nombre + 5 -= Soustraction et affectation nombre -= 6; nombre = nombre - 6 *= Multiplication et affection nombre *= 3; nombre = nombre * 3 /= Division et affectation nombre /= 2; nombre = nombre / 2 %= Modulo et affectation nombre %= 4; nombre = nombre % 4 ++ Incrémentation nombre++; nombre = nombre + 1; - - Décrémentation nombre--; nombre = nombre - 1; y = x++ y = x x = x + 1 y = ++x x = x + 1 y = x 11 o Classes de stockage • auto : Définition automatique pas utilisée car implicite. • register : Demande au compilateur d’utiliser un registre (plus utile) • static : La variable locale conserve sa valeur • extern : La variable est déclarée dans un autre fichier o Qualificateurs • const : Spécifie une « variable » non modifiable • volatile : Limite les effets de l’optimisation sur la variable Classes de stockage et qualificateurs 12 classe auto: Cette classe n’est pas utilisé car elle est implicite pour les variables locales. En effet, Les variables locales sont par défaut "automatiques" , crées à l'entrée de la fonction qui les déclare et détruites à la sortie. Pour cela elles sont rangées dans la « pile». void f(void) { int j = 0; printf("j vaut %d",j); } void main(void) { f(); } Classes de stockage et qualificateurs void f(void) { auto int j = 0; printf("j vaut %d",j); } . . . 13 classe static La classe static permet à une variable locale d’être persistante et donc de conserver sa valeur pendant les appels successifs de la fonction. void f(void) { static int i = 0; /* i ne sera initialisé qu’une fois*/ int j = 0; /* j sera initialisé à chaque fois */; i++; j++; printf("i vaut %d et j vaut %d.\n", i, j); } void main(void) { f(); f(); } Note : La classe « static » sur une variable globale ou une fonction aura pour objectif de privatiser l’objet au fichier où elle est déclarée. C’est-à dire qu’elle ne pourra pas être utilisée depuis un autre fichier. Classes de stockage et qualificateurs 14 classe extern extern : permet de spécifier que la variable a été déclaré dans un autre fichier. /* File : ext.c */ 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); } Classes de stockage et qualificateurs 15 classe extern /* File file1.c */ /* File file2.c */ int b1=0; extern int a1; void next(void){ void next1(void){ char a1; float b1; a1='a'; b1=19.2; b1=77; a1=13; } } Si on omet le terme extern, une nouvelle variable est créer avec une nouvelle allocation mémoire. Classes de stockage et qualificateurs 16 classe register On peut demander au compilateur de ranger une variable très utilisée dans un registre, à l’aide de la classe register. Le nombre de registres étant limité, cette requête ne sera satisfaite que s’il reste des registres disponibles. Cette technique permettant d’accélérer les programmes a aujourd’hui perdu tout son intérêt grâce aux performances des optimiseurs de code intégrés au compilateur. Documentation du compilateur MikroC : Classes de stockage et qualificateurs 17 Qualificateur Le C définit des qualificateurs pouvant influer sur une variable : • const : pour définir une variable dont la valeur ne doit jamais changer. • volatile : désigne une variable dont les accès ne doivent pas être optimiser par le compilateur. Cette variable sera relue depuis son emplacement d’origine à chaque accès. En effet, cela est important lorsque d’autre sources (périphérique matériel, processus, etc…) accède à la variable en même temps que notre programme. => Une variable peut avoir plusieurs qualificateurs Classes de stockage et qualificateurs 18 Qualificateur const Le qualificateur const indique au compilateur que la valeur de la variable ne doit pas changer. Il est donc impératif d'assigner une valeur à la déclaration de la variable, sans quoi toute tentative de modification ultérieure entraînera une erreur de la part du compilateur. Étudier les codes suivants : const int i = 0; i = 1; -------------------------------------------------------- char * const pointeur = "Salut tout le monde !"; pointeur = "Hello world !"; --------------------------------------------------------- void fonction( const char * pointeur ) { pointeur[0] = 0; pointeur = "Nouvelle chaîne de caractères"; } --------------------------------------------------------- const char * const pointeur = "Salut tout le monde !"; pointeur = "Hello world !"; pointeur[0] = 0; Classes de stockage et qualificateurs 19 Qualificateur volatile Le compilateur va optimiser la boucle while en considérant que la lecture de *pReg n’est jamais modifiée. En réalité, elle peut être modifiée par : • Un périphérique d’entrée/sortie mappé en mémoire • Une interruption • Une autre tâche int * pReg = (int *) 0x 1234; while (* pReg == 0) { …} Classes de stockage et qualificateurs 20 Le C ne possède pas de type booléen dédié. Dans ce langage, n'importe quelle valeur différente de zéro est considérée vraie, zéro étant considéré comme faux. Ce qui veut dire que n'importe quelle expression peut être utilisée à l'intérieur des tests (entier, réels, pointeurs, tableaux, etc.). Cela peut conduire à des expressions pas toujours très claires, comme : int a; a = une_fonction(); if (a) { /* ... */ } On préférera : int a; a = une_fonction(); if (a != 0) { /* ... */ } Attention : int a = 0; b = 2; if (a = b) { /* Le code qui suit sera toujours exécuté ... */ } Évaluation des expressions booléennes 21 Les opérateurs logiques de comparaisons (&& et ||, similaires sémantiquement à leur équivalent binaire & et |) ont une exécution totalement différente. Dans le cas du ET logique (&&), si l'opérande gauche s'évalue à faux (valeur zéro), on sait déjà que le résultat du ET sera faux et donc ce n'est pas la peine d'évaluer l'opérande droite. De la même manière si l'opérande gauche d'un OU logique (||) est évalué à vrai, le résultat sera aussi vrai (valeur !=0) et donc l'évaluation de l'opérande droite est inutile. if (z != 0 && a / z < 10) { printf("Tout va bien\n"); } Évaluation des expressions booléennes 22 Les manipulations de bits sont beaucoup utilisées dans l’embarqué. Pour contrôler un périphérique matériel, on retrouve des registres de 8, 16 ou 32 bits qu’il faut modifier. Mettre à 1 le bit 4 de a : unsigned a = 0x000F; /* 0000 0000 0000 1111 */ unsigned b = 0x0010; /* 0000 0000 0001 0000 */ uploads/Science et Technologie/ royaume-du-maroc-universite-mohammed-premier-oujda-ecole-nationale-des-sciences-appliquees-oujda-ensao.pdf

  • 35
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager