Go Down

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

lesto

se non ricordo male il LeoOS calcola il tempo necessario per eseguire il task, e se inferiore al tempo di attesa attuale viene settato il "trigger" di conseguenza.

Quindi all'avviarsi del trigger si cercano tutti i task che soddisfano la condizione (indipendentemente dalla posizione, anche se creare un'array/lista ordinata è semplice) e li esegue.

sono a "disfavore" dell'uso della lista, meglio un array dinamico con malloc/realloc (ho postato del codice mese scorso), ed inserimento ordinato (come per la tua lista)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

Il leOS ed il leOS2 funzionano basandosi su un contatore hardware (timer o watchdog) che viene usato per generare un interrupt ad intervalli regolari (1 ms col leOS, 15/16 ms col watchdog nel leOS2).

Quando il timer va in overflow, viene incrementata una variabile che misura lo scorrere del tempo secondo l'unità e controlla, tutte le volte che viene chiamata l'ISR, se c'è un task che ha il tempo di attivazione uguale al valore attuale. Se sì, viene chiamata la corrispondente routine, poi il controllo torna allo scheduler, che prosegue l'analisi nell'elenco dei task.
Al termine, si esce dalla ISR.

La priorità di controllo è fatta sullo stato del task, se sospeso o eseguibile.
In caso sia sospeso, si passa al successivo. Se è invece eseguibile, si controlla se è venuto il suo tempo e, nel caso, viene eseguito. Quando il task termina, si controlla se era un task di tipo ONETIME, nel caso viene cancellato dallo scheduler, e la lista ricompattata in modo da non dover controllare celle della stessa vuote nelle successive chiamate dello scheduler.

I task vengono aggiunti allo scheduler a seconda del loro ordine di inserimento, per cui il task A, se inserito prima del task B, a parità di tempo di intervallo, sarà sempre eseguito prima di quest'ultimo.

Si può inserire un task tra 2 task già presenti perché appunto lo scheduler controlla tutte le volte l'elenco e non esegue solo il primo della lista.

Anzi, mauro, il tuo post mi ha fatto venire in mente che si potrebbe prevedere un valore di "nice" in modo che se due task arrivano ad essere eseguibili nello stesso istante, lo scheduler scelga quello con un valore di nice superiore.
Questo può capitare anche con 2 task che hanno intervalli differenti (minimo comune multiplo). Ad esempio, un task inserito per essere eseguito ogni 300 ms ed un task inserito per girare ogni 1000 ms, dopo 3000 ms saranno eseguibili nello stesso istante.

leo72


sono a "disfavore" dell'uso della lista, meglio un array dinamico con malloc/realloc (ho postato del codice mese scorso), ed inserimento ordinato (come per la tua lista)

Sempre che questo non impatti negativamente sulle performance.
Tempo fa mi furono dati dei suggerimenti sul forum internazionale. Alcuni li ho seguiti, altri no. Quelli che non ho seguito, non l'ho fatto o per mia carenza di conoscenze del C/C++ o perché, all'atto pratico, mi aumentavano il consumo di risorse de leOS. Siccome il leOS gira anche su piccoli Tiny, l'impatto sulla Flash e/o RAM ha la priorità sull'eleganza del codice.

lesto

guarda che l'arry è sempre più efficiente nell'USO (sia lato uso CPU che uso RAM che dimensione sketch) della lista.

L'unico vantaggio della lista è che non occupa uno spazio di RAM contiguo, ed è (molto) più veloce negli inserimenti/rimozioni, specialmente se non in coda (l'array necessita di copiare tutti i dati fino all'elemneto da inserire, che va poi inserito, nel caso migliore in cui ha successo la realloc, nel caso peggiore devi riscopiare tutto.. ciò vuol dire un uso di RAM DOPPIO del necessario in fase di copia).
nella lista ogni "cella" può essere sparza per la RAM.. cosa che su un micro crea frammentazione della RAM.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

Forse c'è un'incomprensione sui termini.
Quando parlo di elenco o lista di task, io non uso il template "list" ma un "array". Non lo alloco/disalloco dinamicamente ma lo lascio statico in memoria e ne riempio o svuoto le celle a seconda se devo inserire o rimuovere task.

Go Up