Go Down

Topic: leOS - un semplice OS per schedulare piccoli task (Read 42 times) previous topic - next topic

pablos

Ok, ho in test uno sketch, appena termina carico il tuo.

Io lo avevo caricato per curiosità e ho notato il blocco, per la verità non so nemmeno a cosa serva  XD XD
Un po' come con le cose nuove, si spacchettano, si attacca la spina, si premono un po' di bottoni e poi si leggono le istruzioni  ;)

ciao
no comment

leo72


Ok, ho in test uno sketch, appena termina carico il tuo.

Io lo avevo caricato per curiosità e ho notato il blocco, per la verità non so nemmeno a cosa serva  XD XD
Un po' come con le cose nuove, si spacchettano, si attacca la spina, si premono un po' di bottoni e poi si leggono le istruzioni  ;)

ciao

E' una caratteristica secondo me molto interessante, che si può anche utilizzare in altri ambiti, ossia anche come semplice funzione anti-freeze (se uno non ha nessun task da far eseguire in background).

Nella sua essenza originale tale funzione serve a controllare se un task si sia bloccato. Ogni volta che il watchdog va in overflow viene lanciato un segnale di reset. La ruotine che intercetta il reset controlla se c'è un task in esecuzione. Se c'è, decrementa un contatore che rappresenta il timeout passato dall'utente in fase di setup. Se tale timeout va a zero prima che il task termini la sua esecuzione, significa che si è bloccato ed ha conseguentemente bloccato tutto il micro. A questo punto, il watchdog lancia un reset e pone fine al problema  ;)

Però possiamo usarla anche come antiblocco del codice principale. Prendiamo ad esempio un task lanciato ogni secondo che controlla se una certa variabile di sistema è su un determinato valore. Se la trova ad esempio su false, la rimette a true ed esce mentre se la trova a true resetta il micro.
Nel loop principale l'utente la imposta a false ad ogni ciclo. Va da sé che se il loop si blocca, tale variabile non può essere impostata a false. Quindi il task di controllo, vedendola a true, resetta il micro.

pablos

Questa mi potrebbe interessare ;)
Ho provato diversi esempi con reset via software, ma nemmeno uno funzionava.
Avevo pensato a un circuito esterno RC che controllasse l'attività di un pin, in caso la frequenza va a zero per n secondi fa il reset.
Se il tuo funziona, potrebbe essere molto utile su schedine dove scarseggia la presenza di un operatore.


ciao
no comment

tuxduino

#398
Jan 02, 2013, 06:08 pm Last Edit: Jan 02, 2013, 06:09 pm by tuxduino Reason: 1
Quote
Se il tuo funziona, potrebbe essere molto utile su schedine dove scarseggia la presenza di un operatore.


L'uso "standard" del watchdog, supponendo per un attimo che non ci siano bootloader tra i piedi :) è proprio questo: il programma inizializza i registri opportuni e fa partire il WDT. Nel ciclo principale, che viene eseguito periodicamente, il WDT viene resettato, cioè riportato al valore iniziale. In questo modo gli si impedisce di arrivare  zero e resettare il micro.

Se il programma principale si blocca, per qualsiasi motivo, allora il reset del WDT non viene più eseguito, il timer raggiunge lo zero e il micro viene resettato, come se si operasse sul pin di reset. In questo modo il programma riparte. Il tutto senza che un operatore debba fare alcunché.

leo72

A quanto detto da tuxduino, aggiungo che io uso una modalità differente.
Quella da lui descritta è la modalità "system reset", che resetta appunto il micro. Nella modalità "interrupt" invece viene semplicemente sollevato un interrupt intercettabile da una ISR.
La terza modalità è quella più figa. "Interrupt, then system reset".
Inizialmente viene sollevato un interrupt: soccessivamente viene resettato il microcontrollore se non viene reimpostato l'interrupt per il successivo overflow del contatore del watchdog.

Contando gli interrupt posso eseguire un conto alla rovescia: passato il timeout predefinito, non reimposto più il watchdog per risollevare l'interrupt ed attendo il successivo reset.

Go Up