Um comando Reboot () com failover

1

Estou implementando uma chamada de reinicialização () no meu aplicativo. É um aplicativo incorporado, portanto, nenhum console, teclado ou chave liga / desliga. A reinicialização () deve, eventualmente, reiniciar o sistema, não importa o quê. Idealmente, eu quero que ele falhe graciosamente.

Já tive sistemas no passado causando problemas onde uma chamada para reboot ou shutdown não resultou em uma reinicialização da máquina. por exemplo. Falha ao sincronizar unidades, desmontar uma unidade flash USB removida.

Meu sistema é incorporado, com um sistema de arquivamento raiz montado somente para leitura, portanto, um desligamento repentino não é um grande problema. Mas eu escrevo logs para um disco Flash e gostaria de preservar isso o máximo possível.

Meu Reboot atual () se parece com isto:

void Reboot()
{
    system( "reboot" );     // try the reboot
    sleep(2);
    system( "reboot -f" );      // force
    sleep(2);
    system( "reboot -f -n" );   // force and don't try to sync
    sleep(2);
    system( "kill 1" );     // process 1 is the root process of all
    sleep(2);
    Reset();
}

O comando reset é uma reinicialização do sistema que não irá falhar. O sistema também tem um temporizador de Watchdog.

As pessoas gostariam de comentar sobre qualquer coisa para adicionar / substituir / alterar na minha função Reboot ()?

por exemplo. devo usar o Magic SysRq ?

    
por Mr Stinky 17.09.2012 / 12:38

1 resposta

0

The system also has a Watchdog timer.

Acho que esta é sua resposta - libere o cache do bloco e pare de chutar o watchdog. Eu trabalhei em muitos sistemas embarcados, e não consigo me lembrar de um que realizou uma reinicialização usando os mecanismos tradicionais de servidor / PC.

    
por 29.05.2017 / 21:25