Pourquoi les programmes arrêtent-ils la minuterie de surveillance sur le MSP430?

11

De nombreux exemples de programmes pour le MSP430 ont leur première ligne comme:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Pourquoi font-ils cela?

nécromancien
la source

Réponses:

15

Le chronomètre de surveillance (WDT) est activé par défaut, c'est une chose utile à avoir dans des applications plus complexes, mais déclenche beaucoup de nouvelles personnes. Souvent, ils ne desservent pas le WDT dans leur code ou n'incluent pas de routine de service d'interruption (ISR) pour gérer l'événement WDT. Ainsi, lorsque leur puce continue de se réinitialiser, ils deviennent très frustrés. En outre, les exemples de programmes n'essaient généralement pas de montrer le WDT, il est donc désactivé.

Edit: La minuterie du chien de garde aurait pu être nommée "interrupteur de l'homme mort". Son comportement par défaut consiste à réinitialiser le microcontrôleur, sauf si le micrologiciel lui fait périodiquement savoir que tout fonctionne correctement. C'est ce qu'on appelle «nourrir le chien» ou «donner un coup de pied au chien». De cette façon, si votre micrologiciel est bloqué dans une boucle ou cesse de fonctionner comme prévu, le chien de garde n'est pas alimenté et réinitialise la puce (espérons-le dans un nouvel état de fonctionnement).

Vous pouvez également utiliser le WDT comme interruption périodique pour effectuer d'autres tâches, tout ce que vous pouvez imaginer. Il vous suffit d'écrire l'ISR correspondant.

Samuel
la source
+1 merci, bien qu'i et d'autres lecteurs puissent le rechercher, ce serait bien de connaître une raison très brève pour laquelle le WDT réinitialise la puce. (ne vous inquiétez pas de l'ajouter cependant, votre réponse est assez bonne pour être acceptée telle quelle (après avoir attendu quelques heures de plus pour d'autres réponses possibles))
nécromancien
je suppose que j'aurais dû mentionner dans la question que je suis un débutant absolu qui n'a également aucune idée de ce qu'est le chronomètre de surveillance :)
nécromancien
2
@necromancer Ah, pas de soucis, j'ai ajouté les informations pertinentes.
Samuel
2
Samuel - dans presque tous les cas, vous ne devez PAS utiliser un ISR pour réinitialiser un WDT. C'est presque toujours la mauvaise chose à faire. Les interruptions peuvent gaiement continuer tandis que d'autres parties du programme sont désactivées dans la-la land. C'est parfois possible / nécessaire (avec une communication entre l'ISR et d'autres parties du firmware qui définit effectivement un deuxième niveau de WDT) mais ne devrait pas être suggérée à un débutant comme première approche.
Spehro Pefhany
9

En plus de l'argument de Samuel sur les personnes qui déclenchent accidentellement le WDT, il y a une autre raison importante pour laquelle il devrait être désactivé initialement.

Même si votre application est normalement capable de réinitialiser correctement le minuteur, elle peut ne pas être en mesure de le faire pendant le code d'initialisation, pour deux raisons:

  • L'initialisation peut prendre plus de temps qu'un seul tick WDT, mais nécessite la désactivation des interruptions. Cela signifie que si vous comptez, par exemple, sur un ISR de minuterie pour réinitialiser la minuterie, vous pourriez entrer dans une boucle de démarrage infinie.
  • Vous ne connaissez pas nécessairement l'état du registre de temporisation sur tous les MCU (c.-à-d., Le prochain tick pourrait être beaucoup plus tôt que prévu, car le registre pourrait ne pas commencer à 0).

Par conséquent, il est recommandé de désactiver le WDT comme première chose que vous faites, même si vous ne l'avez jamais activé .

Si vous souhaitez l'utiliser, vous pouvez le réactiver immédiatement avant d'activer les interruptions, comme dernière étape de votre code d'initialisation.

sapi
la source
+1 merci d'avoir ajouté à la réponse. j'ai découvert que vous pouvez le désactiver avant l'initialisation en utilisant la int _system_pre_init(void)fonction, qui s'exécute avantmain
necromancer