Retour à l'accueil

Fiabilité du logiciel embarqué : techniques, méthodes et outils

Explorez des approches complètes pour améliorer la fiabilité des systèmes embarqués : temporisateurs watchdog, MPU, Lockstep, ECC, CRC, tests unitaires et Health Monitor pour les développeurs intermédiaires/seniors.

Approche complète pour améliorer la fiabilité du logiciel embarqué
Advertisement 728x90

Approche holistique pour l'amélioration de la fiabilité des logiciels embarqués : techniques et outils

Assurer la fiabilité des logiciels embarqués est une tâche d'une importance capitale pour les développeurs, car les pannes dans de tels systèmes peuvent entraîner des conséquences graves, allant de la perte de données aux menaces de sécurité et aux dommages financiers considérables. Cet article explore un large éventail de méthodes et de pratiques visant à minimiser les erreurs, les défaillances et les pannes dans les systèmes embarqués, couvrant les mécanismes matériels, les approches logicielles et les stratégies de test et de surveillance systémiques.

Introduction aux concepts de fiabilité des systèmes embarqués

Avant d'aborder les méthodes d'amélioration de la fiabilité, il est essentiel de bien comprendre les termes fondamentaux. La fiabilité est la capacité d'un système à exécuter ses fonctions prévues dans des conditions spécifiées pendant une période définie. Les pannes, les défaillances et les erreurs en sont les antithèses.

  • Erreur : Écart d'une valeur mesurée par rapport à la valeur réelle. C'est un problème qui peut être corrigé pendant le développement ou l'exploitation.
  • Défaillance : Condition anormale qui réduit ou altère complètement la capacité d'une unité fonctionnelle à exécuter ses tâches. Une défaillance peut entraîner une panne.
  • Panne : Cessation de la capacité d'un système ou de l'un de ses composants à remplir ses fonctions, que ce soit complètement ou partiellement.
  • Crash : Dysfonctionnement inattendu d'un équipement ou destruction d'une infrastructure rendant toute opération ultérieure de l'objet impossible, souvent avec des dommages matériels importants mais sans victimes humaines.
  • Catastrophe : Événement aux conséquences tragiques, incluant des pertes humaines, causé par un désastre majeur.

Comprendre ces distinctions aide à appliquer de manière ciblée les méthodes de prévention et de détection des problèmes à différents niveaux.

Google AdInline article slot

Mécanismes matériels et de bas niveau pour la stabilité

La fiabilité des systèmes embarqués commence au niveau matériel et avec des solutions logicielles de bas niveau capables de prévenir ou d'atténuer les conséquences des états critiques.

Le Watchdog Timer (WDT) est un mécanisme fondamental. Il est conçu pour réinitialiser automatiquement le microcontrôleur (MCU) si le firmware se bloque en raison de données d'entrée incorrectes, d'erreurs d'exécution ou de conditions de stress. Si le logiciel ne parvient pas à « nourrir » le chien de garde (c'est-à-dire à réinitialiser son compteur) dans un intervalle spécifié, le WDT déclenche une réinitialisation du système, l'empêchant d'entrer dans un état inopérable.

Le Window Watchdog (WWDG) étend le concept du WDT en ajoutant un contrôle non seulement pour le seuil inférieur mais aussi pour le seuil supérieur. Le firmware doit réinitialiser le WWDG dans une fenêtre de temps strictement définie. Le réinitialiser trop tôt ou trop tard est également considéré comme une erreur et entraîne un redémarrage. Cela permet la détection des blocages système et des exécutions de code trop rapides ou incorrectes.

Google AdInline article slot

Le Bit Stuffing est une méthode d'encodage de données utilisée dans les protocoles de transmission comme CAN ou USB. Son essence réside dans l'insertion forcée d'un bit inversé après un certain nombre de bits consécutifs du même niveau (par exemple, cinq). Cela empêche l'accumulation d'une composante continue sur le bus et, plus important encore pour la fiabilité, permet au récepteur de détecter les erreurs de synchronisation ou la corruption de données si une séquence de bits violant cette règle est trouvée.

