Go Down

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

leo72

Perfect. Oggi butto giù qualche riga di codice e faccio i test.

leo72

#311
Nov 14, 2012, 06:49 pm Last Edit: Nov 14, 2012, 06:58 pm by leo72 Reason: 1
Non funziona.
Rileggendo la documentazione che mi hai linkato, mi sembra di capire che comunque si possono verificare condizioni anomale, come ISR nidificate che possono saturare lo stack. Difatti facendo eseguire un paio di task insieme, di cui uno freezante, ad un certo punto i led che ho messo di debug lampeggiano stranamente, poi il tutto si resetta e riparte per bene, per poi riandare in tilt di lì a poco.

lesto

il problema degli stack lo hai solo quando si lanciano troppi interrupt senza che i precedenti siano completi.
Per questo devi fare attenzione a lanciare il task solo una volta, e in tutti gli altri casi lasciare il prima possibile l'interrupt libero.

che codice hai usato?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72


il problema degli stack lo hai solo quando si lanciano troppi interrupt senza che i precedenti siano completi.
Per questo devi fare attenzione a lanciare il task solo una volta, e in tutti gli altri casi lasciare il prima possibile l'interrupt libero.

che codice hai usato?

Sì, difatti. Riflettendoci sono arrivato alla stessa conclusione.
Sto pian piano risolvendo  ;)

Stasera vedo se pubblico qualcosa, ora devo staccare.

leo72

Come promesso, ecco la versione 2.0.90 del leOS2.

La novità è la possibilità di passare allo schedulatore un valore di timeout nel begin della libreria.
Se non si passa nulla viene considerato il valore 0, cioè task eseguiti all'infinito senza controllo sullo stato degli stessi. Se, cioè, un task blocca la CPU, tutto lo sketch si congelerà.
Se invece si passa un valore di timeout (da specificare in ticks, oppure da convertire da milisecondi in ticks usando la nuova funzione convertMs), lo schedulatore imposta il WDT in modalità "interrupt + system reset". Ogni volta che il timer del watchdog va in timeout, viene sollevato un interrupt e contemporaneamente viene resettato il flag WDIE. Se nella ISR non si reimposta ad 1 tale flag, al timeout successivo il WDT resetterà direttamente il micro.
La novità della introduzione del timeout risiede nel fatto che la ISR è stata resa non atomica di modo che essa possa essere chiamata più volte dal WDT. All'interno della ISR si controlla se c'è un task in esecuzione: se si trova, si modifica un contatore. Quando si è passato il numero di tick impostati come timeout ed il task risulta ancora in esecuzione, allora si può ragionevolmente pensare che esso si sia bloccato e si resetta il flag WDIE, in modo che al successivo controllo il WDT resetti il micro.
In allegato trovate un nuovo sketch di esempio denominato "leOS2_reset_after_timeout".

Per provare collegate 2 LED sui pin 7 ed 8. Nello sketch vengono creati 2 task: il primo fa lampeggiare uno dei due led, mentre il secondo freeza la CPU in un loop senza fine dopo 5 secondi.
Modificando la chiamata al metodo begin() potete variare il modo in cui il WatchDog tratta il freeze: se non passate un timeout, vedrete che dopo 5 secondi di lampeggio, il LED si blocca acceso e non succede più nulla. Se passate invece un timeout vedrete che, dopo che il LED si blocca acceso, il micro viene resettato trascorso il tempo preimpostato (ci accorgiamo del reset perché ad ogni avvio il micro fa lampeggiare un paio di volte il secondo LED che abbiamo collegato).

La libreria è alla versione 2.0.90 volutamente, considero questa release una beta. Attendo i vostri pareri prima di rilasciarla come 2.1.0 stabile.
http://www.leonardomiliani.com/?p=516

Go Up