Aller au contenu

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. Avec STM32Cube, on signale une erreur avec les fonctions assert_failed(uint8_t* file, uint32_t line) (liée à la macro USE_FULL_ASSERT) ainsi que la fonction Error_Handler(void).

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.

Watchdog

STM32Cube

Pour utiliser le watchdog avec STM32Cube, consultez les chapitres 41 (HAL IWDG Generic Driver / page 561) et
72 (HAL WWDG Generic Driver / page 1119) du manuel UM1725 : “Description of STM32F4 HAL and low-layer drivers”. Le IWDG est un watchdog indépendant qui peut être remis à zéro à tout moment. Le WWDG (W pour Window) est un watchdog qui doit être remis à zéro dans une fenêtre de temps donnée.

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”. On peut le faire avec la macro __HAL_RCC_GET_FLAG décrite au chapitre 54.3.1 (RCC / page 740) du manuel UM1725.