Exceptions et Watchdog
Dans ce cours, tout comme dans le cours “architecture des ordinateurs”, nous insistons beaucoup sur la qualité et la fiabilité du code. Voici un petit résumé de ce que nous faisons déjà :
- utilisation du tracing pour garder une trace de ce qui se passe et pour détecter des erreurs;
- respect des règles de style pour faciliter la lecture du code;
- utilisation d’assertions dans le code pour vérifier des conditions lors de l’exécution;
- utilisation d’un framework de tests pour réaliser des tests unitaires;
- utilisation du CI/CD pour automatiser les tests.
Les exceptions et le traitement des erreurs
Malgré ces efforts, il est toujours possible que votre programme doive lever une exception. Bien que C++ offre des fonctionnalités pour gérer les exceptions, cette fonctionnalité est assez “lourde” pour les systèmes embarqués et n’est pas recommandée. Mbed OS propose des fonctions et des macros pour générer et traiter les erreurs de manière performante.
Le watchdog
Une autre défaillance possible c’est que le programme se trouve dans une boucle infinie et bloque l’exécution du programme. Les bons algorithmes devraient éviter ces boucles infinies, mais si elles surviennent quand même, le watchdog permet de détecter ces boucles infinies et de réagir en redémarrant la cible avec un reset.
Le principe de fonctionnement du watchdog est basé sur un timer. Lors du
démarrage du watchdog (start
), le compteur est initialisé avec une valeur
donnée qui correspond au timeout. Le compteur est ensuite automatiquement
décrémenté avec une fréquence donnée. Tant que le programme fonctionne
correctement, il utilise la méthode kick
pour remettre le compteur à la valeur
du timeout. Si le programme entre dans une boucle infinie, personne n’appelle
la méthode kick
et le compteur continu de diminuer jusqu’à atteindre zéro. Dès
qu’il atteint zéro, le watchdog redémarre la cible avec un reset.
L’implémentation du watchdog dans Mbed OS est décrite sur le site de Mbed OS.
Notez qu’il n’y a qu’un seul watchdog et il est implémenté avec le design
pattern du singleton. Pour obtenir l’instance du watchdog, utilisez la
méthode Watchdog::get_instance()
.
Lorsque la cible redémarre à cause d’un reset, produit par le watchdog, il
serait intéressant de le savoir et de pouvoir faire la différence avec un
démarrage “normal”. C’est pourquoi le microprocesseur et Mbed OS fournissent
la méthode ResetReason::get()
pour récupérer la raison du reset. Lisez la
documentation
pour plus d’informations.