Les systèmes embarqués fonctionnent dans un monde de contraintes strictes. Chaque cycle compte, et chaque octet de mémoire a son importance. Dans cet environnement, la clarté du code n’est pas seulement un atout, mais une exigence pour la stabilité et la sécurité. L’un des outils les plus puissants pour atteindre cette clarté est le diagramme d’état dans le cadre du langage de modélisation unifié (UML). Ces diagrammes fournissent un plan visuel du comportement logiciel au fil du temps en réponse aux événements.
Comprendre comment modéliser la logique à l’aide des machines à états est fondamental pour concevoir des applications embarquées robustes. Que vous construisiez un simple thermostat ou une unité de contrôle automobile complexe, visualiser le cycle de vie de votre logiciel aide à prévenir les erreurs logiques avant qu’elles ne se transforment en pannes matérielles. Ce guide décortique les concepts essentiels, les composants et les méthodes de construction pour créer des diagrammes d’état efficaces.

🧠 Qu’est-ce qu’un diagramme d’état ?
Un diagramme d’état, souvent appelé Statechart ou diagramme d’activité axé sur les états, représente le comportement dynamique d’un système. Contrairement à un organigramme, qui représente une séquence linéaire d’étapes, une machine à états modélise les conditions dans lesquelles un système existe à tout instant donné. Il répond à la question : « À quoi ressemble le système en ce moment, et qu’est-ce qui fait changer cet aspect ? »
Dans le contexte des systèmes embarqués, cela est souvent équivalent à une machine à états finis (FSM). La partie « fini » est cruciale. Cela signifie que le système ne peut être dans qu’un seul état spécifique à tout moment donné. Il ne peut pas être à la fois « en cours d’exécution » et « arrêté » simultanément. Cette séparation nette simplifie le débogage et les tests.
🔑 Composants fondamentaux d’une machine à états
Pour construire un diagramme, vous devez maîtriser le vocabulaire. Chaque diagramme valide est construit à partir d’un ensemble spécifique de blocs de construction. Ces éléments définissent la structure et la logique du système.
1. États
Un état représente une condition au cours de la vie d’un objet ou d’un système. C’est une période pendant laquelle le système attend un événement. Visuellement, les états sont généralement représentés par des rectangles arrondis.
- État simple : Un état basique sans structure interne (par exemple, « Inactif », « Actif »).
- État composite : Un état qui contient d’autres sous-états (par exemple, « Traitement » pourrait contenir « Lecture du capteur » ou « Écriture des données »).
- État initial : Le point de départ de la machine. Généralement représenté par un cercle plein.
- État final : Le point de terminaison. Généralement représenté par un cercle plein à l’intérieur d’un cercle plus grand.
2. Transitions
Une transition est le passage d’un état à un autre. Elle représente le changement d’état du système. Les transitions sont dessinées sous forme de flèches reliant deux états.
- Les transitions sont instantanées. Le système ne passe pas de temps « en transit ».
- Elles sont déclenchées par des événements spécifiques.
- Elles peuvent inclure des conditions (garde) qui doivent être remplies pour que le changement ait lieu.
3. Événements
Un événement est une occurrence importante qui déclenche une transition. Dans les systèmes embarqués, les événements sont souvent :
- Des interruptions matérielles (par exemple, une pression sur un bouton).
- Des délais d’attente (par exemple, un minuteur expiré).
- Des signaux logiciels (par exemple, des données reçues depuis un réseau).
- Complétions d’entrée/sortie d’état.
4. Actions
Les actions sont le travail effectué par le système. Elles sont associées aux états ou aux transitions. Il existe trois types principaux d’actions :
- Action d’entrée :Code qui s’exécute immédiatement lorsque le système entre dans un état.
- Action de sortie :Code qui s’exécute immédiatement lorsque le système quitte un état.
- Action Do :Code qui s’exécute de manière continue tant que le système reste dans l’état (par exemple, une boucle de contrôle de moteur).
5. Conditions de garde
Une condition de garde est une expression booléenne qui détermine si une transition peut avoir lieu. Elle agit comme un gardien. Même si un événement se produit, l’état ne changera pas à moins que la condition de garde ne soit évaluée à vrai.
- Exemple :
si (niveauBatterie > 20 %) - Exemple :
si (température < 100)
📊 Tableau de comparaison des composants
Pour clarifier les différences entre ces composants, reportez-vous au tableau ci-dessous.
| Composant | Symbole visuel | Fonction | Chronologie |
|---|---|---|---|
| État | Rectangle arrondi | Représente une condition | Durée (peut être longue ou courte) |
| Transition | Flèche | Connecte deux états | Instantanée |
| Événement | Texte sur la flèche | Déclenche la transition | Point d’occurrence |
| Garde | Texte entre crochets [] | Valide la transition | Avant l’exécution de la transition |
| Action | Texte sur la flèche ou dans l’état | Exécute la logique | Pendant l’entrée, la sortie ou le séjour |
🛠️ Guide étape par étape pour créer un diagramme
Créer un diagramme à partir de zéro peut sembler accablant. Suivez ce processus structuré pour garantir une cohérence logique et une complétude.
Étape 1 : Identifier la portée du système
Définissez ce que la machine à états contrôle. S’agit-il de l’appareil entier, ou seulement d’un module spécifique ? Garder la portée gérable est essentiel. Par exemple, ne cherchez pas à modéliser l’ensemble du système électronique de la voiture dans un seul diagramme. Concentrez-vous spécifiquement sur l'”Unité de contrôle du moteur” ou le “Module de gestion de l’alimentation”.
Étape 2 : Listez les états
Faites une séance de cerveau de groupe sur chaque condition possible du système. Demandez-vous : “Quels sont les modes de fonctionnement distincts ?”
- Éteint
- Démarrage
- Veille
- Fonctionnement actif
- Récupération d’erreur
Assurez-vous que ces états sont mutuellement exclusifs. Le système ne doit pas être dans deux états en même temps.
Étape 3 : Définissez les événements
Qu’est-ce qui fait passer le système d’un état à un autre, comme vous les avez listés à l’étape 2 ? Regardez les entrées.
- Entrée utilisateur (appui sur bouton)
- Signal externe (données du capteur)
- Horloge interne
- Erreur système
Étape 4 : Dessinez les transitions
Connectez les états à l’aide de flèches. Étiquetez chaque flèche avec l’événement qui la déclenche. Si une transition nécessite une condition, ajoutez la condition de garde entre parenthèses.
- Dessinez un cercle plein pour le point de départ.
- Dessinez un cercle double pour le point final.
- Connectez le point de départ à l’état opérationnel initial.
Étape 5 : Ajouter des actions
Précisez ce qui se produit à l’intérieur de chaque état. Si l’entrée dans l’état « Actif » nécessite l’initialisation d’une variable, indiquez cela comme une action d’entrée. Si la sortie de l’état « Actif » nécessite la sauvegarde de données, indiquez cela comme une action de sortie.
🌡️ Exemple pratique : Logique d’un thermostat
Appliquons ces concepts à un scénario classique embarqué : un thermostat numérique. Cet exemple montre comment gérer la logique de contrôle de température de manière claire.
Description du scénario
Le thermostat dispose de deux modes principaux : Chauffage et Refroidissement. Il commence dans un état « Éteint ». Lorsqu’un bouton est pressé, il passe en mode « Configuration ». Si la température descend en dessous d’un point fixe, il active le « Chauffage ». Si la température monte au-dessus d’un point fixe, il active le « Refroidissement ».
Construction du diagramme
Voici comment les états et les transitions se décomposent pour ce système.
- État : ÉTEINT
- Action d’entrée : Éteindre le chauffage, éteindre le ventilateur.
- Événement : Pression du bouton
- Transition : Passer à « CONFIGURATION ».
- État : CONFIGURATION
- Action d’entrée : Afficher la température actuelle.
- Événement : Diminution de la température
- Transition : Baisser la température cible.
- Événement : Pression du bouton (maintenue)
- Transition : Passer à « CHAUFFAGE ».
- État : CHAUFFAGE
- Action d’entrée : Mettre la broche du chauffage à HIGH.
- Action de traitement : Lire le capteur de température toutes les 5 secondes.
- Condition de garde : Si (tempActuelle >= tempCible)
- Transition : Passer à “ÉTEINT”.
Cette structure garantit que le chauffage ne s’allume jamais sauf si le système est explicitement dans l’état “Chauffage”. Elle empêche également les actions conflictuelles, telles que l’allumage du chauffage et du ventilateur en même temps de manière à provoquer un court-circuit.
⚠️ Pièges courants dans la conception d’états
Même les ingénieurs expérimentés peuvent introduire une complexité qui rend les machines à états difficiles à maintenir. Soyez attentif à ces problèmes courants.
1. L'”État spaghetti”
Évitez de créer un diagramme où chaque état est connecté à tous les autres. Si vous voyez un réseau de flèches croisées, la logique est probablement trop complexe. Utilisez des états composés pour regrouper des comportements liés. Par exemple, au lieu d’avoir “Erreur_1”, “Erreur_2” et “Erreur_3” comme états de niveau supérieur séparés, regroupez-les sous un état parent “Erreur” avec des sous-états.
2. Transitions manquantes
Que se passe-t-il si un événement se produit dans un état où il n’est pas défini ? Dans les systèmes embarqués, cela entraîne souvent un plantage ou un comportement indéfini. Définissez toujours une transition « tout attraper » ou assurez-vous que le système gère les événements imprévus de manière élégante, par exemple en passant à un état d’erreur par défaut.
3. Transitions non atomiques
Assurez-vous que les transitions se produisent comme une unité logique unique. Si une transition implique le changement de plusieurs variables, elles doivent toutes être mises à jour avant que le système n’entre dans l’état suivant. Ne permettez pas au système de rester dans un état partiellement mis à jour.
4. Surutilisation des actions “Do”
Bien que les actions “Do” soient utiles pour un suivi continu, leur surutilisation peut faire paraître la machine à états comme une boucle continue plutôt qu’un modèle basé sur des états. Réservez les actions “Do” aux tâches qui doivent s’exécuter de manière répétée pendant que le système attend un événement, telles que le sondage des capteurs.
🔍 Approfondissement : Conditions de garde vs. logique dans les actions
L’une des questions les plus fréquentes en conception embarquée est où placer la logique : dans la condition de garde ou dans l’action elle-même.
- Conditions de garde : Utilisez-les pour des vérifications booléennes simples qui déterminent si une transition a lieu. Gardez-les légères. Si la logique est complexe, elle ralentit le traitement des événements.
- Actions : Utilisez-les pour le véritable travail effectué pendant la transition. Si vous devez calculer une valeur ou mettre à jour une variable, faites-le dans l’action.
Considérez un scénario où une transition a lieu uniquement si le niveau de la batterie est suffisant. La condition doit vérifier si (batterie > 10%). Si vrai, l’action pourrait être demarrerMoteur(). Cette séparation rend le diagramme lisible : la flèche vous indique quand cela se produit, et l’étiquette vous indique quoi il fait.
🧪 Tests et validation
Une fois le diagramme terminé, comment savez-vous qu’il fonctionne ? La conception basée sur le modèle vous permet de tester le diagramme avant d’écrire une seule ligne de code C ou C++.
1. Couverture des chemins
Suivez tous les chemins possibles à travers le diagramme. Pouvez-vous atteindre chaque état ? Pouvez-vous atteindre chaque transition ? Assurez-vous qu’il n’y ait pas de culs-de-sac où le système se bloque.
2. Tests de séquence d’événements
Simulez une séquence d’événements. Par exemple, appuyez sur le bouton, attendez 5 secondes, appuyez à nouveau sur le bouton. L’état change-t-il comme prévu ? Cela aide à vérifier que le timing et l’ordre des événements sont corrects.
3. Cas limites
Testez les limites. Que se passe-t-il si la température est exactement au seuil ? Que se passe-t-il si deux événements se produisent simultanément ? Assurez-vous que la machine à états gère ces cas limites sans plantage.
🔄 Machine à états vs. Schéma de flux
Les débutants confondent souvent les diagrammes de machines à états avec les schémas de flux. Bien qu’ils utilisent des formes et des flèches, ils ont des objectifs différents.
| Fonctionnalité | Diagramme de machine à états | Schéma de flux |
|---|---|---|
| Objectif | Comportement du système dans le temps | Flux d’exécution de l’algorithme |
| Durée | Les états ont une durée (temps passé) | Les étapes sont instantanées |
| Entrée | Événements (externes/interruptions) | Données d’entrée |
| Réutilisabilité | Élevée (les états peuvent être réutilisés) | Faible (chemin linéaire) |
| Idéal pour | Contrôle embarqué, logique d’interface | Calculs, traitement de données |
Pour les systèmes embarqués, la machine à états est supérieure pour la logique de contrôle car elle gère explicitement les périodes d’attente et les réponses aux événements qui définissent les systèmes temps réel.
📝 Meilleures pratiques pour les machines à états embarquées
Pour maintenir la qualité du code et la fiabilité du système, respectez ces directives lors de l’implémentation de la logique dérivée de votre diagramme.
- Conventions de nommage : Nommez clairement vos états et événements. Utilisez le PascalCase pour les états (par exemple,
ÉtatInactif) et le CamelCase pour les événements (par exemple,SurAppuiBouton). - Séparation des états : Gardez les états petits. Si un état contient trop de logique, divisez-le en sous-états.
- Gestion des événements : Utilisez une file d’événements pour gérer les signaux entrants. Cela garantit que les événements sont traités dans l’ordre et évite les conditions de course.
- Variables d’état : Suivez l’état actuel dans une variable dédiée. Évitez d’utiliser des drapeaux pour déterminer l’état ; utilisez la variable d’état elle-même.
- Documentation : Maintenez le diagramme à jour. Si le code change, le diagramme doit refléter ce changement. Un diagramme obsolète est plus dangereux qu’aucun diagramme.
🚀 Conclusion
Concevoir du logiciel embarqué exige précision et anticipation. Les diagrammes de machines à états fournissent la base visuelle nécessaire pour atteindre cette précision. En décomposant un comportement complexe en états discrets et des transitions bien définies, vous créez des systèmes plus faciles à comprendre, à tester et à maintenir.
Commencez petit. Modélisez d’abord une fonction simple. Au fur et à mesure que vous vous familiariserez avec les composants — états, transitions, événements et gardes — vous découvrirez que ces diagrammes deviennent des outils indispensables dans votre boîte à outils d’ingénieur. Ils transforment la logique abstraite en une carte concrète, guidant votre code à travers les complexités de l’interaction avec le matériel du monde réel.
Souvenez-vous, l’objectif n’est pas seulement d’écrire du code qui fonctionne, mais de concevoir des systèmes résilients face à la nature imprévisible du monde physique. Avec une base solide de machine à états, vos projets embarqués seront plus solides.











