Cão de guarda independente (IWDG) ou cão de guarda de janela (WWDG)?

15

Ainda estou procurando uma resposta para esta pergunta:

Por que enquanto os MCUs do stm32 têm um cão de guarda perfeito (quero dizer, cão de guarda da janela (WWDG)), existe um cão de guarda simples (cão de guarda independente (IWDG))?

Encontrei esta página que dizia:

A ST Microelectronics possui uma linha de dispositivos Cortex-M3. O M3 se tornou extremamente popular para dispositivos embarcados de gama baixa, e o STM32F da ST é representativo dessas peças (embora o WDT seja um complemento da ST e não espelha necessariamente as implementações de outros fornecedores). O STM32F possui dois mecanismos de proteção diferentes. Um "cão de guarda independente" é um belo design de baunilha que tem pouco a oferecer além da facilidade de uso. Mas o Window Watchdog oferece proteção mais robusta. Quando um cronômetro de contagem regressiva expira, uma redefinição é gerada, o que pode ser impedido recarregando o cronômetro. Nada de especial lá. Mas se a recarga acontecer muito rapidamente, o sistema também será redefinido. Nesse caso, "muito rapidamente" é determinado por um valor que um programa em um registro de controle.

Outro recurso interessante: ele pode gerar uma interrupção antes de redefinir. Escreva um pouco de código para capturar a interrupção e você pode executar alguma ação para, por exemplo, colocar o sistema em um estado seguro ou capturar instantâneos de dados para fins de depuração. A ST sugere usar o ISR para recarregar o cão de guarda - ou seja, chutar o cão para que não ocorra uma redefinição. Não siga os conselhos deles. Se o programa falhar, os manipuladores de interrupção poderão muito bem continuar funcionando normalmente. E usar um ISR para recarregar o WDT invalida todo o motivo de um cão de guarda de janela.

e isso :

A nova série de CPUs STM32F4 Cortex ™ -M4 da STMicroelectronics possui dois cães de guarda independentes. Um é executado a partir de seu próprio oscilador RC interno. Isso significa que todos os tipos de coisas podem entrar em colapso na CPU e o WDT ainda será acionado. Há também um "observador de janelas" (WWDT) que requer que o código faça cócegas com frequência, mas não com muita frequência. Essa é uma maneira muito eficaz de garantir que o código travado que grava aleatoriamente no mecanismo de proteção não cause cócegas no WDT e o WWDT possa gerar uma interrupção logo antes da redefinição ser confirmada.

ok, vamos dar uma olhada no manual de referência :

O STM32F10xxx possui dois periféricos de vigilância incorporados que oferecem uma combinação de alto nível de segurança, precisão de temporização e flexibilidade de uso. Os dois periféricos de vigilância (Independente e Janela) servem para detectar e solucionar problemas de funcionamento devido a falha do software e para acionar a redefinição do sistema ou uma interrupção (somente vigilância da janela) quando o contador atingir um determinado valor de tempo limite. O watchdog independente (IWDG) é controlado por seu próprio relógio dedicado de baixa velocidade (LSI) e, portanto, permanece ativo mesmo se o relógio principal falhar. O relógio do watchdog da janela (WWDG) é pré-calculado a partir do relógio do APB1 e possui uma janela de tempo configurável que pode ser programada para detectar um comportamento anormal da aplicação tardia ou precoce. O IWDG é mais adequado para aplicativos que exigem que o cão de guarda seja executado como um processo totalmente independente fora do aplicativo principal, mas têm restrições de precisão de tempo mais baixas. O WWDG é mais adequado para aplicativos que exigem que o cão de guarda reaja dentro de uma janela de tempo precisa.

O watchdog da janela é usado para detectar a ocorrência de uma falha de software, geralmente gerada por interferência externa ou por condições lógicas imprevistas, o que faz com que o programa aplicativo abandone sua sequência normal. O circuito watchdog gera uma redefinição do MCU após o término de um período de tempo programado, a menos que o programa atualize o conteúdo do contador de contagem regressiva antes que o bit T6 seja apagado. Uma redefinição de MCU também é gerada se o valor de 7 bits do contador descendente (no registro de controle) for atualizado antes que o contador descendente atinja o valor do registro da janela. Isso implica que o contador deve ser atualizado em uma janela limitada.

Como você pode ver, nenhum deles disse que Por que há dois cães de guarda. se eu perguntar: Quais são as diferenças entre os dois cães de guarda, você contará todos os recursos que pode ver acima e, se quiser comparar os dois, obviamente o cão de guarda de janelas (WWDG) será o vencedor! então Por que existem dois cães de guarda?

Quero saber que quando devo usar o IWDG e quando o WWDG?

e existe algum motivo para nos dizer Por que eles chamam o segundo vigia com esse nome -> "vigia de janelas"?

Roh
fonte

Respostas:

23

Os cronômetros de vigilância regulares devem ser redefinidos em algum momento antes do tempo limite. Se você possui um WDT de 100 ms, é possível redefini-lo a cada 99,9 ms ou a cada 10 us e nunca haverá tempo limite.

Os temporizadores de vigia de janelas têm uma janela de tempo dentro da qual devem ser redefinidos. Se você redefinir muito cedo ou muito tarde (da redefinição anterior), o processador será redefinido.

O objetivo, se não for óbvio, é ajudar a garantir que o código que reinicializa o WDT seja o código pretendido, operando da maneira pretendida. Algum tipo de condição imprevista que gera redefinições WDT de alta frequência não impedirá a reinicialização do sistema.

Executar um WDT a partir do relógio do sistema pode ser um pouco problemático - se o relógio falhar e se não houver um circuito independente de monitor de relógio, coisas ruins podem acontecer. O relógio independente para o WDT significa que, se por algum motivo começar a funcionar na velocidade de 1/10, o WDT será redefinido (mas a janela WDT não).

Use os dois, se puder.

Como a página diz, redefinir o WDT com um ISR geralmente é ruim (mas pode ser aceitável se o ISR verificar se a redefinição do firmware está funcionando antes de redefinir o timer).

Spehro Pefhany
fonte
Realmente é possível que o relógio do sistema falhe? se isso acontecer, então podemos entender. assim, o WDT não é útil, estou certo? então por que será uma preocupação?
Roh 28/07
1
Se o relógio WDT independente forçar o MCU a um estado de redefinição (e esse estado for seguro), talvez seja possível evitar um desastre. Um cristal em MCU em curto causou um grave acidente nos primeiros dias (BART, IIRC).
Spehro Pefhany
1
@Roh: Na verdade, vi o relógio do sistema falhar ao retornar após entrar no modo de suspensão neste mesmo processador (bem, um STM32 F0, que é um M0). Acontece que, quando você faz certas coisas em determinados momentos, o relógio PLL pode falhar ao iniciar, e a coisa toda funciona na velocidade 1/6.
Nathon 16/04
@Nathon Obrigado. interessante. odeio totalmente a série M0. Parece que cada série de STM tem um problema.
Roh
7

O texto que você colou na pergunta fornece as respostas necessárias.

  1. Você usa o IWDG quando precisa de um cão de guarda simples ou quando precisa de um cão de guarda completamente independente - o IWDG tem seu próprio relógio, o WWDG deriva seu relógio de um dos relógios do barramento - se falhar ou se o software for desligado, o cão de guarda morre.
  2. Você usa o WWDG quando precisa de um watchdog que possa ser redefinido apenas dentro de um certo período de tempo (janela.) Se o seu software redefinir o WWDG tarde demais, o WWDG fará uma redefinição do processador. Se o seu software redefinir o WWDG muito cedo, também causará uma redefinição do processador.

É chamado de "watchdog de janela" pelo simples motivo de que somente um watchdog redefinido durante um período de tempo especificado (janela de oportunidade) impedirá que o watchdog reinicie seu processador.

Ambos fazem trabalhos semelhantes, mas de maneira diferente. O que você precisa depende dos requisitos que você precisa atender.

JRE
fonte
por favor, leia meu comentário para Spehro Pefhany.
Roh 28/07
1
O cronômetro usado pelo WWDG é programável - você pode alterar sua taxa através do seu software. Se o seu software ficar fora de controle e alterar a taxa de APB1, a janela de tempo estará errada e o cão de guarda reiniciará seu processador constantemente - seu chute de cão de guarda nunca (ou apenas por coincidência) chutará o cão de guarda na hora certa. Seu programa também poderá desativar completamente o relógio APB1 ou o timer WWDG, caso em que nunca redefiniria o processador.
JRE
5

Há outro motivo para usar o watchdog da janela, em vez disso ou ou além do watchdog independente. O WWDG tem uma interrupção que você pode conectar. Isso significa que, se o código entrou em um loop ou fuga, você pode definir um ponto de interrupção no WWDG ISR e trabalhar para trás para descobrir o que o firmware estava fazendo quando o cão latiu.

Você não pode fazer isso com o IWDG. Como o nome sugere, isso é independente do processador. Em vez de provocar uma interrupção, ele simplesmente afirma e desativa / RESET - o que não fornece muitas pistas sobre o motivo pelo qual latiu. Eu sugiro definir um WWDG dentro de seus parâmetros operacionais normais, além de um IWDG por um período muito mais longo, talvez 2 * WWDG no máximo. Crie uma função de kick-dog que retroceda ambos. Dessa forma, o IWDG late apenas quando o WWDG também é bloqueado, como um backup final.

Jon Green
fonte
1

Minha opinião:

Use os dois ao mesmo tempo, porque eles procuram diferentes condições de falha:

O timer do Watchdog independente (IWDG) precisa ser redefinido continuamente antes que o tempo limite se esgote . Na prática, você pode adicionar o código de redefinição em qualquer lugar em que tenha um estado de programa válido ou uma vez no loop principal, se você tiver um loop principal que deve ser executado frequentemente sem grandes atrasos. Dessa forma, se a sua chamada para redefinir o temporizador (às vezes chamada de "acariciar", "fazer cócegas ou simplesmente" redefinir "o cão de guarda") não ocorrer a tempo, significa que seu código A) ficou acidentalmente bloqueado em algum lugar que você não previa --- algum tipo de estado imprevisto do tipo loop infinito, ou B) ficou intencionalmente preso em algum lugar imposto por umassert()chamada de função com um loop infinito incorporado ao qual você deseja que o código vá sempre que alguma condição importante não for verdadeira. Portanto, agora que sua condição de afirmação é falsa, seu código fica intencionalmente preso em um loop infinito, e o watchdog redefine o microcontrolador para retornar a um estado válido. Observe também que "o watchdog independente (IWDG) é controlado por seu próprio relógio de baixa velocidade dedicado (LSI) e, portanto, permanece ativo mesmo se o relógio principal falhar" (consulte o Manual de Referência do ST RM0008 pág. 493 ).

Parece-me, no entanto, que o temporizador do Windows Watchdog (WWDG) foi projetado para não procurar os casos descritos acima (onde seu código, de forma não intencional ou intencional [por meio de uma declaração] fica "travada" em algum lugar), mas mais especificamente para o caso em que A) seu código NÃO executa algo que deveria . Em outras palavras, ele possui uma falha que faz com que seu loop principal ou outra subseção de código seja executada muito rapidamente (ou seja ignorada por completo), portanto, você redefine o watchdog muito cedo, fora da janela, e o mcu é redefinido. Ou, B)a outra condição que pode detectar é uma falha na configuração do temporizador. Talvez você esteja redefinindo-o em um intervalo fixo, mas seu timer usado para criar esse intervalo ou muda acidentalmente suas configurações em algum lugar que não deveria ter, ou você o configura mal em primeiro lugar, então o intervalo de tempo será desativado, seu a redefinição do intervalo de tempo redefinirá o WWDG fora de sua janela (muito cedo ou muito tarde) e o mcu será redefinido para notificá-lo e / ou corrigir a condição.

Esta é a minha opinião. Pensamentos ou feedback são bem-vindos.

Gabriel Staples
fonte
0

O watchdog "windowed" é apenas um watchdog regular que protege de alguma maneira as práticas de programação ainda piores. Como outros disseram, você tem um "período de tempo" geralmente ajustável onde seu "feed" deve ser fornecido.

Nenhum deles é à prova de balas se o seu código puder entrar em um loop automaticamente sustentado. Por exemplo. Se você planeja "alimentar" com base em IRQs relacionados ao timer, isso pode ser uma prática extremamente ruim, pois seu código pode ficar preso em algumas tarefas / durante o encadeamento de mensagens, enquanto as interrupções ainda podem alimentar seu WWDT na seqüência correta.

Na verdade, você pode usar interrupções para alimentar o WWDT se você puder diminuir sua prioridade de IRQ sob o código de execução normal , como você pode fazer no MIPS (Microchip).

Se o seu código for suporte vital, crítico, etc., basta largar todos eles e usar WDT externo (preferencialmente com base em perguntas e respostas).

orfruit
fonte