L'MPU (Memory Protection Unit) pour le contrôle des débordements de mémoire est un composant matériel du processeur qui assure la protection de la mémoire sans support de mémoire virtuelle. Une MPU permet de définir des régions de mémoire avec des droits d'accès différents (lecture, écriture, exécution). Lors d'une tentative d'accès non autorisé, la MPU génère une exception. Dans le contexte des systèmes embarqués, cela est d'une importance capitale pour prévenir les débordements de pile ou de tas. En configurant des régions interdites entre la pile/le tas et d'autres zones de mémoire, les tentatives d'écriture au-delà des limites allouées peuvent être détectées, signalant des erreurs ou des vulnérabilités potentielles.

L'opération du CPU en mode Lockstep est une approche de tolérance aux pannes où plusieurs cœurs de processeur (souvent deux) exécutent le même ensemble d'instructions simultanément ou avec un décalage temporel minimal. Les sorties de ces cœurs sont constamment comparées. Si les résultats ne correspondent pas, cela indique une défaillance matérielle dans l'un des cœurs, et le système peut déclencher une interruption ou une réinitialisation. Cette méthode permet de détecter les défaillances causées par des influences externes (par exemple, interférences électromagnétiques ou radiations), augmentant considérablement la fiabilité des systèmes critiques pour la sécurité.

Google AdInline article slot

Le Matrix Access Monitor (MAM) est un module matériel spécialisé que l'on trouve dans certains microcontrôleurs. Il fournit un contrôle d'accès détaillé et une protection de la mémoire pour divers périphériques et blocs (cœurs, DMA, Ethernet). Le MAM permet la configuration logicielle des droits d'accès pour chaque périphérique esclave, assurant l'isolation et empêchant les opérations non autorisées, améliorant ainsi la stabilité globale du système.

Méthodes logicielles pour la protection des données et des processus

Au-delà des mécanismes matériels, de nombreuses méthodes logicielles visent à améliorer l'intégrité des données et à assurer une exécution correcte des processus.

Le vote (Majoring) est une technique de prise de décision basée sur le consensus. Par exemple, lors de la transmission de données via UART, la valeur d'un bit peut être déterminée sur la base de plusieurs échantillons pendant l'intervalle de bit. Si la majorité des échantillons indique '1', le bit est interprété comme '1'. Ce principe s'applique également au stockage de données : pour la NVRAM, trois copies identiques de données peuvent être stockées, et lors de la lecture, la version qui correspond à au moins deux sur trois est sélectionnée, assurant la résilience contre les erreurs de bit unique.

Le Stack Painting est une méthode de diagnostic où la portion inutilisée de la pile est remplie d'un motif spécifique (par exemple, un nombre magique). La vérification périodique de ce motif permet de déterminer l'utilisation maximale de la pile et de détecter un débordement si le motif a été corrompu. Cela fournit des métriques précieuses pour optimiser l'allocation de mémoire et identifier les problèmes potentiels aux premiers stades de développement.

Les vérifications d'adéquation des lectures de capteurs sont d'une importance capitale pour les systèmes qui dépendent de données externes. Tout capteur peut tomber en panne ou transmettre des données incorrectes. Par conséquent, après avoir mesuré une grandeur physique, il est essentiel de vérifier immédiatement les lectures pour détecter les valeurs aberrantes, les valeurs absurdes ou les dépassements de plages admissibles afin de prévenir un comportement incorrect du système.

La validation de la configuration avant application — selon des normes telles que l'ISO-26262, les paramètres de configuration doivent être validés à l'exécution avant utilisation. Cela permet de détecter les programmes mal configurés ou les paramètres corrompus, empêchant le système de démarrer dans un état inopérable ou dangereux.

