Arduino Multitasking

MauroTec:
Non conoscevo avr-os, ora gli ho dato uno sguardo veloce ed è interessante.
Per chi volesse saperne di più di RTOS gli consiglio di partire dal visionare il file context.h, le
macro SAVE_CONTEXT e RESTORE_CONTEXT rappresentano il cuore del OS.

Non solo di Avr-Os ma di tutti gli RTOS. Il salvataggio e ripristino dello stato interno della CPU è il punto cruciale di tutti gli RTOS. Il timer è usato solo per fare il salto da un task all'altro, salvando lo stato dei registri del micro e ripristinandoli quando il task viene riesumato.
Questo modo di lavorare è il multitasking senza prelazione, o preemptive. Ma è anche il più difficile da implementare perché si potrebbe fare il cambio di task mentre un task sta facendo un'operazione non interrompibile. Vedi ad esempio la lettura di un pin analogico: la conversione comporta una piccola attesa, gestita nel core dell'Arduino con un while che attende un flag che viene impostato dall'ADC quando la conversione è terminata. Metti che lo switch tra i task avvenga in quel frangente... Il dato andrebbe perso nel caso il task successivo accedesse all'ADC. E questo è solo uno dei casi. Poi ci sono quelli di gestione delle periferiche esterne: come puoi fare vero multitasking preemptive quando hai la CPU che comunica con una periferica esterna che non è nata per interrompere il suo lavoro? Metti che stai leggendo dei dati sulla seriale. Cambi task ed il task successivo non legge quei dati. I dati si accumulano nel buffer, lo riempiono e poi iniziano ad essere persi perché il buffer è circolare quindi una volta riempito continua a salvare i dati sopra ai più vecchi. Chi dice al trasmettitore di fermarsi?