Académique Documents
Professionnel Documents
Culture Documents
• 5 Modes d’addressage
Directe and indirecte
le niveau logique de la broche est Le port ne peut imposer que le niveau logique '0'.
imposé par le port
Le niveau '1' est fixé par un circuit extérieur.
11 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
General Purpose I/O
• Technologies des ports en entrée: Mode Pull Down
Mode Floating input
• Événements externes
• Changement sur une entrée spécifique appelée entrée d’interruption. (tout µC en a au moins
une),
• Changement sur un bit de port.
• Événements internes
• Débordement Timer
• Fin écriture EEPROM
• Fin de conversion A/N
• ……
0001 0001
Registres
0000 0001
IP • l’adresse en cours est sauvegardée
Compteur instruction 0000 0001
021301
10
0000 0100
0001 0001
20 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Contrôleur d’interruption
Déroulement d’une interruption Mémoire
0000 0111
• Les instructions se déroulent
IP 0010 0101
Compteur instruction
1023
0001 0001
Unité de
contrôle
UC 0000 0100
Horloge 0101
0101 0010
0001 0001
0000 0001
0000 0001
0001 0001
Registres
011010010101010100101
101010101011111100101
000010101010111110011
010101010101010101010
111010101011110011000
CNA n bits Filtre
100101010101010001111
bit n
x0 20 + x1 21 + x2 2 2 + + xn −1 2 n −1
Vout =k n
2
Tension de référence k
011010010101010100101
101010101011111100101
000010101010111110011
010101010101010101010
111010101011110011000
100101010101010001111
code/tension
• La résolution : Représente la valeur analogique
correspondant à 1 bit (pas de quantification) Q
• Dépend du nombre de bits utilisés et d’un paramètre de
référence (souvent une tension)
• Temps de stabilisation « settling time » : temps
entre le départ de la transition et la nouvelle valeur à
la précision requise (0.5 LSB par ex.) tension/code
• Le rapport signal/bruit Vref Vref : Tension de référence
Q=
2n − 1 n : Longueur du mot binaire
• La linéarité et les autres erreurs
• Type d’interface
32 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Convertisseur A/N et N/A
Conversion A/N
Nombre de bits et résolution
• Gamme de température de 0 K à 300o K à convertir en une tension entre 0
et 2.5 V, numérisée avec des convertisseurs A/N de 8 et 10 bits
• 8 bits :
• 2.5 / 28 -1= 0.0098 V, ou environ 10 mV par pas
• En degrés K, cela correspond à 300o K / (28-1)= 1.2o K par pas
• 10 bits :
• 2.5 / (210 -1)= 0.00244V, ou environ 2.4 mV par pas
• En degrés K, cela correspond à 300o K / (210 -1)= 0.29o K par pas
• Oui , mais le niveau de bruit est-il inférieur à 2.4 mV ?
conditionneur
amplificateur
filtre
Multiplexeur analogique
S&H
logique
CAN
OCn
http://www.computerhistory.org/revolution/minicomputers/11/331
• Java
• JavaScript 1983
une définition
• Python explicite et
indépendante
de la machine
pour le C
• Lua
65 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Histoires des langages clés
La mise en œuvre de C orienté objet la plus
•C réussie [en tout cas en embarqué]
• Java
• JavaScript
• Python
• Lua
66 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Histoires des langages clés
•C Développé par Sun [maintenant Oracle] pour
définir un code embarqué portable,
• C++
Principalement utilisé pour les applications
• Java Internet au début,
Éditeur de lien
Préprocesseur Compilateur C LINKER
remplace les Transforme le fichier C en un Lie (donne des adresses
#define et effectue fichier objet (code machine), aux fonctions) tous les
les #include les fonctions pré compilées fichiers objets et crée un
Fichier sont déclarées dans les fichiers fichier exécutable
source C *.h
contenant la
fonction
main
Fichier de Programme
symboles exécutable
pour debug *.hex
https://grahamwideman.wikispaces.com/Arduino+--+Project+structure+and+build+process
81 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exemple 2- Processus Arduino de construction
et de chargement pour AVR
https://grahamwideman.wikispaces.com/Arduino+--+Project+structure+and+build+process
82 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
APPROCHES DE CONCEPTION
Voltage = Process_measurements(ADC_val);
Display_results(Voltage);
}
ADC_val
while (1) { while (1) {
OS_delay(75); OS_delay(50);
ADC_val = Read_A_D_Converter(); Voltage = Process_measurements(ADC_val);
} Display_results(Voltage);
}
Problème?? Solution : Mutex, Sémaphore, Queue de messages, boite aux lettres
95 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
• Les systèmes techniques ont un nombre fini
d'états, dans lequel ils peuvent se trouver à un
instant donné.
• Ils réagissent à des événements qui peuvent se
produire durant leur fonctionnement.
• En fonction de l'état actuel du système, ces
événements peuvent déclencher des activités et
éventuellement générer un changement d’état
de ce dernier.
100 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Conception-
• Implémentation : Instructions switch emboîtées
101 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Conception-
• Implémentation : Instructions switch emboîtées
102 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Exemple-
Start
Rec
Haut
Av
Bas
103 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Exemple-
104 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Exemple-
• Structures Disponibles :
105 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Exemple-
• Exemple :
106 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
State-Event
-Exemple-
107 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
• Des boutons pour les fonctions Start, Stop et
Clear.
o Start lance le chronomètre.
o Stop arrête le comptage sur le chronomètre.
o Clear efface la valeur du temps écoulé si le
chronomètre est à l’arrêt.
• Un Timer déclenche une interruption toutes les
1 ms. Le Timer contrôle ainsi un compteur
elapsed_time_counter qui compte les
millisecondes depuis le démarrage du système.
• Un écran pour afficher le temps écoulé avec une
résolution de 1 ms. L'affichage doit être mis à
jour 10 fois par seconde.
108 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
1) Proposer un pseudo-code du programme en se basant sur une approche de
conception avec déroulement quasi-parallèle et événementiel. Nous
supposons que chaque bouton peut générer une interruption.
• Utiliser une variable appelée state pour indiquer si le chronomètre est arrêté ou en
cours d'exécution.
• Utiliser une variable appelée elapsed_time pour savoir combien de temps s'est écoulé
depuis l’appuie sur le bouton Start.
• Utiliser une variable appelée display_delay pour savoir combien de millisecondes
restent jusqu'à ce que l'affichage soit à nouveau mis à jour.
109 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
Main thread: Start ISR: Stop ISR: Clear ISR:
state = stopped state = running state = stopped if state == stopped
display_delay = 100 elapsed_time = 0
elapsed_time = 0
Timer ISR:
if state == running
elapsed_time += 1 ms
display_delay -= 1
if display_delay == 0 {
display (elapsed_time)
display_delay = 100
}
110 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
2) Proposer l’organigramme puis le pseudo-code du programme en se basant sur une
approche de conception avec déroulement cyclique sans utiliser d'interruptions. Nous
supposons que le Timer met à jour un registre matériel appelé elapsed_time_register
toutes les millisecondes.
• Utiliser une variable appelée state pour indiquer si le chronomètre est arrêté ou en cours
d'exécution.
• Utiliser une variable appelée start_time pour enregistrer l’instant où le bouton Start est
appuyé.
• Utiliser une variable appelée stop_time pour enregistrer l’instant où le bouton Stop est
appuyé.
• Utiliser une variable appelée next_display_update pour indiquer l’instant de mise à jour
de l'affichage.
111 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
112 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
113 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
Main thread: if clear switch pressed {
state = stopped if state == stopped {
display elapsed_time_counter start_time = stop_time
next_display_update = elapsed_time_counter + 100 }
while (1) { }
if start switch pressed { if elapsed_time_counter > next_display_update {
if state == stopped { if (state == running)
start_time = elapsed_time_counter display (elapsed_time_counter - start_time)
state = running else
} display (stop_time – start_time)
} next_display_update = next_display_update + 100
if stop switch pressed { }
if state == running { }
stop_time = elapsed_time_counter
state = stopped
}
}
114 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Exercice d’application
Chronomètre
3) Proposer une autre approche de l’implémentation logicielle basée sur le modèle
state-event.
Travail à faire
115 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
SÉCURITÉ DES SYSTÈMES
116 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Introduction
• Les exigences de qualité pour les systèmes embarqués sont très élevées.
• La qualité peut être déterminée statistiquement.
• Les probabilités de défaillance (MTTF Mean Time To Fail, ou MTBF, Mean Time Between Failure) des
composants sont en générale connue.
• Cela permet de définir la probabilité de défaillance du système en entier ou le temps nécessaire pour
que celui-ci atteigne un état jugé comme étant dangereux.
• La qualité de la partie matérielle peut être augmentée grâce à la redondance.
• «fail-safe mécanismes »
• La redondance vise principalement à réaliser des systèmes sures et fiables.
• Les options suivantes peuvent être envisagées en fonction des champs d’application :
• Surveillance de la partie logicielle à l’aide d’un Watchdog
• Surveillance de la partie matérielle (horloge et alimentation) par des composants supplémentaires.
• Surveillance de la partie matérielle par la partie logicielle (CRC, Test de la RAM etc.).
• Partie matérielle redondante (dédoublement d’entrée/sorite, deux processeurs en parallèle ou trois
avec une stratégie de décision majoritaire).
• Partie logicielle redondante (Les mêmes programmes sont exécutés sur des processeurs différents).
117 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Introduction
• Le développement du logiciel peut être amélioré qualitativement par des mesures
appropriées.
• La fiabilité des logiciels embarqués doit être très élevée.
• Le développement de logiciels de bonnes qualités n'est possible qu’avec plusieurs
mesures:
• Des ingénieurs bien formés et qualifiés qui ont une bonne connaissance des pièges courants.
• Révision des spécifications, de la conception et du code.
• Une conception du logiciel de haute qualité.
• Code de haute qualité grâce à l'utilisation des normes et des directives SW.
• Mécanismes de détection d'erreur dans le logiciel.
• Utilisation des outils d'analyse de code statique.
• Des tests approfondis durant la phase de développement.
• Tests du système complet avant et pendant la mise en service.
• Une documentation complète, compréhensible et actualisée.
118 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Programmation C dans l’embarqué
• Le langage C, qui est le plus couramment utilisé dans les systèmes embarqués,
n’est malheureusement pas sure au niveau des types et présente également de
nombreux autres pièges.
• Par exemple, les pointeurs en C
• Il faut prendre les précautions nécessaires durant la programmation.
• Il est fortement recommandé de toujours n’utiliser qu’un sous-ensemble du langage de
programmation C.
• l’association MISRA-C définit une listes exhaustive de tels recommandations
• Pourquoi faut-il utiliser le langage C pour programmer les systèmes embarqués,
alors que ce dernier est lacunaire?
• Premièrement ; il n’existe (presque) pas d’autres alternatives dans domaine de la
programmation des microcontrôleurs .
• Deuxièmement ; il est plus opportun d’utiliser un langage de programmation que l’on connaît
(en particulier ses faiblesses), pour lequel il existe de bon compilateur, qu’un langage qui
n’est pas répondu et pour lequel il n’existe que des mauvais outils de développement.
119 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
MISRA-C
• Définit 122
règles
«nécessaires»
et 20 règles
«consultatifs»
120 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
La loi de Murphy
121 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Dépassement de capacité dans les tableaux
• Ce code est syntaxiquement correct
char array[10];
char counter = 0;
…
for (counter = 0; counter <= 10; counter++){
array[counter] = 0;
}
• PB : dépassez les limite du tableau « array » lorsque « counter = 10 ».
• Conséquence?
• Dans le pire de cas, le relieur (anglais : linker) réserve de l’espace mémoire pour la variable counter
directement à la suite du tableau array.
• Dans ce cas l’instruction « array[counter] = 0 » efface systématiquement le contenu de la variable counter.
• La boucle for devient ainsi une boucle infini.
122 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Dépassement de capacité dans la pile (anglais : stack)
• Ce problème est identique à celui lié aux dépassements de capacité
dans les tableaux.
• Lorsque vous dépassez les limites de votre pile (trop d’appels de
fonctions imbriqués ou trop de variables locales), vous risquez
d’accéder aux segments de la RAM qui contiennent des variables ou -
selon l’architecture- des instructions.
• Les erreurs, qui résultent de ce genre de dépassement, vont se
manifester à un instant donné en cours de l’exécution.
123 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Dépassement de capacité dans la pile (anglais : stack)
• Quelles sont les solutions pour résoudre ces problèmes :
• Agrandissement de la taille de la pile. Des nombreux environnements de
développement permettent de définir la taille de la pile à l’aide d’options
pour le linker.
• Réduction de la taille des variables locales dans les fonctions.
• Eviter les appels de fonction récursive!
124 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Pointeur NULL
• Un pointeur, qui n’est pas initialisé, adresse la case mémoire NULL (ou
même quelque part ailleurs).
• une erreur de programmation classique
• Une allocation de mémoire pour construire une liste dynamique, qui
échoue par manque de mémoire disponible, retourne également
l’adresse NULL.
• se produit à n’importe quel instant.
• Quelles sont les solutions pour résoudre ces problèmes :
• Il faut comparer la valeur de chaque pointeur avec l’adresse NULL avant de
l’utiliser! Cette vérification peut se réaliser soit avec :
• if(pointer != NULL), ou avec :
• assert(pointer != NULL).
125 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Les interruptions
• Un microcontrôleur possède de nombreux vecteurs d'interruption,
qui sont rassemblés dans son tableau des vecteurs d’interruption.
• Que se passe-t-il lorsqu’apparaît une interruption, qui n’a pas été
prévue et n’est par conséquent pas traitée (comme par exemple la
division par zéro) ?
• Dans ce cas, le contrôleur va accéder au tableau des vecteurs d’interruption
afin de charger l’instruction correspondante à cette interruption.
• Si ce vecteur contient la valeur zéro, le programme est relancé (reset).
• Sinon le programme fait un saut à une adresse inconnue, qui engendrera
probablement un crash du système.
126 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Les interruptions
• Quelles sont les solutions pour résoudre ce problème :
• Il faut toujours initialiser tous les vecteurs d'interruption.
• Si vous n'utilisez pas une interruption donnée, implémentez pour cette
dernière une routine traitement d’interruption (anglais : ISR) par défaut.
• Dans cette routine de service, vous pouvez soit afficher un message d'erreur
ou implémenter une boucle infinie pour le débogage.
127 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Allocation de mémoire dynamique
• La mémoire est allouée dynamiquement dans les programmes afin de générer
des listes.
• Cela marche bien tant que la mémoire disponible est suffisante.
• Des problèmes apparaissent inévitablement lorsque la mémoire requise n’est
plus disponible.
• le programme n’a plus de ressource en mémoire.
• Un autre problème est la fragmentation de la mémoire qui peut survenir avec
l’allocation de la mémoire dynamique.
• Quelles sont les solutions pour résoudre ce problème ?
• Essayez de définir les structures de données autant que possible de façon statique.
• Assurez-vous que la mémoire, qui a été allouée dynamiquement, soit également de nouveau
libérée.
• Testez le système également en termes de ressources en mémoire : Exécutez votre
programme durant des heures ou des jours et regardez ensuite si l’espace mémoire
disponible reste constant.
128 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Les conditions de courses (race condition)
• Les situations de course surviennent lorsqu’il y a une interaction
asynchrone entre la partie matérielle (hardware) et la partie logicielle
(software).
• Ils se produisent lorsque les données sont lues systématiquement par
le logiciel, alors qu’ils ont changé de manière asynchrone par le
hardware.
129 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C partie entière du
temps qui s’écoule
2
Les conditions de courses unsigned int timer_hi;
(race condition)
interrupt timer(){
• Le code ci-dessus est
erroné. ++timer_hi; partie fractionnaire du
• Le problème peut être } temps qui s’écoule
résolu à l’aide d’approches
différentes: unsigned long read_timer(void){
• Considération du 1 unsigned int low, high;
problème dans la
phase de conception low = read_word(timer_register);
• Désactiver high = timer_hi;
systématiquement les
interruptions durant return (((unsigned long)high)<<16
les accès Hardware + (unsigned long)low);
• Utilisation des « 3 Une information erronée sur le temps
registres de capture » }
130 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Problèmes typiques en C
Code réentrant
• Les applications embarqués sont toujours programmées à l’aide
d’interruptions ou parfois également avec des systèmes d'exploitation
temps réel.
• Risque d’accès simultané (sans précautions spécifiques) aux mêmes
ressources (interfaces matérielles, variables globales).
• Les fonctions doivent être programmé afin qu’elles soient
réentrantes. C'est à-dire que :
• Les variables globales ne doivent être accessibles que de façon exclusive
(atomique).
• Il ne faut pas appeler les fonctions non réentrantes (attention avec les
fonctions des libraires standards).
• Les interfaces matérielles ne doivent être accessibles que de façon exclusive.
131 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Programmation défensive
• La programmation défensive signifie que l’on considère toutes les
éventualités :
• arguments transmis aux fonctions non plausibles, transmission de données
erronées, séquences temporelles pas prévues, etc.). Lorsque
• Elle est recommandée pour des systèmes ou la sécurité est
essentielle,
132 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• Les compilateurs C essayent de générer un code objet le plus optimisé
que possible. Cela signifie que ce dernier doit être à la fois aussi
rapide et compact que possible.
• Le résultat du compilateur peut également être influencé de façon
significative par la manière dont le code C est défini.
134 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• Eviter autant que possible les variables globales.
• Définir plutôt les variables locales à l’intérieur des fonctions.
• Le compilateur peut ainsi stocker ces dernières dans des registres locales - plutôt que de
les placer dans la mémoire externe (RAM). Ce qui diminue le temps d’accès aux
variables.
• Réduire autant que possible le nombre de variables locales
• Le nombre des registres est limité et les variables, qui ne peuvent pas être
stockées dans des registres, sont placées sur les piles.
• Au besoin, essayer d’utiliser ces dernières de façon limitée à l’intérieur de la
fonction.
• le compilateur peut attribuer un seul registre aux divers variables durant l'exécution de
la fonction.
135 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• Evitez les opérations de prises d’adresse avec les variables locales.
• Cela empêche le compilateur de les stocker dans des registres.
• L’assembleur en ligne ne devrait être utilisé qu’en dernier recours.
• Le compilateur n’a pas de droit d’optimiser le code C autour de ces derniers.
• Utiliser plutôt les sous-routines en assembleur.
• Eviter de définir des fonctions avec des listes des paramètres variables
(comme printf).
• L’appel de ces fonctions nécessite en générale plus de ressources systèmes.
• Remplacer les fonctions très courtes (1 à 3 lignes de code) par des macros
ou des fonctions en ligne (inline).
• Les ressources systèmes nécessaires à l’appel des fonctions peuvent ainsi être
réduites au maximum.
• Le compilateur copie littéralement les lignes de code des fonctions en ligne aux endroits
appropriés dans le programme.
136 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• La transmission des arguments aux fonctions devrait être réalisée à
l’aide de paramètres au lieu de variables globales.
• Dans le premier cas, le compilateur utilise les registres pour transmettre les
arguments.
• Cette procédure est beaucoup plus rapide que l'accès systématique aux
variables globales, qui sont stockées dans la mémoire externe (RAM).
• Les premiers arguments sont en général transmis avec des registres et les
suivants avec la pile. Par conséquent, il faut faire également attention au
nombre d’arguments, qui vont être transmis à la fonction
137 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• Utiliser le mot-clé « volatile » pour indiquer au compilateur, que la
variable ne peut pas être stockée dans un registre.
• Cette dernières sera ainsi toujours déposée dans la mémoire externe (RAM).
• Cette définition est même indispensable pour les variables qui permettent
d’accéder à la partie matérielle comme par exemple le « Timer ».
• Essayer les différents niveaux
d'optimisation du compilateur.
• Le niveau le plus haut
ne génère ici pas forcément
le code le plus rapide
ou le plus compact.
138 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• Utiliser pour la définition des variables toujours le type de données le
plus adéquat en fonction de la taille de la CPU (8, 16 ou 32 bits).
• Autrement, le compilateur doit effectuer une voire plusieurs opérations cast.
• Les opérations arithmétiques avec le type char sont en principe très efficaces
sur les microcontrôleurs 8 bits.
• Un microcontrôleur 8 bits est en générale dépassé avec les calculs à virgule
flottante. (temps d'exécution très longs).
139 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Optimisation du code C
• Contraintes d'alignement pour
les adresses des variables (arch
32 bits) : Essayer de déclarer
systématiquement les membres
32 bits en premier, les membres
16 bits en second et les
membres 8 bits à la fin dans les Long (32) Long (32)
141 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Spécification et exécutions des tests
• Il existe de nombreuses normes et directives pour effectuer des tests
logiciels, dont les plus recommandées sont les suivantes :
• IEEE 829, Standard for Software Test Documentation
• IEEE 1008, Standard for Software Unit Testing
• IEEE 1012, Standard for Software Verification and Validation
• Code standard/de débogage
#define _DEBUG
...
statement;
...
#ifdef _DEBUG
// additional testing and error messages output
#endif
142 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Watchdog
• La tâche du Watchdog (horloge de surveillance) est de réinitialiser un
microcontrôleur (c. à d. de ramener le système à un état défini) à
partir d'un état indéfini.
• Cet état est souvent le résultat d’un comportement erroné du
programme, comme par exemple une boucle infinie. Dans le langage
courant on appelle cela un plantage informatique (system crash).
• L’utilisation d'un watchdog est fortement recommandée même avec
des applications très simples.
143 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Watchdog
• WatchDog Timer (WDT)
• Timer qui fonctionne indépendamment de la CPU
et qui peut être utilisée pour déclencher une interruption
ou réinitialiser le microcontrôleur
• Dans quel cas l’utiliser?
• Effectuer une tâche à intervalles réguliers
• Se réveiller du sommeil (Wake-up) à un intervalle de temps
• Réinitialiser le MCU s'il est bloqué dans un mauvais état
144 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Watchdog
• Exemple : AVR
145 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Watchdog
• Exemple : Réinitialisation AVR
Si au bout de 1s le wdt n’est
pas réinitialisé le
programme dans le
microcontrôleur redémarre
146 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman
Watchdog
• Exemple : Réveil périodique sur AVR
147 | Cours Systèmes Embarqués, MR SysCoin, Préparé par : Slim Ben Othman