L’appunto più frequente che hanno fatto gli utenti del leOS era l’incompatibilità fra il mio scheduler ed altre librerie che usavano lo stesso timer usato dal leOS. Per questo motivo ho deciso di seguire un’altra strada per ottenere uno scheduler funzionante ed ho scelto di utilizzare il WatchDog. Il WatchDog è un circuito normalmente utilizzato per resettare il microcontrollore nel caso la CPU si blocchi in un ciclo infinito. Il WatchDog ha un timer che, una volta impostato, è incrementato da un oscillatore a 128 kHz, integrato nei microcontrollori Atmel, attraverso un prescaler. Quando il timer scade, il WDT (WatchDog Timer) resetta il microcontrollore.
Ma il WDT può anche essere usato per sollevare un interrupt. In questa modalità, il WDT può essere utilizzato come un timer per richiamare lo scheduler ad intervalli prefissati. Il WDT non è così configurabile come un timer per cui l’intervallo minimo che possiamo impostare è ~16 ms, ma questo è più che sufficiente per i nostri scopi.
Il leOS2 può far funzionare il WDT in una particolare modalità detta “interrupt then system reset”, che prima solleva un interrupt e poi, se uno specifico flag non viene reimpostato ad “1”, resetta il microcontrollore. Grazie a questo trucco, ho potuto scrivere uno scheduler che può resettare il microcontrollore se si accorge che un task si è bloccato durante l’esecuzione. Il periodo di timeout prima che lo scheduler resett il microcontrollore è impostabile dall’utente.