Les sections critiques sont des blocs de code qui nécessitent un accès exclusif. Par exemple, lorsque l'on travaille avec des ressources partagées (FIFOs, variables globales) ou lors d'un changement de contexte (par exemple, lorsqu'un bootloader charge une nouvelle application). Au sein d'une section critique, les interruptions sont généralement désactivées pour empêcher la modification externe des données ou de l'état, ce qui pourrait entraîner une corruption de données ou des blocages système.

La Heartbeat LED — un indicateur simple mais efficace de l'état de santé du système. Une LED clignotante signale que la boucle de programme principale (superloop) est en cours d'exécution et que le firmware n'est pas figé. Cela fournit une surveillance visuelle rapide de l'état de l'appareil.

La rétroaction — un principe fondamental des systèmes de contrôle. Les systèmes embarqués utilisent souvent la rétroaction pour confirmer l'exécution des commandes. Par exemple, un microcontrôleur pourrait utiliser un ADC pour mesurer la tension aux bornes des bras d'un pont en H afin de s'assurer que le courant est bien fourni à la charge, confirmant ainsi l'exécution correcte d'une commande.

L'Error Correcting Code (ECC) est une méthode avancée d'encodage de données qui non seulement détecte mais corrige aussi automatiquement les erreurs lors du stockage ou de la transmission d'informations. Contrairement aux simples sommes de contrôle, l'ECC peut restaurer les données originales, ce qui est d'une importance capitale pour la fiabilité de la mémoire (par exemple, la RAM) et du stockage de données.

Le CRC (Cyclic Redundancy Check) est une méthode de détection d'erreurs largement utilisée. Lors de la réception d'un paquet de données, la vérification de son CRC garantit que les données n'ont pas été corrompues pendant la transmission. De même, un bootloader doit vérifier la somme de contrôle de l'application avant de l'écrire ou de la lancer. Une non-concordance du CRC32 indique une corruption du firmware, empêchant l'exécution d'un code incorrect ou potentiellement dangereux.

Le bit de parité — la forme la plus simple de contrôle d'erreur, essentiellement un CRC d'un seul bit. Il est souvent utilisé dans les interfaces série comme l'UART pour détecter les erreurs de bit unique dans les octets transmis.

La numérotation des paquets — lors de la transmission de données, la numérotation des paquets permet au récepteur de détecter la perte de continuité du flux ou les paquets abandonnés. Cette exigence se retrouve souvent dans les normes de sécurité, telles que l'ISO-26262, pour assurer l'intégrité de la communication.

Tests, surveillance et approches systémiques de la fiabilité

Une approche globale de la fiabilité est impossible sans des tests systématiques et une surveillance continue de l'état du système.

Les tests unitaires sont le fondement du développement de qualité. Ils permettent de vérifier les composants de code individuels de manière isolée, de localiser les causes des pannes et d'assurer la sécurité lors du refactoring. Les tests servent non seulement d'outil de vérification, mais aussi de documentation vivante pour le code. Idéalement, les tests pour les versions de débogage peuvent être intégrés directement dans le firmware et exécutés au démarrage ou sur commande.

Le Health Monitor (HM) est une tâche, un thread ou une fonction périodique dédiée qui suit en permanence l'état de tous les composants clés du système : compteurs d'erreurs, registres d'état et état des périphériques. Si des anomalies sont détectées, le HM informe l'utilisateur ou un autre système de contrôle. Par exemple, un HM peut identifier les configurations d'interruption incorrectes dans les systèmes multi-cœurs et les restaurer automatiquement, prévenant les pannes. Il est capable de détecter des problèmes qui auraient pu être manqués par les tests unitaires, augmentant considérablement la tolérance aux pannes globale du produit.

Points clés à retenir

  • La fiabilité des logiciels embarqués est assurée par une approche multicouche, englobant des mécanismes matériels et logiciels.
  • L'utilisation de chiens de garde (WDT, WWDG) et de MPU est d'une importance capitale pour prévenir les blocages système et les débordements de mémoire.
  • Les méthodes de protection des données telles que le Bit Stuffing, l'ECC, le CRC et le vote garantissent l'intégrité des données lors de la transmission et du stockage.
  • Les systèmes en lockstep et les Matrix Access Monitors offrent des moyens matériels avancés pour la tolérance aux pannes et l'isolation.
  • Des tests complets (tests unitaires) et une surveillance continue (Health Monitor) sont indispensables pour identifier et résoudre les problèmes tout au long du cycle de vie du produit.

— Editorial Team

Advertisement 728x90

Lire ensuite