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.