Newsgroup: it.hobby.elettronica.digitale
Titolo: Watchdog con un sistema operativo

Secondo voi come va usato un dispositivo di watchdog esterno I2C con un 
processore che sta eseguendo un sistema operativo embedded, per esempio Linux?
Nel caso di un semplice microcontrollore posso calcolare molto bene i tempi di 
esecuzione delle routine ed evitare che il watchdog scatti resettandolo 
opportunamente.
Quando ho un sistema operativo complesso non real-time come Linux, le pause per 
eseguire delle istruzioni non sono calcolabili a priori, quindi il timer per il 
watchodog dovrebbe essere relativamente lungo, dell'ordine di qualche secondo.
Il problema però riguarda il modo in cui vado a gestire il reset del watchdog. 
Se creo un'applicazione che gira continuamente in background e che ha l'unico 
compito di resettare il watchdog ogni x millisecondi, riesco tranquillamente ad 
intercettare il blocco del sistema operativo (e quindi anche di questa 
applicazione), ma non riesco ad intercettare il blocco di un altro task (un web 
server?) che sta girando e che potrebbe a sua volta bloccarsi senza bloccare 
tutto il sistema operativo e quindi neanche l'applicazione che resetta il watchdog.
D'altro canto, se resetto il watchdog direttamente nella mia applicazione A (web 
server?), posso intercettare il blocco di questa applicazione A, ma non posso 
intercettare il blocco di un'altra applicazione B (ftp server?).
Se inserisco il reset del watchdog in tutte le applicazioni, alla fine se una 
sola di queste si blocca, il watchdog non scatta mai perchè le altre, non 
bloccate, lo resettano come se niente fosse successo.
La domanda è quindi: come si usa un watchdog con un sistema operativo embedded?

 embedded?
Ti dico come avevo risolto il problema quando sviluppavo applicazioni 
con un estensione DOS multiThreading.
Creavo un thread di supervisione che, tra le altre cose, si occupava di 
rinfrescare il watchdog hardware e di tenere sotto controllo lo stato 
degli altri thread.
Gli altri thread (acquisizione, comunicazione, ...) oltre a fare cio' 
per cui erano stati creati segnalavano il loro buon funzionamento 
scrivendo una valore diverso da zero in una memoria condivisa.
Il thread di supervisione ad intervalli regolari controllava il valore 
di queste variabili condivise riazzerandole dopo ogni ciclo.
Se una di queste variabili non era aggiornata in tempo utile (valore 
bloccato a zero) il thread era dichiarato defunto e si gestiva la 
anomalia, nel mio caso il thread di supervisione comandava la chiusura 
ordinata dei thread operativi dopo di che il programma terminava. Il 
watchdog hardware, non più rinfrescato, faceva il resto provocando il 
reset hardware della macchina.
In sostanza le funzionalità dei thread operativi erano assicurate da un 
watchdog software gestito da un thread di supervisione la cui 
funzionalità era garantita da un watchdog hardware.
Definire variabili condivise in ambiente multithread e' banale: sono 
variabili C globali.
Se avessi usato processi anziché thread avrei utilizzato le shared memory.
Ciao
Paolo

 embedded?
Io ho in produzione una scheda wd da collegare via usb al pc da monitorare.
Tipicamente la strada da seguire è quella di avere un unico servizio che ha 
il compito di ricevere un messaggio di 'refresh' da ogni altra applicazione 
e monitorare nello stesso tempo i servizi principali della macchina.
Sul come scambiarsi le informazioni di refresh esistono diverse strade, 
dipendenti anche il parte da cosa permette il sistema operativo.
C'è anche chi (brutalmente), va a rinfrescare periodicamnte degli appositi 
files sul disco e l'applicazione di supervisione verifica i timestamp.
La scheda wd è in grado sia di resettare il pc in caso di blocco (contatto 
reset) che di accendere il pc in caso di mancata partenza automatica (agendo 
sul contatto di power, la scheda è sempre accesa in quanto essendo collegata 
via usb è alimentata dai 5VSB), che di forzare uno shutdown e successiva 
ripartenza (sempre agendo sul contatto di power).
Roberto P. 

processore che sta eseguendo un sistema operativo embedded, per esempio Linux?
Devi usare un servizio o thread ad elevata priorità per quella funzione
--
ciao
  Stefano

 Ti dico come avevo risolto il problema
[...]
Ringrazio qui tutti per le idee che mi avete suggerito. Devo dire sinceramente 
che la soluzione era quasi banale, ma non ci avevo proprio pensato.