Pages: 1 ... 20 21 [22] 23 24 ... 31   Go Down
Author Topic: leOS - un semplice OS per schedulare piccoli task  (Read 30582 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink

Stasera vedo se pubblico qualcosa, ora devo staccare.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un test.... una prova... un commento...  smiley-roll-sweat
Logged


Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-eek-blue 

Ho letto la discussione che ha portato a leos2. Tanto di cappello per questo nuovo lavoro sul "wdt-based scheduler" smiley
Ho letto anche l'articolo sul tuo sito: interessante e ben scritto IMHO.

Appena ho un minuto voglio provare con calma il leos2.

Nel frattempo ti segnalo un typo:

 core Tiny per i microcontrollorti Attiny
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nel frattempo ti segnalo un typo:

 core Tiny per i microcontrollorti Attiny
Corretto.
Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao, con la versione 1 come faccio ad aumentare l'intervallo minimo da 1000 a 2000 millisecondi?
ho guardato in leOS.cpp ma l'unico 1000 che trovo è F_CPU == 1000000UL
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao, con la versione 1 come faccio ad aumentare l'intervallo minimo da 1000 a 2000 millisecondi?
ho guardato in leOS.cpp ma l'unico 1000 che trovo è F_CPU == 1000000UL

Domanda sibillina  smiley-sweat
Se intendi aumentare l'intervallo di esecuzione di uno sketch, questo lo imposti tu durante l'aggiunta del task allo scheduler:
myOS.addTask(funzione, intervallo)
Basta mettere "intervallo" a 2000 ed il task sarà eseguito ogni 2000 millisecondi.

Se stai guardando nel file .cpp, cosa stai cercando? L'impostazione del timer 2 è fatta per avere un overflow ogni millisecondo, quindi 1 ms è l'intervallo minimo.
Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quindi mi basta mettere 2000 come intervallo in addTask() ?
Sul tuo sito però ho letto una cosa diversa: http://www.leonardomiliani.com/?p=516
Quote
Con miaFunzione indicate la funzione che volete schedulare, con intervallo un numero non più grande di 1000 (potete modificare questo valore nel file leOS.cpp) che indica ogni quanti ms volete far ripetere la vostra funzione.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

E' una refuso probabilmente di vecchie versioni. Quella pagina la aggiorno via via, ma qualcosa mi può essere scappato. Correggo subito  smiley-wink
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

PS: ricordati che puoi anche cambiare questo valore "in corsa", ossia anche dopo che il task è stato inserito nello scheduler, usando la funzione modifyTask e passando il nuovo intervallo.
Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, grazie mille!

per il problema dei lavori gravosi che avevo chiesto qualche pagina fà, è una buona idea fare con leOS i compiti meno gravosi che voglio siano fatti sempre con un intervallo preciso, e fare con looper il resto?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

leOS e looper sono incompatibili perché entrambi basati sull'uso del timer 2.
Potresti provare looper e leOS2 ma, alla fine, forse incasini tutto e basta. Tanto vale strutturare meglio il codice, perché forse se hai bisogno di una gestione così articolata il problema potrebbe risiedere nella logica del programma.
Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il mio problema è che devo aggiornare un display lcd, e lo vorrei fare non più velocemente di ogni secondo, perchè se no non si leggerebbe bene e non mi serve istantaneamente vedere le variazioni.
farò con il metodo blinkwithoutdelay, è una buona idea secondo te?
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il mio problema è che devo aggiornare un display lcd, e lo vorrei fare non più velocemente di ogni secondo, perchè se no non si leggerebbe bene e non mi serve istantaneamente vedere le variazioni.
farò con il metodo blinkwithoutdelay, è una buona idea secondo te?

leo mi pare che leOS sia preemptive quindi sia possibile usare la delay(), giusto ?
Logged

0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

con leOS il delay non influisce sui task, con looper influisce solo quando supera le tempistiche dei task (vediamo se leo mi bacchetta smiley)

Io ho fato la tua stessa cosa del display con blinkwithout delay, prima che leo inventasse looper.
Ora mi chiedevo se e' piu' facile usare looper o il blinkwithout delay, leo che dici quale e' piu' intuitivo-userfriendly ?

Purtroppo ancora non e' stato inventato il "mio" mitico delay2() dove basterebbe scrivere delay2(1000) per avere un blinkwithoutdelay facile da usare.

Leo ma questa mi idea e' informaticamente irrealizzabile ?
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

Pages: 1 ... 20 21 [22] 23 24 ... 31   Go Up
Jump to: