Un approccio comune è quello di delegare il cane da guardia calci ad un compito specifico (spesso sia la più alta priorità o la priorità più bassa, Compromessi/motivazioni per ogni approccio), e poi tutti gli altri compiti "check-in" con questo compito.
questo modo:
se un interrupt è appeso (100% CPU), il compito kicker non funzionerà, si ripristina
se il compito kicker è appeso, si ripristina
se un altro compito è appeso, compito kicker non vede il check-in, il compito kicker non calciare WDG, si ripristina
Ora ci sono naturalmente dettagli di implementazione da considerare. Alcune persone hanno ogni compito impostato il proprio bit dedicato (atomicamente) in una variabile globale; l'attività kicker controlla questo gruppo di bit flag ad una velocità specifica e cancella/reimposta quando tutti hanno effettuato il check-in (insieme al kicking del WDG, ovviamente.) Evito i globals come la peste ed evito questo approccio. I flag di eventi RTOS forniscono un meccanismo un po 'simile che è più elegante.
In genere progetto i miei sistemi embedded come sistemi event-driven. In questo caso, ogni attività si blocca in un posto specifico - in una coda di messaggi. Tutte le attività (e ISR) comunicano tra loro inviando eventi/messaggi. In questo modo, non devi preoccuparti di un'attività che non si verifica perché è bloccata su un semaforo "Laggiù" (se ciò non ha senso, scusa, senza scrivere molto di più non riesco a spiegarlo meglio).
Inoltre, vi è la considerazione: le attività eseguono il check-in "autonomamente" o rispondono/rispondono a una richiesta dall'attività kicker. Autonomo - ad esempio, una volta al secondo, ogni attività riceve un evento nella sua coda "tell task kicker sei ancora vivo".Richiesta di risposta: una volta al secondo (o qualsiasi altra cosa), le attività di kicker indicano a tutti (tramite le code) "il tempo di effettuare il check-in" - e alla fine ogni attività esegue la coda, ottiene la richiesta e le risposte. Si applicano considerazioni su priorità del compito, teoria delle code, ecc.
Ci sono 100 modi per skinare questo gatto, ma il principio di base di una singola attività che è responsabile del kicking del WDG e del fatto che altre attività si incanalano verso l'attività kicker è piuttosto standard.
C'è almeno un altro aspetto da considerare - al di fuori dello scopo di questa domanda - e che si occupa degli interrupt. Il metodo descritto sopra attiverà il reset di WDG se un ISR esegue il hogging della CPU (buono), ma per quanto riguarda lo scenario opposto - un ISR (purtroppo) si è disabilitato accidentalmente e inavvertitamente. In molti scenari, questo non verrà rilevato e il tuo sistema continuerà a battere il WDG, tuttavia parte del tuo sistema è paralizzata. Cose divertenti, ecco perché amo lo sviluppo embedded.
Stiamo prendendo in considerazione un watchdog che fa parte di RTOS o un timer di watchdog hardware effettivo che i servizi RTOS? –