Pergunta

Eu tenho um sistema embarcado que tem vários (> 20) tarefas em execução em diferentes prioridades. Eu também tenho watchdog da tarefa que é executada para verificar se todas as outras tarefas não está preso. Meu cão de guarda está funcionando porque de vez em uma lua azul, que irá reiniciar o sistema, pois uma tarefa não check-in.

Como faço para determinar qual tarefa morreu?

Eu não posso culpar apenas a tarefa mais antiga para chutar o cão de guarda porque poderia ter sido realizada fora por uma tarefa de maior prioridade que não está rendendo.

Todas as sugestões?

Foi útil?

Solução

Um cão de guarda per-tarefa requer que as tarefas prioritárias maior rendimento para um tempo adequado para que todos possam chutar o cão de guarda. Para determinar qual tarefa é a culpa, você vai ter que encontrar o que é passar fome os outros. Você precisa medir os tempos de execução de tarefas entre as verificações de vigilância para localizar o verdadeiro culpado.

Outras dicas

Mesmo que eu estava trabalhando últimas semanas sobre Watchdog problema de reinicialização. Mas, felizmente para mim nos arquivos ramdump (em ambiente de desenvolvimento ARM), que tem um buffer de rastreio manipulador de interrupção, contendo PC e SLR em cada uma das interrupções. Assim, desde o traço tampão eu poderia exatamente descobrir qual parte do código estava sendo executado antes de reset WD.

Eu acho que se você tem mesmo tipo de mecanismo de armazenagem dos PC, SLR em cada interrupção, em seguida, você pode precisamente descobrir tarefa culpado.

É este o preventivo? Percebi isso desde o contrário uma tarefa de vigilância não seria executado se um dos outros tinha ficado preso.

Você faz nenhuma menção do sistema operacional, mas, se uma tarefa de vigilância pode verificar se uma única tarefa não tem check-in, deve haver canais separados de comunicação entre cada tarefa eo cão de guarda.

Você provavelmente vai ter que modificar o cão de guarda de alguma forma despejar o número tarefa do que não verificou no e despejar os blocos de controle de tarefas e memória para que possa fazer um post-mortem .

Dependendo do sistema operacional, isso pode ser fácil ou difícil.

Dependendo do seu sistema e do sistema operacional, pode haver diferentes abordagens. Uma abordagem muito baixo nível que tenho usado é para piscar um LED quando cada uma das tarefas está em execução. Você pode precisar colocar um escopo sobre os LEDs para ver a alternância de tarefas muito rápido.

Para um cão de guarda-driven interrupção, você tinha acabado de fazer a atualização alternador de tarefas o número de tarefas em execução no momento cada vez que é alterada, permitindo que você identifique qual não deu.

No entanto, você sugiro que você escreveu o cão de guarda como uma tarefa a si mesmo, por isso antes de reiniciar, certamente o cão de guarda pode identificar a tarefa de fome? Você pode armazenar isto em memória que persiste para além de uma reinicialização a quente, ou enviá-lo através de uma interface de depuração. O problema com isto é que a tarefa faminto provavelmente não é a problemática:. Você provavelmente vai querer saber os últimos interruptores tarefa (e horários), a fim de identificar a causa

A simplista, de volta da abordagem guardanapo seria algo como isto:

int8_t wd_tickle[NUM_TASKS]

void taskA_main()
{
   ...
   // main loop
   while(1) {
     ...
     wd_tickle[TASKA_NUM]++;
   }
}

... tasks B, C, D... follow similar pattern

void watchdog_task()
{
   for(int i= 0; i < NUM_TASKS; i++) {
     if(0 == wd_tickle[i]) {
       // Egads! The task didn't kick us! Reset and record the task number
     }
    }
}

Como é o seu sistema de trabalho exatamente? Eu sempre uso uma combinação de cães de guarda de software e hardware. Deixe-me explicar ...

Meu exemplo assume que você está trabalhando com um kernel em tempo real de preferência e você tem o apoio de vigilância em sua cpu / microcontrolador. Este observatório vai realizar uma reposição se ele não foi expulso withing um determinado período de tempo. Você quer verificar duas coisas:

1) O temporizador periódica do sistema ( "relógio RTOS") está em execução (se não, funciona como "sono" não seria mais trabalho e seu sistema está inutilizável).

2) Todos os segmentos podem executar withing um período razoável de tempo.

Meu RTOS (www.lieron.be/micror2k) oferece a possibilidade de executar código no relógio RTOS interrupção manipulador. Este é o único lugar onde você atualizar o cão de guarda de hardware, assim você tem certeza que o relógio está correndo o tempo todo (se não o cão de guarda irá redefinir seu sistema).

No thread inactivo (sempre rodando a prioridade mais baixa), um "cão de guarda software" é atualizada. Isto é simplesmente uma configuração variável para um determinado valor (por exemplo, 1000). Na interrupção relógio RTOS (onde você chutar o cão de guarda de hardware), você diminuir e verificar este valor. Se ele chegar a 0, isso significa que o thread inactivo não foi executado para 1000 ticks de relógio e você reiniciar o sistema (pode ser feito por looping indefinidamente dentro do manipulador de interrupção para permitir que a reinicialização watchdog de hardware).

Agora, para sua pergunta original. Presumo que o relógio do sistema continua a funcionar, por isso é o cão de guarda software que redefine o sistema. No manipulador de relógio de interrupção RTOS, você pode fazer algumas "estatísticas reunindo" no caso da situação watchdog software ocorre. Em vez de repor o sistema, você pode ver o fio está funcionando em cada tique do relógio (após o problema ocorre) e tentar descobrir o que está acontecendo. Não é o ideal, mas vai ajudar.

Outra opção é adicionar vários cães de guarda de software em diferentes prioridades. Tem o conjunto de fios variávelA ocioso para 1000 e têm uma linha de prioridade média (dedicado) definir B. Variável No relógio RTOS interrupção manipulador, você verificar ambas as variáveis. Com essas informações você sabe se o segmento looping tem uma prioridade maior, em seguida, "médio" ou diminuir, em seguida, "médio". Se quiser, você pode adicionar um 3º ou 4º ou quantos software cães de guarda que você gosta. Pior caso, adicionar um cão de guarda de software para cada prioridade que é usada (vai custar-lhe como muitos segmentos extras embora).

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