leOS - un semplice OS per schedulare piccoli task

(slightly-OT) Mi viene in mente che usando un buffer più ampio rispetto alla dimensione del display (ad esempio 40 colonne x 2 righe) e parametrizzando la routine di refresh con la colonna di partenza, si possono generare facilmente delle animazioni. Ad esmpio testo scorrevole. Il codice "applicativo" si comporta come se il display avesse 40 colonne anziché 16. La routine di refresh del display parte dalla colonne impostata (chiamiamola currRefreshCol) per copiare i 16x2 caratteri sul display fisico. Variando currRefreshCol, ad esempio con un'azione temporizzata, si ha che il testo sembra scorrere sull'lcd.

la funzione scorrimento e' integrata gia' nella libreria se non si vogliono fare cose complicate

ho provato a fare un buffer con un array char bidimensionale, ma non riesco a stamparlo sul display con print() o write()
se invece faccio due buffer uno per riga li riesco a stampare

(Secondo me stiamo andando un po' troppo OT. Propongo di aprire un altro topic che tratti specificamente del tema buffer <=> lcd.)

Detto ciò, cmq rispondo: posta il codice che hai scritto.
Io ho uno sketch di prova che implementa un "virtual screen" più grande dell'LCD fisico. Include anche una funzione che copia un buffer bidimensionale sull'lcd.

Arriva leOS2 2.1.0.
Questa è la prima versione stabile del leOS2. Ho corretto un bug per cui non veniva rispettato il valore di timeout passato in fase di inizializzazione prima di resettare il microcontrollore: nella precedente 2.0.91 il reset avveniva immediatamente, indipendentemente dal valore passato, mentre adesso viene rispettato perfettamente.

Lo sketch di test mostra il comportamento di questa funzione a mio avviso molto interessante: creo 2 task, 1 che fa lampeggiare un led con una frequenza di 500 ms, un altro task invece viene lanciato dopo 5 secondi e freeza la CPU del micro con un ciclo infinito. Nel loop() metto un lampeggio di un altro led con frequenza di 100 ms.
Si può notare come dopo 5 secondi di attività, il micro si congeli. Trascorso il tempo di timeout impostato, l'Atmega viene resettato.

Tutto questo usando sempre il solo WatchDog, quindi niente timer od altro messi nel mezzo. Ricordo che la cosa è possibile creando una ISR di gestione dell'interrupt del contatore del watchdog non atomica, quindi interrompibile da altri eventi. In questo modo posso invocare un task e contemporaneamente richiamare la ISR al successivo overflow del contatore del watchdog e decrementare il valore di timeout. Se il task completa l'esecuzione entro il tempo di timeout, l'esecuzione del codice prosegue regolarmente, altrimenti l'ISR continua a decrementare il timeout. Se questo giunge a 0, viene impostato un flag per cui al successivo overflow del watchdog non venga più sollevato un interrupt ma venga resettato direttamente il microcontrollore.

Per il download ed ulteriori approfondimenti:
www.leonardomiliani.com/?p=516

Veramente notevole

O_o

son stato assente per molto tempo,cmq bravo,ottimo lavoro!! :smiley:
quando porterai i tuoi progetti su github?! :stuck_out_tongue:

tuxduino:
Veramente notevole

O_o

Grazie. :wink:

m_ri:
son stato assente per molto tempo,cmq bravo,ottimo lavoro!! :smiley:
quando porterai i tuoi progetti su github?! :stuck_out_tongue:

Ci sarebbero di già ma per ora pubblicizzo solo il download dal mio sito, altrimenti non riesco a seguire tutto.

PS: su github non c'è ancora la versione 2.1.0, la metterò online domani (ora non sono a casa).

Ti segnalo questa nuova libreria --> GitHub - chrismoos/avr-os: Multitasking OS for Arduino and AVR platforms

io invece ti segnalo il fatto che gli IDE più recenti hanno un "autoimportatore" di librerie, tu gli dai il path o l'url di un file zip e lui ti copia e scompatta il tutto nella cartella Libraries. Non l'ho provato, l'ho letto di sfuggita su un issue di github.
In pratica ricordi che girò un link che puntava a raccogliere tutte le librerie? probabilmente hanno intenzione di automatizzare il tutto :slight_smile:

PaoloP:
Ti segnalo questa nuova libreria --> GitHub - chrismoos/avr-os: Multitasking OS for Arduino and AVR platforms

Non è uno scheduler completamente automatizzato, mi pare. Va chiamato continuamente dal loop, ed il controllo è fatto su millis. Inoltre non ho capito bene cosa intenda per

each task has its own stack that is restored when a task is resumed

A me pare che salvi solo il puntatore allo stack, non salva lo stato del microcontrollore. Potrei sbagliarmi.
Non so però la logica esatta di come funziona, non ho studiato il codice.

mah,dal context.h direi che salva tutto da r0 a r31..i vari stati penso siano in sti registri..

m_ri:
mah,dal context.h direi che salva tutto da r0 a r31..i vari stati penso siano in sti registri..

Non l'avevo visto.
Comunque mi sembra che sia un repetita dato che usando la libreria interrupt.h di Avr quest'operazione dovrebbe essere eseguita dalla libreria stessa. Però non vorrei dire castronerie.

lesto:
io invece ti segnalo il fatto che gli IDE più recenti hanno un "autoimportatore" di librerie, tu gli dai il path o l'url di un file zip e lui ti copia e scompatta il tutto nella cartella Libraries. Non l'ho provato, l'ho letto di sfuggita su un issue di github.
In pratica ricordi che girò un link che puntava a raccogliere tutte le librerie? probabilmente hanno intenzione di automatizzare il tutto :slight_smile:

Io sono passato a 1.5x definitivamente
le librerie vengono importate direttamente dallo .zip ma non vanno in libraries dell'IDE ma in una cartella dentro alla cartella Sketch. E' una scelta intelligente perche' quando si cancella l'ide vecchio non si perde nulla, ne' gli sketch ne le librerie

a si? prova a fare una libreria con le sottocartelle con dentro del codice, che non sia utility... dovrebbe funzionare in libraries, ma non se importata in questo modo...

Non ho capito :slight_smile:

Testato:
le librerie vengono importate direttamente dallo .zip ma non vanno in libraries dell'IDE ma in una cartella dentro alla cartella Sketch. E' una scelta intelligente perche' quando si cancella l'ide vecchio non si perde nulla, ne' gli sketch ne le librerie

Se ti ricordi io ho sempre suggerito di mettere le librerie di terzi proprio sotto /sketchbook/libraries per evitare i problemi che hai menzionato te :wink:

yes, quando lessi la caratteristica dissi, questo lo ha gia' inventato Leo XD

tu hai capito cosa intende Lesto ? mi sembra che dica che in alcune condizioni questa idea crea problemi ?

Testato:
tu hai capito cosa intende Lesto ? mi sembra che dica che in alcune condizioni questa idea crea problemi ?

So a cosa si riferisce, ed è in pratica una specie di sua personale "guerra santa" nata qualche mese fa :stuck_out_tongue_closed_eyes:
Se non ricordo male, propose anche un hack per sistemare quello che a lui pareva un bug dell'IDE, che cioè secondo i suoi test pareva ignorare le cartelle /utility contenute in una lib in fase di compilazione, quando l'IDE estraeva dalle cartelle i file .cpp ed .h
Ora di preciso non mi ricordo cos'è che a lui non tornava né in che condizioni si manifestava il problema, per cui sarebbe meglio aspettare un suo intervento :wink:

PS:
vedo con piacere che nessuno ha provato il leOS2 2.1... ottimo... :sweat_smile: :sweat_smile: