Pergunta

Eu tenho um cão de guarda na minha microcontrolador que se não for expulso, irá repor o processador. Minhas aplicações funciona muito bem por um tempo, mas acabará por repor porque o cão de guarda não ser chutado. Se eu passo através do programa trabalha muito bem.

Quais são algumas maneiras para depurar isso?

EDIT: Conclusão: A maneira que eu encontrei o meu erro foi a farinha de rosca de vigilância.

Eu estou usando um PIC que tem uma alta e baixa vector ISR. A elevada do vetor foi suponha que para lidar com a matriz de LED e do Baixo vector foi para lidar com a marcação timer. Mas eu colocar os dois manipuladores de ISR no alto vector. Então, quando eu desativado o ISR matriz de LED e o serviço de timer tick ISR necessário, o processador seria preso na baixa ISR para lidar com a marcação timer, mas o manipulador temporizador carrapato não estava lá.

As migalhas de pão limitado minha busca para baixo para a função que lidou com a matriz de LED e, especificamente, desativando a interrupção matriz de LED.

Foi útil?

Solução

Adicionar uma variável global não inicializada que é definido para valores diferentes por todo o código. Especificamente, defina-o antes e depois de grandes chamadas de função.

Coloque um ponto de interrupção no início do principal.

Quando o processador redefine a variável global ainda terá o último valor que foi definido para. Continue adicionando esses "migalhas de pão" para diminuir a função de problema.

Outras dicas

Muitos cães de guarda de software são desativados automaticamente quando você anexar um depurador (para evitar que ele seja reiniciado enquanto o depurador tem a aplicação interrompida).

Dito isto, aqui estão alguns princípios básicos:

Este é um aplicações de vários segmentos? Você está usando um agendador RT? Se assim for, é sua tarefa de vigilância fome?

Certifique-se de sua tarefa de vigilância não pode ser preso em qualquer coisa (pendente semáforo, à espera de uma mensagem, etc). Às vezes, as funções podem bloquear em maneiras que você não pode esperar; por exemplo, eu tenho uma plataforma Linux Eu estou trabalhando agora onde eu posso obter printf para bloquear com bastante facilidade.

Se é único segmento, um profiler pode ajudar a identificar problemas de tempo.

Se este é um novo sistema, verifique se o watchdog funciona corretamente; código simples teste que só atinge o WD e depois dorme em um loop infinito.

Eu uso de programação baseado no estado e um truque que eu sempre quis empregar foi reservar uma porta de saída para o estado atual em binário. Em seguida, ligar um analisador lógico e veja os horários das mudanças de estado. Você poderia fazer algo semelhante aqui: Do que Robert disse e criar uma variável global e mude seu valor em pontos-chave - de preferência com uma função que imediatamente define o valor da porta para o estado atual (ou seja changeState (nextState);) Alterar o estado quando você entra na função que chuta o cachorro, então alterá-lo de volta ao estado anterior antes de sair da função. Você deve ser capaz de ver de quais funções ele não ser chutado e, em seguida, você pode trabalhar sobre aqueles.

Boa sorte, isso soa como um problema de tempo e aqueles são difíceis de resolver.

Normalmente, a tarefa de vigilância / segmento é executado em uma prioridade baixa. Então, se o cão de guarda não está sendo chutado, isso deve ser porque o processador está ocupado fazendo outra coisa -. Provavelmente algo que ele não deveria estar fazendo

Seria muito útil para despejar o contexto de execução (pilha local, estadual programação etc.) para cada tarefa / thread apenas antes de repor o processador. Com um pouco de sorte e trabalho, você vai ser capaz de determinar o que está impedindo a tarefa de vigilância de chutar o temporizador.

Eu usaria um pino de saída extra, situado no alto, em seguida, baixo em pontos apropriados no código para limitar o escopo de onde eu estou olhando. Então eu segui-lo em um analisador de escopo ou lógica digital. Isto é equivalente ao método de pão ralado mencionado por outro cartaz, mas você vai ser capaz de correlacionar tempo para o pulso de reset muito melhor.

Você pode inserir um loop while em seu código e de alternância um LED dentro do loop while. Esta é a maneira eficaz para verificar se a placa está redefinindo.

Pergunta cada suposição que você faz, duas vezes:

  • Certifique-se o cão de guarda é chutado (Eu não sei as instalações madeireiras no processador).
  • Verifique se o cão de guarda, quando chutada, não repõe o processador.

E me pergunto o que diferenças existem entre 'percorrendo' e funcionando sozinho; restrições de tempo certamente irá matéria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top