Por que os programas param o watchdog timer no MSP430?

11

Muitos programas de amostra para o MSP430 têm sua primeira linha como:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Porque é que eles fazem isto?

necromante
fonte

Respostas:

15

O watchdog timer (WDT) está ativado por padrão, é algo útil em aplicativos mais complexos, mas atrai muitas pessoas novas. Eles geralmente não atendem ao WDT em seu código ou incluem uma rotina de serviço de interrupção (ISR) para lidar com o evento WDT; portanto, quando o chip continua sendo redefinido, eles ficam muito frustrados. Além disso, os programas de amostra não estão, na maioria das vezes, tentando demonstrar o WDT e, portanto, estão desativados.

Edit: O timer do cão de guarda poderia ter sido chamado de "interruptor do homem morto". Seu comportamento padrão é redefinir o microcontrolador, a menos que o firmware informe periodicamente que tudo está funcionando bem. Isso é conhecido como "alimentar o cachorro" ou "chutar o cachorro". Dessa forma, se o seu firmware ficar preso em um loop ou parar de funcionar conforme o esperado, o cão de guarda não será alimentado e redefinirá o chip (esperançosamente para um novo estado de funcionamento).

Você também pode usar o WDT como interrupção periódica para executar outras tarefas, o que você puder imaginar. Você apenas precisa escrever o ISR relevante.

Samuel
fonte
+1 obrigado, embora eu e outros leitores possam consultá-lo, seria bom conhecer uma breve razão para o motivo pelo qual o WDT redefine o chip. (Não se preocupe sobre a adição ele, porém, a sua resposta é boa o suficiente para aceitar tal como está (depois de esperar mais algumas horas para outras respostas possíveis))
necromante
eu acho que eu deveria ter mencionado na pergunta que eu sou um novato absoluto, que também não tem idéia do que é o watchdog timer é :)
necromante
2
@ necromancer Ah, não se preocupe, adicionei as informações relevantes.
Samuel
2
Samuel - em quase todos os casos, você NÃO deve usar um ISR para redefinir um WDT. É quase sempre a coisa errada a se fazer. As interrupções podem continuar alegremente enquanto outras partes do programa estão fora do país. Ocasionalmente é possível / necessário (com a comunicação entre o ISR e outras partes do firmware que efetivamente define um segundo nível de WDT), mas não deve ser sugerido a um novato como primeira abordagem.
Spehro Pefhany
9

Além do argumento de Samuel sobre pessoas que acidentalmente invadiram o WDT, há outra razão importante pela qual ele deve ser desativado inicialmente.

Mesmo que seu aplicativo normalmente seja capaz de redefinir o timer corretamente, talvez não seja possível fazer isso durante o código de inicialização, por dois motivos:

  • A inicialização pode demorar mais do que um único tick WDT, mas exige que as interrupções sejam desativadas. Isso significa que, se você contar com, por exemplo, um ISR do timer para redefinir o timer, poderá entrar em um loop infinito de inicialização.
  • Você não conhece necessariamente o estado do registro do timer em todas as MCUs (ou seja, o próximo tick pode ser muito mais cedo do que o esperado, pois o registro pode não iniciar em 0).

Como resultado, é uma boa prática desabilitar o WDT como a primeira coisa que você faz, mesmo que nunca o tenha ativado .

Se você quiser usá-lo, poderá reativá-lo imediatamente antes de ativar as interrupções, como a última etapa do seu código de inicialização.

sapi
fonte
+1 obrigado por adicionar à resposta. eu descobri que você pode desabilitá-lo antes de inicialização usando int _system_pre_init(void)função, que é executado antesmain
necromante