Arduino Forum

International => Italiano => Software => Topic started by: testato on Jun 23, 2015, 12:02 am

Title: Scheduler ufficiale
Post by: testato on Jun 23, 2015, 12:02 am
Nelle note di un rilascio dell'ide nel lontano 2012 si leggeva:
Quote
* added support for yield() function in Arduino Core. This is a
  preliminar step for experimenting with cooperative Schedulers.
Come e' la situazione attualmente ?
 
Title: Re: Scheduler ufficiale
Post by: ptia on Jun 23, 2015, 12:43 am
Guardando rapidamente nei sorgenti di Arduino su github, la funzione yield() è definita solo qui (https://github.com/arduino/Arduino/blob/bd8f7932e64fb3a41e3d934437d5eabd8707dcc9/libraries/Scheduler/src/Scheduler.h), ma è parte della libreria ufficiale Scheduler (http://www.arduino.cc/en/Reference/Scheduler), che a quanto pare supporta solo la Due. Tutti gli altri riferimenti, come questo (https://github.com/arduino/Arduino/blob/bd8f7932e64fb3a41e3d934437d5eabd8707dcc9/hardware/arduino/avr/cores/arduino/hooks.c), sono funzioni vuote.
Title: Re: Scheduler ufficiale
Post by: testato on Jun 23, 2015, 02:45 pm
yes,
ci sara' mai un porting dello scheduler per gli AVR ?
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 02:59 pm
yes,
ci sara' mai un porting dello scheduler per gli AVR ?
No perché manca il supporto hardware per lo scheduler, parlo di uno vero e non le varie imitazioni a software con tutti i limiti del caso.
Title: Re: Scheduler ufficiale
Post by: testato on Jun 23, 2015, 03:02 pm
uno scheduler 2.0 (mezzo punto zero  :) ) usando i metodi stile la tua libreria (sketch) che postasti ? Pero' riprendendo la API di questo scheduler ?
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 03:11 pm
uno scheduler 2.0 (mezzo punto zero  :) ) usando i metodi stile la tua libreria (sketch) che postasti ? Pero' riprendendo la API di questo scheduler ?
Tocca vedere cosa hanno fatto esattamente, in tutta franchezza non ne ho ne la voglia ne il tempo, se mi serve un vero scheduler vuol dire che quasi sicuramente mi serve un vero RTOS e allora non uso un AVR :)

Title: Re: Scheduler ufficiale
Post by: testato on Jun 23, 2015, 03:12 pm
In pratica allargare la compatibilita' sotto al cofano anche agli AVR, mantenendo una sola libreria e tenendo la stessa API.
Sarebbe interessante ed utile secondo me.
Non chiedevo di farlo te, ma solo se credi sia possibile ed utile.
Quel pezzo di codice che postasti nel bare metal potrebbe adattarsi ?

Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 03:31 pm
In pratica allargare la compatibilita' sotto al cofano anche agli AVR, mantenendo una sola libreria e tenendo la stessa API.
Il problema è puramente hardware, per un vero scheduler serve il supporto al multitasking, semplicemente non c'è sugli AVR, non sono nemmeno sicuro sia implementato al 100% sulla DUE, dovrebbe avere almeno il ticksys (timer dedicato per lo scheduler) come supporto minimale.
Prova a dare un'occhiata a questo (https://code.google.com/p/arduino-scoop-cooperative-scheduler-arm-avr/downloads/list), dovrebbe funzionare anche su Arduino.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 23, 2015, 03:37 pm
e a che serve uno scheduler in un arduino???
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 04:08 pm
e a che serve uno scheduler in un arduino???
Per servire serve, infatti si crea un surrogato software per supplire alla carenza hardware, però con tutti i limiti del caso.

Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 23, 2015, 07:08 pm
non ho chiesto se, ma a cosa.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 07:22 pm
non ho chiesto se, ma a cosa.
Per gestire vari compiti in "parallelo" oppure attivare un task con ben precisi intervalli, sempre e comunque entro i limiti, abbastanza pesanti, di un AVR.


Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 23, 2015, 07:35 pm
non ne vedo proprio l'utilità, anzi riesco solo a vederne i problemi che può scaturire.
Bho....Delegare ad un'altro ciò che io posso fare meglio? bha!... quando a volte si cercano complicazioni inutili, stiamo pur sempre parlando di chip a 16mhz.....
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 07:43 pm
Bho....Delegare ad un'altro ciò che io posso fare meglio? bha!... quando a volte si cercano complicazioni inutili, stiamo pur sempre parlando di chip a 16mhz.....
Pensi davvero di poter gestire in modo ottimale molti diversi compiti, magari qualcuno con temporizzazioni critiche, a manina ?
Io preferisco affidarmi ad un scheduler, seppure minimale e semplice, che mi gestisce le cose in automatico secondo delle regole che imposto io, sopratutto se lo scheduler l'ho scritto io e so esattamente cosa fa.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 23, 2015, 08:33 pm
assolutamente si!
Sui chip single core è sempre da preferire il task singolo per aumentare le performance, la sicurezza e la stabilità.
Dopotutto il parallelismo non esiste su questi core e un qualsiasi scheduler non potrà mai svolgere meglio il compito rispetto ad un cervello allenato, ancor peggio per le sezioni critiche!
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 23, 2015, 09:28 pm
assolutamente si!
Sui chip single core è sempre da preferire il task singolo per aumentare le performance, la sicurezza e la stabilità.
Si come no, infatti io, e tutti quelli come me, che realizzano professionalmente applicazioni su mcu dove girano più task siamo tutti scemi e non  abbiamo capito nulla.
Va be' lasciamo perdere che è meglio, tanto io continuo a scrivere software low level e farmi pagare per questo, se mi serve uno scheduler o ne uso uno già pronto, se esiste, oppure me lo scrivo ottimizzato per il caso particolare, non sei certo tu a cambiare lo status delle cose a me a alle migliaia di persone che fanno il mio stesso lavoro.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 23, 2015, 10:40 pm
permalosetto?
non mi pare poi di aver aver affermato che chi usa uno scheduler sia uno scemo o altro, ho semplicemente detto che IO non riesco a capirlo! in tutti i libri che ho letto si parla sempre di come non usare lo scheduler per migliorare il proprio programma e non ho fatto altre che riportarlo.
Invece di scrivere quattro righe di parole inutili  di cio che fai te perché non provi a spiegarlo?
O magari un libro dove spiega perché usarlo!

Title: Re: Scheduler ufficiale
Post by: testato on Jun 23, 2015, 11:27 pm
vb stai attaccando la persona sbagliata :)

Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 12:31 am
attaccando?
chiedendo!
Mica sono la bocca della verità e se c'è qualcuno che ne sa di più benvenga! ma che dia almeno risposte esaustive magari correlate da libri su cui studiare, a me piace leggere!
Poco mi importa se lui sviluppa space shuttle, a me interessa imparare e se quello che ho letto è sbagliato oppure l'ho appreso male vorrei almeno capire il perché e magari una lettura che possa aiutare.
Se poi questo concetto lo reputi sbagliato amen, sono fatto così!
Title: Re: Scheduler ufficiale
Post by: testato on Jun 24, 2015, 12:33 am
il concetto e' buono, e' l'approccio che e' sbagliato, se stessimo parlando a voce direi e' il tono di voce sbagliato.
Te lo posso dire da "collega" perche' capita anche a me di fare spesso lo stesso errore.

Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 12:51 am
 :)
Title: Re: Scheduler ufficiale
Post by: Lucailvec on Jun 24, 2015, 01:33 am
Beh si può dire che qui nessuno è  perfetto dal creatore dello space shuttle a colui che vuole imparare ... in ogni caso :
Che utilità può avere uno scheduler su arduino ? Io conosco solo lo scheduler su ia-32 quindi non ne ho la più pallida idea di come funzioni uno scheduler su rtos o su un sistema avr.
Su arduino non ha senso o ha senso lo scheduler ? Se no è perché il salvataggio dei dati su stack è dispendioso se non fatto via hardware ?
Grazie a tutti
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 01:57 am
oltre al context switch e il suo grosso dispendio di ram che molto probabilmente limita anche a soli5/6 task c'e' anche da considerare la mole di lavoro che deve compiere lo scheduler, potrebbe anche finire che impiega più tempo lo scheduler che il task!
Siamo pur sempre su dei 16mhz con limitatissime risorse RAM, usate per compiere un lavoro e nella stra grande maggioranza dei casi uno scheduler è inutile o almeno alcuni accorgimenti software lo rendono tale.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 24, 2015, 07:44 am
Magari date un'occhiata al mio qRTOS (http://forum.arduino.cc/index.php?topic=316984.0) così capite cosa intendo per uno scheduler minimale, ma molto utile, che può girare su un AVR, o altra piccola mcu 8 bit.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 24, 2015, 07:52 am
Giusto per la cronaca, gli scheduler e i sistemi multitasking li hanno inventati il giorno prima del primo computer, giusto per rimanere su macchine "piccole", i primissimi personal computer erano basati su Z80 e 6502, un nome per tutti Apple ][, su queste macchina girava un sistema operativo che poteva essere sia monotasking che multitasking, il DOS IBM è derivato dal CPM, il primo sistema operativo veramente efficiente per Z80, del quale esisteva la versione multitasking denominata MPM.
MPM poteva girare, con limitatissime prestazioni, su macchine a singolo processore, lo Z80 non possedeva nessun supporto hardware per il multitasking, sia su macchine multiprocessore, all'epoca i multicore erano ancora fantascienza.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 09:37 am
bhe un semplicissimo richiamo di funzioni in maniera sequenziale, non c'è nemmeno una gestione di priorità o altre cose simili, numero task fisso, spreco di memoria sui vari flag booleani mentre si poteva benissimo usare un unico byte, piu che altro sembra un buon punto di partenza su cui poter lavorare e trasformarlo in qualcosa di simile a questo (https://github.com/vbextreme/EasyFramework/blob/master/easythread/easythread.c), a riga 113 trovi la definizione di un ADT chiamato WORKER e a riga 890 a 1157 trovi l'implementazione.
Tale mini scheduler è stato progettato per suddividere il processo principale in piu lavori, pensato per i classici eventi del mondo mainstream permette priorità, esecuzioni temporizzate e altre diavolerie simili, se guardi la funzione thr_work_run() si capisce bene quanto possa diventare complesso uno scheduler solo per eseguire un task.
Sarebbe piu interessante vedere un vero context switch su tali architetture.
Hai qualcosa a riguardo?


Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 24, 2015, 09:58 am
bhe un semplicissimo richiamo di funzioni in maniera sequenziale, non c'è nemmeno una gestione di priorità o altre cose simili, numero task fisso, spreco di memoria sui vari flag booleani mentre si poteva benissimo usare un unico byte,
Come si vede che non hai mai lavorato seriamente sulle piccole mcu/micro, non puoi minimamente pensare di usare le stesse tecniche per un PC su una mcu, semplicemente non hai le risorse per farlo.
Intanto il mio qRTOS è a norme MISRA, ammesso che sai cosa sono, non spreca risorse, salvo qualche byte di ram, visto che utilizza il watchdog e il suo interrupt, normalmente non utilizzato su Arduino e anche se lo devi usare per resettare il micro in emergenza la cosa è sempre possibile.
Fin dall'inizio di questo topic ho specificato che gli AVR non hanno nessun supporto hardware per il multitasking, tocca arrangiarsi a software e le possibilità sono limitate, eppure con quel poco che permette un AVR, o altro micro/mcu simile, si possono fare cose molto interessanti, non sempre serve un 32bit superpompato per realizzare una applicazioni, anzi quando si parla di low level le mcu 8 bit si usano spesso e volentieri, magari coordinate da un processore di classe superiore, non a caso la produzione degli otto bit gode di ottima salute, miliardi di pezzi prodotti all'anno tra i vari produttori, e non è in nessun modo minacciata dai 32 bit.
Ci tengo a specificare che il qRTOS è specifico per Arduino, su altri micro mi muovo in modo diverso a seconda di cosa mi mette a disposizione l'hardware, inoltre la quasi totalità del mio lavoro non è certo con gli AVR, uso PIC serie 18 per gli otto bit, dsPIC per il controllo degli attuatori in closed lopp, STM32 per l'high level e sistemi Linux Emdedded, vari modelli, per le GUI locali, gestione di Lan/Wlan, etc.

Title: Re: Scheduler ufficiale
Post by: gpb01 on Jun 24, 2015, 11:57 am
... non a caso la produzione degli otto bit gode di ottima salute, miliardi di pezzi prodotti all'anno tra i vari produttori, e non è in nessun modo minacciata dai 32 bit.
ESATTO !!!

Al seminario organizzato da Atmel di qualche settimana fa (... e tu Astro sai di cosa parlo ;)), ci hanno tenuto a specificare che tutta la produzione AVR (ATtiny, ATmega, ecc) è garantita per almeno altri 15 anni (... proprio per l'enorme consumo che se ne fa).  :)

Guglielmo
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 02:05 pm
sono in possesso del misra già da un pezzo.
nel tuo codice avanzi i tick ogni k tempo ed esegui le funzioni che superano tale soglia giusto?
ho editato perché riguardando il codice penso di aver frainteso.
perché poi usi l'interrupt e non ad esempio la micros?
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 24, 2015, 02:24 pm
perché poi usi l'interrupt e non ad esempio la micros?
Perché mai dovrei usare la micros, che a sua volta è data da un interrupt del timer0, quando ho a disposizione una ISR da usare per gestire la cosa in modo ottimale, forse ti sfugge il concetto di base che la relativa ISR aggiorna una serie di contatori, ogni 16 ms esatti, indipendentemente da quello che fa il micro, cosa che non puoi fare con la micros().
Gli interrrupt sono fatti apposta per gestire gli eventi, che non sono necessariamente un pin che commuta, basta saperli usare :)
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 03:07 pm
si ma così facendo potrebbe essere fin troppo facile far avverare la condizione di una funzione che nn verrà mai eseguita.
Mettiamo f1 tempo 240 e f2 tempo 250
f1 tick 240 ora richiama la funzione che dura 20 tick e mettiamo che f2 era sempre a 240 ora con questi 20 tick hai sforato e sei passato a 5 e la funzione non viene eseguita.
Non pensare che sia un caso limite ma con più task attivi "skippare" una funzione anche ciclicamente diventa fin troppo facile, pericoloso e insicuro! per rimediare tocca mettere mano pesantemente al codice e a quel punto non conviene fare tutto manualmente?
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 24, 2015, 03:17 pm
ra con questi 20 tick hai sforato e sei passato a 5 e la funzione non viene eseguita.
A parte che viene eseguita comunque visto che il tempo è scandito sotto interrupt, quindi non appena la gestione torna allo scheduler vengono mandate in esecuzione le funzioni in attesa, ovviamente in ritardo, in tutti i casi quando si lavora con scheduler minimali come questo uno dei prerequisiti è che la singola funzione non deve durare di più dell'intervallo con quella seguente.
Del resto 16 ms, tick minimo, sono un'eternità dal punto di vista di una MCU e se il codice è scritto come si deve una funzione, qualunque funzione, non può durare così tanto, se ci sono dei limiti imposti da timing esterni, p.e. attendere il ready di un sensore, la funzione deve essere scritta in modo da poter gestire il polling senza essere bloccante, però in questi casi è meglio lavorare event driven utilizzando gli interrupt.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 24, 2015, 03:47 pm
Quote
A parte che viene eseguita comunque visto che il tempo è scandito sotto interrupt
f1 time 240
f2 time 250

primo sequenze()
...
f1 contatore 239
f2 contatore 239
...
f1 240 lancio funzione
f1 run, isr->f2 contatore++
...
f1 run, isr->f2 240 + 20 tick persi = contatore = 5

eccoci, mi sono spiegato?
come hai fatto notare però un tempo elevato di tick risolve parzialmente il problema perché comunque rimane li in attesa di fregarti.
usando però tick elevati si hanno enormi latenze,  il chip rimarrebbe spesso inutilizzato, esempio
f1 tempo 1
f2 tempo 2
si ha una latenza di tempo(f1) - tempo(tick), se la tua funzione dura 5 ms per il restanti 11ms eseguì loop vuoti.Per non parlare del ritorno da 1 !
Più che uno scheduler sembra un timer!
sembra che richiami le varie funzioni ogni x secondi come farebbe un comunissimo timer, lo scheduler invece si impegna a utilizzare sempre tutta la CPU e cerca di garantire una sorta di parallelismo.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 24, 2015, 06:58 pm
f1 run, isr->f2 240 + 20 tick persi = contatore = 5
Questo può succedere solo se si lavora al limite del contatore e con funzioni scritte male che possono andare a sforare, però ti rammento che il tick dura 16 ms e 255 * 16 = 4080 ms, è raro lavorare con tempi così lunghi, se serve di più basta usare lo specifico contatore definendolo unsigned int.

Quote
come hai fatto notare però un tempo elevato di tick risolve parzialmente il problema perché comunque rimane li in attesa di fregarti.
Su Arduino il tempo di tick alto è dovuto alla temporizzazione minima del watchdog, per l'appunto 16 ms, è possibile scendere al singolo ms, o meno, usando un timer però in questo modo impatti su come Arduino usa i timer e rischi di togliere risorse importanti come canali pwm o altre funzioni di temporizzazione.
Rammento che qRTOS è scritto specifico per Arduino per cui oltre ai limiti delle mcu a 8 bit c'è da fare i conti con i limiti di Arduino, in compenso è impatto quasi zero sulle risorse e disturba il normale funzionamento di Arduino.

Quote
usando però tick elevati si hanno enormi latenze,  il chip rimarrebbe spesso inutilizzato, esempio
Mica vero, dipende da cosa devi fare, tutto quello che è presente nella loop viene eseguito costantemente pertanto non è detto che la mcu non faccia nulla.
In tutti i casi con le piccole mcu capita spesso che lavorano solo per una percentuale del tempo macchina, il resto non fanno nulla o vengono messe in sleep per ridurre i consumi, esempio pratico ogni 100 ms devi leggere lo stato di un port, se è cambiato dall'ultima lettura hai delle elaborazioni da fare, ogni 200 ms devi inviare sulla seriale delle informazioni, la mcu passa praticamente la maggior parte del tempo senza fare nulla, e non si tratta di una caso particolare, è quasi sempre la norma con le mcu.

Quote
sembra che richiami le varie funzioni ogni x secondi come farebbe un comunissimo timer, lo scheduler invece si impegna a utilizzare sempre tutta la CPU e cerca di garantire una sorta di parallelismo.
Non è vero che lo scheduler si impegna ad usare tutta la cpu, sopratutto se parliamo di RTOS dove non è il sistema operativo a decidere chi e per quanto tempo un codice deve girare, sono io programmatore che decido quali routine devono girare, quando devono farlo e per quanto tempo, lo scheduler si limita a gestire questi processi con le mie regole.
L'anarchia dei sistemi operativi non real time, p.e. Windows e Linux, non è cosa gradita sulle MCU dove la fanno da padroni gli RTOS, o comunque sistemi che consentono di gestire come serve i vari task.
Ti rammento che stiamo parlando di piccole mcu 8 bit, con risorse molto limitate, in particolare di Arduino con tutti i paletti che pone, non stiamo parlando di software per pc o un sistema embedded di fascia alta.


Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 24, 2015, 07:42 pm
Testato mi ha detto che qua si litiga, con chi devo incominciare? :D
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 24, 2015, 07:49 pm
Ho letto tutto e purtroppo devo dare ragione su tutto ad Astrobeep.

VBextreme di che cosa ti occupi nello specifico? Così facciamo prima a capire perchè hai detto quello che hai detto... :D
Title: Re: Scheduler ufficiale
Post by: nid69ita on Jun 24, 2015, 07:56 pm
@Babbuino, e che invito a fare se non a presentarsi ?   :smiley-mr-green:
http://forum.arduino.cc/index.php?topic=113640.msg2229698#msg2229698
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 24, 2015, 08:04 pm
f1 time 240
f2 time 250

primo sequenze()
...
f1 contatore 239
f2 contatore 239
...
f1 240 lancio funzione
f1 run, isr->f2 contatore++
...
f1 run, isr->f2 240 + 20 tick persi = contatore = 5

eccoci, mi sono spiegato?
come hai fatto notare però un tempo elevato di tick risolve parzialmente il problema perché comunque rimane li in attesa di fregarti.
usando però tick elevati si hanno enormi latenze,  il chip rimarrebbe spesso inutilizzato, esempio
f1 tempo 1
f2 tempo 2
si ha una latenza di tempo(f1) - tempo(tick), se la tua funzione dura 5 ms per il restanti 11ms eseguì loop vuoti.Per non parlare del ritorno da 1 !
Più che uno scheduler sembra un timer!
sembra che richiami le varie funzioni ogni x secondi come farebbe un comunissimo timer, lo scheduler invece si impegna a utilizzare sempre tutta la CPU e cerca di garantire una sorta di parallelismo.
Gli AVR, ovviamente, sono estremamente limitati, ma con una MCU un pò più evoluta (un dsPIC o un PIC32) la granularità del clock (leggi velocità) è tale che è possibile impiegare anche un doppio scheduler usando due timer separati.

Uno scheduler legato ad timer (e relativo Interrupt) per le funzioni ad alta priorità, ed uno scheduler legato ad un secondo timer per le funzioni, diciamo di servizio, per il quali la latenza (cmq sempre limitata) non è un problema. Inoltre si possono utilizzare due risoluzioni diverse per i Tick, con buon pace delle latenze: poco importanti per i servizi, importantissime per i Task principali.

Inoltre i PIC32 (per esempio) gestiscono nativamente le code per le priorità degli interrupt, ed hanno una gestione degli stessi talmente flessibile e ben congegnata che, a meno di non aver scritto le routine con i piedi, i problemi che poni sono facilmente ovviabili.

E ancora: dispongono di un "Shadow register set" ovvero di un set di registri ulteriori, per cui il Context Switch è ulteriormente ridotto, anzi, swappando questi registri con i principali, non serve nemmeno più fare un Context Switch.
Quindi, l'ipotesi dello sforamento temporale, sebbene possibile, non è così facile che accada.

Certo che poi va ingegnerizzato per bene il software, è necessario fare i conti della serva fino al conteggio dei cicli di clock delle singole istruzioni e/o funzioni e cautelarsi stando abbondanti con il Tick, ma è ordinaria amministrazione per chi sviluppa questo genere di firmware. Siamo anni luce dalla programmazione "spannometrica" di Arduino, fatta per lo più con i piedi.
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 24, 2015, 08:12 pm
Dimenticavo, non necessariamente uno Scheduler deve garantire il massimo sfruttamento della CPU. Ci possono benissimo essere dei tempi morti, generalmente occupati dal ciclo principale (loop() o While(1)) oppure da una funzione apposita che negli RTOS è genericamente chiamata con qualcosa di simile a Task_Idle(), la quale può servire per misurare quanto tempo "disponibile" rimane per ulteriori successivi Task, far girare servizi in background, oppure semplicemente mettere a nanna il processore (sleep()).
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 12:12 am
@bubbuino nello specifico non so neppure io di cosa mi occupo, diciamo che parto con il gestire un gruppo di meccanici specializzati in macchinari oleodinamici industriali.Ma non so più se codesto sia più il lavoro principale, per rimanere nell'ambito software capita di essere ingaggiato per risolvere qualche pasticcio del guru di turno, tale per me è nata come passione ben più di due decadi fà.

A parte il solito discorso dei chippini e chipponi e altre smancierie poco interessanti, mi soffermerei sul thread che dopotutto è già abbastanza complesso per essere affrontato su un forum.

@Astro ho esattamente detto che il problema c'è e rimane, per "tamponare" il difetto o più conosciuto come bug bisogna mettere mano al codice e spesso alla logica del programma, ops, firmware, sketch...non ho detto che non sia risolvibile ma semplicemente che con tale algoritmo di scheduling tale bug rimarrà sempre presente, pronto e in agguato a fregarti la prima volta che sei distratto.
A parte tutto il resto che naturalmente hai detto sacrosante parole qui ti cito:
Quote from: @Astro
sono io programmatore che decido quali routine devono girare, quando devono farlo e per quanto tempo,
Belle parole, proprio quelle che ho cercato di usare io all'inizio di questo thread, peccato che nel tuo scheduler tutto ciò non avviene.
Non hai nessuna sorta di garanzia che f() venga eseguita quando vuoi te, quello scheduler non lo permette! Non permette nemmeno di terminare un task!
Non fa altro che richiamare funzioni in un certo lasso di tempo senza nemmeno preoccuparsi più di tanto, delega al programmatore tutto! e allora faccio da me! a che serve tale ciclo se poi devo fare tutto a mano? mi sembra solo un'inutile complicazione.
Certo che se fosse stato messo in una lista circolare con gestione tempi e priorita allora si che si poteva chiamare scheduler! e non mi riferisco certo ai mainstream, è fattibilissimo anche su sti chippettini senza sprecare neanche troppa memoria, forse un pelo di calo prestazionale ma dopotutto invece di farle fare niente posso gestire correttamente una coda con priorità.
Title: Re: Scheduler ufficiale
Post by: dally on Jun 25, 2015, 12:20 am
no doubt useful to multitask light bulbs on the christmas tree :D
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 12:48 am
 :D  :D   :D  :smiley-mr-green:  :smiley-mr-green:  :smiley-eek-blue:  :smiley-eek:  :smiley-money:  :smiley-twist:
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 08:31 am
Questo significa essere bastardi  :)

Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 08:57 am
ma semplicemente che con tale algoritmo di scheduling tale bug rimarrà sempre presente, pronto e in agguato a fregarti la prima volta che sei distratto.
Come direbbe Steve, "it's not a bug, it's a feature" :D
In tutti i casi continui a scordarti che stiamo parlando di Arduino, modelli basati su AVR, il che limita molto le possibilità, il semplice schedelur che ho illustrato è pensato per girare senza disturbare il normale funzionamento di Arduino e senza sottrarre nessuna risorsa.
Su altri micro, con altre risorse disponibili, senza wiring tra i piedi, uso soluzioni decisamente migliori e più performanti, sempre se non esiste uno scheduler già fatto che funziona bene, non sto a scoprire l'acqua calda :)
Altro dettaglio, su micro/mcu quello che serve realmente è un RTOS, di un normale OS non ci si fa nulla, ne esistono anche per otto bit, però impattano molto sulle risorse, spesso fanno molto di più di quanto necessario e non sono scalabili, vale per quelli free perché quelli a pagamento (= $$$) sono fortemente scalabili e ottimizzabili.
Un RTOS free molto gettonato è il FreeRTOS (http://www.freertos.org/RTOS_ports.html), ne hanno fatto il porting per quasi tutti i micro/mcu, il che include anche gli AVR, ovviamente su piccoli micro/mcu ha svariate limitazione ed omissioni.
Di FreeRTOS esiste un porting (https://github.com/greiman/FreeRTOS-Arduino) per Arduino sotto forma di libreria, mai provato e non ho idea di quello che riesce a fare e quanto impatta su wiring, questa potrebbe una missione per Testato :D
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 09:08 am
Dimenticavo, la "nuova" frontiera della programmazione embedded è usare un main cycle composto esclusivamente da "while(1);", non sto scherzando in Arduino diventa una cosa simile:

Code: [Select]


void Setup()
{
  // init periferiche e variabili
}


void Loop()
{

 // eventuali operazioni preliminari

 while(1);

}




In pratica tutto il codice è gestito tramite un sistema di scheduling, come quello che ho illustrato, e le periferiche sono tutte interrupt driven, in pratica ogni tot ms lo scheduler verifica le operazioni pendenti legate alle periferiche, dipende dai relativi flag settati durante le ISR, e le risolve, inoltre gestisce tutti gli altri task per le operazioni non interrupt driven.

Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 10:15 am
Ma non è loop già un while ? E le operazioni preliminari non stanno bene già in setup ?
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 10:33 am
Ma non è loop già un while ? E le operazioni preliminari non stanno bene già in setup ?
La while(1) serve se hai da fare qualcosa all'interno della loop() prima del ciclo infinito d'attesa, in linea di massima si può fare tutto nel setup e lasciare la loop vuota.

Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 10:46 am
@Astro sprecare un paio di byte in piu forse era decisamente meglio, avevo gia letto qualcosa a riguardo su rtos ma penso sia basato su di un vero context switch, molto avaro di memoria.Su arduino l'unica soluzione sarebbe l'implementazione di un algoritmo per la memoria virtuale, in questo modo sarebbe fattibile ma prestazionalmente parlando una lumaca.
Sicuramente è migliore lo scheduling che hai presentato ma andrebbe un po' revisionato.
Il resto sono le solite divagazioni.
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 12:59 pm
Ma non è loop già un while ? E le operazioni preliminari non stanno bene già in setup ?
In quel modo (che non è una novità ma una roba vecchia) puoi anche uscire dal while() con un break e rientrare nel loop() e non è una cosa da poco. Puoi reinizializzare un sistema senza dover resettare il micro.

Lo uso spesso in implementazioni grafiche. Nel loop inserisco una griglia predefinita per il display, che richiamo (uscendo dal while() ogni volta che deve essere ridisegnata per intero.
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 01:00 pm
@Astro sprecare un paio di byte in piu forse era decisamente meglio, avevo gia letto qualcosa a riguardo su rtos ma penso sia basato su di un vero context switch, molto avaro di memoria.Su arduino l'unica soluzione sarebbe l'implementazione di un algoritmo per la memoria virtuale, in questo modo sarebbe fattibile ma prestazionalmente parlando una lumaca.
Sicuramente è migliore lo scheduling che hai presentato ma andrebbe un po' revisionato.
Il resto sono le solite divagazioni.
Arduino? Memoria virtuale? What?  :o
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 01:54 pm
@astro un' emulazione ovvio!  magari richiamabile solo nel context switch così da lasciar libera quasi tutta la sram.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 02:26 pm
@astro un' emulazione ovvio! 
Una emulazione dove ?
Gli AVR usano l'architettura Harvard, come quasi tutte le mcu, che non consente la memoria virtuale.

Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 02:29 pm
quindi niente scrittura runtime sulla flash ?  ;)

Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 02:33 pm
In quel modo (che non è una novità ma una roba vecchia) puoi anche uscire dal while() con un break e rientrare nel loop() e non è una cosa da poco. Puoi reinizializzare un sistema senza dover resettare il micro.
Grazie non ci avevo pensato,
ma non si puo' richiamare la Setup dalla Loop ? Non ho mai rpovato.

Si puo' comunque creare una funzione di inizializzazione e richiamarla quando si vuole dalla loop.
Cioe' mi sembra concettualmente piu' contorto questo discorso di usare un while gigantesco nel loop.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 02:47 pm
ma non si puo' richiamare la Setup dalla Loop ? Non ho mai rpovato.
Da provare, però a logica dovrebbe essere possibile farlo visto che la Setup() è una funzione a tutti gli effetti.

Quote
Cioe' mi sembra concettualmente piu' contorto questo discorso di usare un while gigantesco nel loop.
Forse ti è sfuggito il particolare che la loop(), o while(1), è vuota, non fa nulla, tutto il codice è gestito dallo scheduler e/o dagli interrupt.
Come ho anticipato è la nuova (mica tanto) frontiera della programmazione embedded, però è difficile da attuare al 100% su processori come gli AVR che non possiedono priorità assegnabile per gli interrupt e non hanno almeno il ticksys timer.
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 05:02 pm
ma io mi riferivo al while usato da Babbuino, li' non e' vuoto ne' il Loop ne' il While  :)
In quel caso quindi invece di come fa lui mi sembra piu' chiaro e pulito fare inizializzazione nel setup e invece di breakkare il while richiamare Setup dal Loop all'occorrenza

Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:07 pm
Una emulazione dove ?
Gli AVR usano l'architettura Harvard, come quasi tutte le mcu, che non consente la memoria virtuale.


Sul fatto dell'architettura Harward (in realtà Harward modificata) non c'entra nulla con il fatto di avere o meno la memoria virtuale.

Sia i PIC32 gli ARM Cortex e altri cosi, sono Harward ma hanno la gestione della memoria virtuale, con tanto di MPU (Memory Protection Unity).

https://microchip.wikidot.com/32bit:mz-virtual-vs-physical-memory

Che è da non confondersi con il MMU, che è il gestore della memoria sugli ARM più evoluti, e che consente la possibilità di installare un vero Kernel a memoria virtuale (come un kernel Linux Embedded).

Di certo è che in nessuna maniera ci può stare una memoria virtuale su un microscopico AVR!
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:11 pm
ma io mi riferivo al while usato da Babbuino, li' non e' vuoto ne' il Loop ne' il While  :)
In quel caso quindi invece di come fa lui mi sembra piu' chiaro e pulito fare inizializzazione nel setup e invece di breakkare il while richiamare Setup dal Loop all'occorrenza


Così su due piedi, ti direi che rientrare nel loop() con un break dal while(), so bene cosà c'è perchè ce l'ho messo io. Richiamare il setup() non richiama SOLO quello che ho messo IO dentro il setup(), ma anche tutto il dinosauro morto Arduinesco legato al setup().

Bisognerebbe andare a vedere cosa si "porta dietro" il setup() (l'avevo visto tempo fa, ma sinceramente non ricordo, rammento solo che c'era parecchia roba dentro...).
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 05:13 pm
a me sembra che il link che hai messo spiega solo la questione della virtualizzazione dello spazio indirizzi, non la presenza di una memoria virtuale (che io credo qui si stia intendendo come l'utilizzo della flash al posto della Ram, come lo swap su linux)
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 05:15 pm
Così su due piedi, ti direi che rientrare nel loop() con un break dal while(), so bene cosà c'è perchè ce l'ho messo io. Richiamare il setup() non richiama SOLO quello che ho messo IO dentro il setup(), ma anche tutto il dinosauro morto Arduinesco legato al setup().

Bisognerebbe andare a vedere cosa si "porta dietro" il setup() (l'avevo visto tempo fa, ma sinceramente non ricordo, rammento solo che c'era parecchia roba dentro...).
ok per il Setup che e' mastodontico, dipende dall'architettura, su 32ux gestisce esempio USB, pero' perche' il break su while rispetto ad ua semplice funzione di inizializzazione dove appunto metti quello che vuoi  e richiami quando vuoi ?
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:16 pm
a me sembra che il link che hai messo spiega solo la questione della virtualizzazione dello spazio indirizzi, non la presenza di una memoria virtuale (che io credo qui si stia intendendo come l'utilizzo della flash al poston della Ram, come lo swap su linux)
Testa mi autoquoto:

"Che è da non confondersi con il MMU, che è il gestore della memoria sugli ARM più evoluti, e che consente la possibilità di installare un vero Kernel a memoria virtuale (come un kernel Linux Embedded)."
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:20 pm
ok per il Setup che e' mastodontico, dipende dall'architettura, su 32ux gestisce esempio USB, pero' perche' il break su while rispetto ad ua semplice funzione di inizializzazione dove appunto metti quello che vuoi  e richiami quando vuoi ?

1) Come hai osservato, ha una sua pulizia di esercizio
2) Chiamare una funzione ti riporta, poi, all'istruzione dopo la chiamata, mentre con il break si riparte dall'inizio, e la comodità sta sopratutto in questo.
2) Può essere comodo uscire con un solo break;
3) E' anche più veloce
4) Mi sta simpatica la soluzione
5) Eventuali varie...

:D
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 05:27 pm
Sul fatto dell'architettura Harward (in realtà Harward modificata) non c'entra nulla con il fatto di avere o meno la memoria virtuale.
Attenzione che la memoria virtuale dei PIC32 e degli ARM non è la stessa cosa di quella di un PC, ovvero usare una memoria di massa al posto della memoria ram, su i PIC32 e gli ARM la memoria virtuale è solo un'area di ram, quella presente sul micro (o esterna se previsto), riservata e protetta, non è l'uso di una memoria di altro tipo come surrogato della ram.
Questa (http://www.mikroe.com/download/eng/documents/compilers/mikrobasic/pro/pic32/help/memory_organization.htm) mappa della memoria dei PIC32 chiarisce bene la cosa, la memoria virtuale è quella sulla sinistra ed è mappata sempre e comunque all'interno della memoria fisica disponibile sul micro.

Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:33 pm
Attenzione che la memoria virtuale dei PIC32 e degli ARM non è la stessa cosa di quella di un PC, ovvero usare una memoria di massa al posto della memoria ram, su i PIC32 e gli ARM la memoria virtuale è solo un'area di ram, quella presente sul micro (o esterna se previsto), riservata e protetta, non è l'uso di una memoria di altro tipo come surrogato della ram.
Questa (http://www.mikroe.com/download/eng/documents/compilers/mikrobasic/pro/pic32/help/memory_organization.htm) mappa della memoria dei PIC32 chiarisce bene la cosa, la memoria virtuale è quella sulla sinistra ed è mappata sempre e comunque all'interno della memoria fisica disponibile sul micro.


Si, e purtroppo questo comporta molta confusione. Infatti erroneamente si pensa che sia sufficiente avere una MPU per installare un kernel Linux, mentre in realtà nada (anche se esiste una versione supercastrata di Linux per i PIC32...)

Serve una MMU, che è qualcosa di più evoluto.
Title: Re: Scheduler ufficiale
Post by: dally on Jun 25, 2015, 05:39 pm
in Harvard, modifications are various ways to loosen the strict separation between code and data, while still supporting the higher performance concurrent access. AVR8 implements LPM (Load Program Memory) and SPM (Store Program Memory), so you can access instruction memory as data.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 05:41 pm
(anche se esiste una versione supercastrata di Linux per i PIC32...)
Alla fine ce l'hanno fatta, l'ultima volta che ho controllato non esisteva nessuna distro, anche se ultra minimale, di Linux per PIC32, fermo restando che mettere Linux su una mcu non ha molto senso.
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:55 pm
Alla fine ce l'hanno fatta, l'ultima volta che ho controllato non esisteva nessuna distro, anche se ultra minimale, di Linux per PIC32, fermo restando che mettere Linux su una mcu non ha molto senso.
Si, un esercizio accademico più che una realtà funzionale ed impiegabile.

I PIC32 funzionano benissimo con i vari RTOS, anzi, come dicono a Roma sono "la morte sua". Linux lasciamolo a MCU dai 400 MHz in su e tutto il carrozzone di robe che si porta dietro.

Cmq: Microchip PIC32 support with the ultra tiny embedded Linux and POSIX compatible
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 05:56 pm
in Harvard, modifications are various ways to loosen the strict separation between code and data, while still supporting the higher performance concurrent access. AVR8 implements LPM (Load Program Memory) and SPM (Store Program Memory), so you can access instruction memory as data.

Thanks. I did not know.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 06:14 pm
Thanks. I did not know.
Quello che si è scordato di dire è che negli AVR è si possibile inserire dei dati nella flash, però lo puoi fare solo dentro il sorgente tramite PROGMEM, non puoi farlo a run time.
In realtà è possibile anche scrivere la flash degli AVR a run time, altrimenti non sarebbe possibile usare un bootloader, però questo si può fare solo con del codice che gira dentro lo spazio protetto del bootloader, il che obbliga a fare dei salti mortali per scrivere delle routine contenute in quell'area e riuscire a richiamarle dal normale codice senza resettare il micro.
Non ultimo il fatto che la flash dei micro ha un numero di scritture molto limitato, tipicamente 10000 volte, il che la rende poco adatta ad un uso come memoria di massa.
Come ben sai Microchip ha una libreria che permette di emulare una EEPROM sulla flash, i pic possono scrivere la flash a run time senza problemi, però si presuppone un uso sporadico della stessa e utilizza il "trucco" di impegnare interi blocchi di flash ruotando le scritture dei dati lungo tutta l'area impiegata per ridurre al minimo l'impatto sull'endurance.
Title: Re: Scheduler ufficiale
Post by: pighixxx on Jun 25, 2015, 06:18 pm
Ma soprattutto questo cristo legge perfettamente l'italiano ma si esprime solo in inglese ;D
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 06:24 pm
chissa' come fa  :)

Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 06:27 pm
Ma soprattutto questo cristo legge perfettamente l'italiano ma si esprime solo in inglese ;D
Forse perché il traduttore di google fa un buon lavoro tra italiano e inglese, però sa benissimo che al contrario fa pena e che quasi tutti sappiamo l'inglese. :D
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 06:29 pm
2) Chiamare una funzione ti riporta, poi, all'istruzione dopo la chiamata, mentre con il break si riparte dall'inizio, e la comodità sta sopratutto in questo.
Spetta, ho capito, questo e' una specie di goto sotto mentite spoglie  :D
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 06:30 pm
creare una classe che simuli la memoria virtuale è relativamente semplice, potrebbe così accedere alla EEPROM o SD per memorizzare tutti i registri, ma volendo si potrebbe anche "scaricare" l'intero stack per avere sempre tutta la memoria libera per ogni task.
Come hanno già fatto notare la memoria virtuale non centra niente con la memoria dati.
Ma rimango dell'idea che progettare tutto sto trabicolo per un chip da 8 bit forse è esagerato.
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 06:40 pm
In realtà è possibile anche scrivere la flash degli AVR a run time, altrimenti non sarebbe possibile usare un bootloader, però questo si può fare solo con del codice che gira dentro lo spazio protetto del bootloader
Sotto questo aspetto gli Attiny sono piu' potenti, possono scrivere sempre sulla flash

Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 06:47 pm
creare una classe che simuli la memoria virtuale è relativamente semplice, potrebbe così accedere alla EEPROM o SD per memorizzare tutti i registri, ma volendo si potrebbe anche "scaricare" l'intero stack per avere sempre tutta la memoria libera per ogni task.
Ti sei scordato di fare i conti con la lentezza, sopratutto della SD, e l'endurance, la EEPROM, ma anche la SD, ha un numero di scritture limitate, inoltre non è assolutamente possibile mettere lo stack sulla SD o sulla EEPROM, questo non puoi farlo su nessun processore in quanto si tratta di registri che devono stare sulla ram in aree ben precise, in parte determinate dal hardware e in parte dal linguaggio.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 06:49 pm
Sotto questo aspetto gli Attiny sono piu' potenti, possono scrivere sempre sulla flash
Mai usati, al loro posto preferisco di gran lunga la serie 12 di Microchip, pertanto non conosco tutte le loro caratteristiche.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 07:16 pm
@astro mica ho detto che viene eseguito alla velocità della luce  :P, ho semplicemente detto che è l'unica maniera per non finire in quattro e quattro otto la SRAM.
Gia solo il salvataggio dei registri sarebbe un guadagno superiore ai 160byte(non ricordo il quantitativo dei registri ma essendo un RISC ne avra sicuramente piu di 20) a task.
Salvare lo stack del task in corso è un'operazione fattibile, forse un pelo complesso ma fattibile!
Anche tutta la copia dello stack è possibile anche senza sporcarsi le mani con l'Assembly solo che durante il copia/incolla e durante l'operazione inversa bisogna assicurarsi di non scrivere la porzione dello stack che è adibita a tutto questo complesso meccanismo, cosa molto difficile in c ma elementare in Assembly.
Per farti comprendere meglio, quando chiami task1() nello stack sarà presente l'indirizzo di ritorno a sequencer(), ora avverrà un interrupt bene hai un registro che punta alla memoria dello stack dell'interrupt e subito prima l'indirizzo di ritorno eccoci ora puoi iniziare a prelevare tutti i dati dello stack fino all'indirizzo di sequencer, una volta riallineati i registri si ha concluso il salvataggio.
Mi sono spiegato?
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 07:20 pm
Amo, chi riferendosi al linguaggio di programmazione, usa la parola Assembly e non Assembler  :)

Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 07:30 pm
Ti sei scordato di fare i conti con la lentezza, sopratutto della SD, e l'endurance, la EEPROM, ma anche la SD, ha un numero di scritture limitate, inoltre non è assolutamente possibile mettere lo stack sulla SD o sulla EEPROM, questo non puoi farlo su nessun processore in quanto si tratta di registri che devono stare sulla ram in aree ben precise, in parte determinate dal hardware e in parte dal linguaggio.
Cioè... si fanno i salti mortali per velocizzare il più possibile il Context Switch... e poi lo si va a salvare su una memoria morta di sonno?  :o

Poi davvero, se fai una ISR con più di due istruzioni, ti trovi fuori dal Tick! :D
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 07:38 pm
Amo, chi riferendosi al linguaggio di programmazione, usa la parola Assembly e non Assembler  :)


Solo le capre (e chi parla per sentito dire) usa la parola Assembler...
Title: Re: Scheduler ufficiale
Post by: nid69ita on Jun 25, 2015, 07:45 pm
Solo le capre (e chi parla per sentito dire) usa la parola Assembler...
Beeee .... io uso indifferentemente le due parole. Non mi formalizzo   :smiley-mr-green:  Tanto parlo itagliano e non Albionese.
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 07:57 pm
Solo le capre (e chi parla per sentito dire) usa la parola Assembler...
In realtà i programmatori usano indifferentemente tutti i due i termini per indicare un sorgente scritto in assembly, nessuno si scandalizza per questo.
Semmai c'è da incavolarsi e sdegnarsi quando si leggono termini come "voltaggio", "amperaggio", "wattaggio", al posto di "tensione", "corrente" e "potenza".


Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 07:59 pm
Quote
Cioè... si fanno i salti mortali per velocizzare il più possibile il Context Switch... e poi lo si va a salvare su una memoria morta di sonno?
Lo stesso scheduler è un'algoritmo molto dispendioso, che su questo tipo di CPU è (per me) inutile, ma se si vuole inserire un vero scheduler che possa eseguire più di 5/6 task è obbligatorio usare una qualsiasi tecnica per espandere la SRAM, usare la memoria virtuale non ti obbliga a rimanere dentro alla EEPROM o SD ma potresti benissimo copiare dentro ad una SRAM esterna che potrebbe fungere da buffer e potrebbe essere vuotato dentro alla SD durante i periodi morti dello scheduler.
Insomma usando una memoria virtuale ti si apre davanti uno scenario completamente diverso.
Sicuramente tutto sto accrocchio è ridicolo su codeste CPU.
L'unica via se proprio si vuole è quella inizialmente proposta da @Astro ma sicuramente è da migliorare un pò.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 25, 2015, 08:04 pm
l'assembly è il linguaggio assembler è il compilatore dell'assembly e dunque non sono intercambiabili!
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 08:07 pm
In realtà i programmatori usano indifferentemente tutti i due i termini per indicare un sorgente scritto in assembly, nessuno si scandalizza per questo.
Semmai c'è da incavolarsi e sdegnarsi quando si leggono termini come "voltaggio", "amperaggio", "wattaggio", al posto di "tensione", "corrente" e "potenza".



Mah... io l'ho sentito usare solo dalle capre (clienti). A casa mia (e per i miei colleghi)  l'Assembler è l'Assemblatore.
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 08:09 pm
Semmai c'è da incavolarsi e sdegnarsi quando si leggono termini come "voltaggio", "amperaggio", "wattaggio", al posto di "tensione", "corrente" e "potenza".



Quello è il lessico principale dell'Elettricista tipo ma a volte ci sono anche degli Ingegneri che rientrano in questa categoria!! Diciamo che se a dirlo è un Elettricista vero, è più tollerabile.... :D
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 08:10 pm
l'assembly è il linguaggio assembler è il compilatore dell'assembly e dunque non sono intercambiabili!
Ahia... Avevi guadagnato 2 punti, adesso ne hai perso 10... :D
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 25, 2015, 08:22 pm
Lo stesso scheduler è un'algoritmo molto dispendioso, che su questo tipo di CPU è (per me) inutile, ma se si vuole inserire un vero scheduler che possa eseguire più di 5/6 task è obbligatorio usare una qualsiasi tecnica per espandere la SRAM, usare la memoria virtuale non ti obbliga a rimanere dentro alla EEPROM o SD ma potresti benissimo copiare dentro ad una SRAM esterna che potrebbe fungere da buffer e potrebbe essere vuotato dentro alla SD durante i periodi morti dello scheduler.
Insomma usando una memoria virtuale ti si apre davanti uno scenario completamente diverso.
Sicuramente tutto sto accrocchio è ridicolo su codeste CPU.
L'unica via se proprio si vuole è quella inizialmente proposta da @Astro ma sicuramente è da migliorare un pò.
VB, the best way è quello di usare un paio di sandali per andare al mare, e un paio di scarpe da trekking per andare su un percorso di montagna.

Gli Scheduler si usano e funzionano.

Se devi fare 3-4 task(1) può essere sufficiente una MCU a 8 bit Arduino compreso, se i task sono 6 o 7, ti rivolgi ad una MCU a 16 bit (es. MSP430, e/o PIC24), se i task sono molti di più ti affidi ad un ARM o PIC a 32 bit.

Ti assicuro che uno Scheduler (no RTOS) che gira su un PIC32MZ a 200MHz o un ARM Cortex 4F di pari frequenza, di Task, e anche rognosi, te ne fa girare quanti ne vuoi.

Uno stack Ethernet + Grafica TFT pesante + stack USB + vari task come datalogger, divisioni e moltiplicazioni in virgola mobile per correggere la distanza GPS in base alla curvatura terrestre, ecc. ecc. girano tranquillamente su queste MCU, gestite da uno Scheduler, senza perdere un colpo.

Naturalmente solo una capra potrebbe pensare di far girare questa roba su Arduino (e ogni tanto qualcuno sul Forum lo chiede... :D ), ma i suoi 3 o 4 task semplici, li fa girare a Scheduler anche un Arduino.

(1) Naturalmente ci sono Task e Task, ma per semplificare ipotizziamo macchine a stati semplici...
Title: Re: Scheduler ufficiale
Post by: nid69ita on Jun 25, 2015, 08:54 pm
Semmai c'è da incavolarsi e sdegnarsi quando si leggono termini come "voltaggio", "amperaggio", "wattaggio", al posto di "tensione", "corrente" e "potenza".
Sai che noi italiani tendiamo a "inventarci" neologismi. Certo che "wattaggio" fa proprio ridere 
Title: Re: Scheduler ufficiale
Post by: speedyant on Jun 25, 2015, 09:04 pm
Sappiate che un distributore di materiale informatico ha coniato "polliciaggio"... Indovinate su quali prodotti?
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 25, 2015, 09:23 pm
Sappiate che un distributore di materiale informatico ha coniato "polliciaggio"... Indovinate su quali prodotti?
Monitor ?
Title: Re: Scheduler ufficiale
Post by: speedyant on Jun 25, 2015, 09:27 pm
Esatto...
Title: Re: Scheduler ufficiale
Post by: testato on Jun 25, 2015, 09:31 pm
neologismi emergenti  :)
stamane ne parlavano dose e presta, sono uscite fuori cose tipo feedbeccatemi  :)
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 12:04 am
Non avremmo un vocabolario cosi forbito se qualcuno non si inventasse qualche parola ogni tanto, che risulta anche simpatico contro scambiarne di significato tipo chiamare tensione la corrente o l'amperaggio in voltaggio!
@babbuino basta una lettura a wikipedia (https://it.m.wikipedia.org/wiki/Assembler) per capire cosa sia l'assembler.
il masm o il nasm sono assembler! ovvero compilatori del linguaggio assembly!
Avere 20 task non significa che siano tutti attivi, ma potrebbero essere in attesa e messi a dormire, proprio come sul tuo pc, hai centinaia di processi caricati e poco dopo messi da parte pronti a eseguire i tuoi comandi.
Il numero dei task non è correlato con il carico di lavoro! Anzi si cerca di aumentare il numero di task proprio per ridurre la mole di lavoro!
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 26, 2015, 12:47 am
@babbuino basta una lettura a wikipedia (https://it.m.wikipedia.org/wiki/Assembler) per capire cosa sia l'assembler.
il masm o il nasm sono assembler! ovvero compilatori del linguaggio assembly!
Lascia perdere Wikipedia, che a volte = wiki-piedi.

Più compiutamente, o più correttamente, l'Assembly è un Linguaggio assemblativo il quale viene tradotto nelle istruzioni in linguaggio assoluto, ovvero l' ISA tipico di una architettura, convertita in una sequenza di numeri binari. Il passaggio da assemblativo ad assoluto è operato dall'Assemblatore.

Compilatore è riferito a linguaggi di alto livello (o più precisamente "mid level" se parliamo del C), dove avviene una catena di operazioni più complessa che non attraverso un Assemblatore, per esempio il preprocesso del codice sorgente,  l'analisi lessicale, l'analisi sintattica, l'analisi semantica e, soprattutto, la generazione di un codice oggetto intermedio, operazioni che l'Assemblatore compie solo in parte, o non compie affatto. Inoltre il Compilatore opera ottimizzazioni ecc. ecc. che l'Assemblatore non fa.

Ergo:

Assemblatore: relativo all'Assembly, semplice traduzione dal linguaggio assemblativo a linguaggio assoluto

Compilatore: relativo ad un Linguaggio di alto livello, con una sequenza più complessa di operazioni intermedie.

Se all'Uni ti interrogano, e confondi Assemblatore con Compilatore, ti danno una bastonata in testa! :D


Avere 20 task non significa che siano tutti attivi, ma potrebbero essere in attesa e messi a dormire, proprio come sul tuo pc, hai centinaia di processi caricati e poco dopo messi da parte pronti a eseguire i tuoi comandi.
Il numero dei task non è correlato con il carico di lavoro! Anzi si cerca di aumentare il numero di task proprio per ridurre la mole di lavoro!
Mbè?  ::)
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 26, 2015, 01:09 am
Dimenticavo: naturalmente un Compilatore contiene nella sua "suite" di programmi ausiliari, anche l'Assemblatore, che però sara uno dei passaggi terminali. Dopo c'è la creazione di un file contenente del codice-oggetto, e infine il Linker.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 01:30 am
dovresti spiegarlo anche al masm (http://forum.arduino.cc/index.php?topic=331529.50) che interscambia correttamente assemblatore a compilatore.
L'assemblamento del codice assembly è proprio il passare dal preprocessore all'ottimizzatore fino al traduttore, stesse cose che fa il compilatore c.
Assembler e compilatore sono interscambiabili, assembly e assembler no!

Ma in sto forum l OT è legale più delle canne ad Amsterdam!

mbhe? se usi un vero context switch e puoi creare solo 6 task gli altri 14 dove li metti? semplice non li metti e crei un pasticcio di pasticcio!
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 26, 2015, 01:38 am
Un RTOS a caso:

embOS:

Features
Preemptive scheduling: Guarantees that of all tasks in READY state, the one with the highest priority executes, except for situations where priority inversion applies.
Round-robin scheduling for tasks with identical priorities.
Preemptions can be disabled for entire tasks or for sections of a program.
Thread local storage support.
Thread safe system library support.
No configuration needed.
Unlimited priorities: Every task can have an individual priority => the response of tasks can be precisely defined according to the requirements of the application.
Unlimited number of tasks (limited only by available memory).

Significa che il numero dei Task è limitato dalla memoria, nel nostro caso dalla RAM.


Ora, un ARM Cortex o un PIC32, hanno anche 512KB di RAM.

Secondo te quanti Task ci stanno dentro 512KB di RAM? Ma anche solo 256KB. Ma facciamo anche 128KB...
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 26, 2015, 06:36 am
L'assemblamento del codice assembly è proprio il passare dal preprocessore all'ottimizzatore fino al traduttore, stesse cose che fa il compilatore c.
Ma assolutamente no, l'assemblatore si limita a tradurre, uno a uno, le singole istruzioni assembly nella relativa codifica in linguaggio macchina risolvendo gli indirizzi forniti sotto forma di label.
Caso mai ti fosse sfuggito l'assembly altro non è che una notazione mnemonica del linguaggio macchina vero e proprio, l'assemblatore non deve trasformare una riga di codice, p.e. scritta in C, in equivalenti di linguaggio macchina.
Gli assemblatori non modificano il codice sorgente in qualcosa di diverso, si limitano a tradurlo in binario, gli unici aiuti che forniscono sono l'utilizzo delle label invece di doversi contare a manina i byte per un jump, nomi dei dati sotto forma di alias, invece di dover inserire l'address reale del dato o del puntatore, uso delle macro, che comunque sono sempre porzioni di codice assembly, però non si inventano nulla del codice, al massimo possono avvisarti se ci sono delle porzioni ridondanti, cicli aperti, salti al nulla, etc, insomma la solita sfilza di warning ed errori.
Ha assolutamente ragione Babbuino sul fatto che se all'Uni chiamavi compilatore l'assemblatore ti prendevano a calci nelle terga.
Ai bei tempi andati dello Z80, ero ancora un giovane studente, lo programmavo direttamente in codice macchina, sapevo a memoria tutti i codici operativi con i relativi modificatori dovuti ai vari modi di indirizzamento, potevo farlo proprio perché l'assembly altro non è che una rappresentazione "facile" per gli umani del codice macchina.
Title: Re: Scheduler ufficiale
Post by: gpb01 on Jun 26, 2015, 07:21 am
...
Ai bei tempi andati dello Z80, ero ancora un giovane studente, lo programmavo direttamente in codice macchina, sapevo a memoria tutte i codici operativi con i relativi modificatori dovuti ai vari modi di indirizzamento, potevo farlo proprio perché l'assembly altro non è che una rappresentazione "facile" per gli umani del codice macchina.
Bei tempi Astro ... :)

Stessa cosa facevo io, ma prima ... con i 4004, gli F8 e gli 8080 ... in cantina ho ancora quaderni pieni di ... valori esadecimali :D :D :D

Guglielmo
Title: Re: Scheduler ufficiale
Post by: nid69ita on Jun 26, 2015, 09:31 am
Ma in sto forum l OT è legale più delle canne ad Amsterdam!
Ma ogni tanto, un pochino OT andiamo. Finchè gli admin non ci segano le dita...  :)
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 26, 2015, 09:37 am
Ma ogni tanto, un pochino OT andiamo. Finchè gli admin non ci segano le dita...  :)
Gli admin sono tutti in ferie, finché dura la pacchia approfittiamone :)

Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 10:04 am
sono andati tutti ad amsterdam! :smiley-mr-green:
Title: Re: Scheduler ufficiale
Post by: dally on Jun 26, 2015, 10:51 am
(https://www.imageupload.co.uk/images/2015/06/26/z80-iman1.jpg)
(https://www.imageupload.co.uk/images/2015/06/26/z80-iman2.jpg)


Ai bei tempi andati dello Z80
HappyDays :)
Title: Re: Scheduler ufficiale
Post by: dally on Jun 26, 2015, 11:00 am
Certainly Microsoft's fault, MASM is their slang, it stands for "macro" "assembler", early versions of their MASM were sold either as a generic "Microsoft Macro Assembler" for all x86 machines. MASM was also bundled with a smaller companion assembler, ASM.EXE. This was intended for PCs with only 64k of memory and lacked some features of the full MASM such as the ability to use code macros, while the "advanced version" MASM.EXE was full featured to expand macros. It was like g/as with cpp, just that. Confusion came.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 03:53 pm
La solita Micro$oft...
Non me ne vogliate ma tornando al thread e parlando dunque di quest'inutile scheduler risulta impraticabile un vero scheduler su tali chip, sprecare molto piu di 160byte per ogni task è assurdo!
Quindi come dicevo la versione di @astro è l'unica scelta (se proprio vogliamo affliggerci) che possiamo fare ma, ma bisogna dargli un briciolo di brio in piu.
In una mezzoretta ho tirato fuori questo:

scheduler.h
Code: [Select]

#ifndef __SCHEDULER_H__
#define __SCHEDULER_H__

#include <Arduino.h>

#define TASK_PRIORITY_TIME   0x00
#define TASK_PRIORITY_LOW    0x01
#define TASK_PRIORITY_NORMAL 0x02
#define TASK_PRIORITY_HIGH   0x04
#define TASK_SLEEP           0x10
#define TASK_PRIORITY_MASK   0x07

#define TASK_LPING  0
#define TASK_LPONG  1
#define TASK_LTIME  2
#define TASK_LSLEEP 3
#define TASK_LCOUNT 4

#define TASK_CONTINUE 0
#define TASK_TOSLEEP  1

#define TASK_PRIORITY(T) ((T)->flags & TASK_PRIORITY_MASK)
#define TASK_SLEEPING(T) ((T)->flags & TASK_SLEEP)

typedef unsigned long(*TASK)(void);

typedef struct _HTASK
{
    unsigned long t;
    byte flags;
    TASK loop;
    struct _HTASK* next;
}HTASK;

class SCHEDULINO
{
    public:
        SCHEDULINO();
        void add(HTASK* tsk);
        void loop(void);
        HTASK* current(void);
        byte delay(unsigned long time);
       
    private:
        HTASK* _current;
        HTASK* _first[TASK_LCOUNT];
        byte _pingpong;
        unsigned long _lt;
       
        HTASK* pop(byte hl);
        void tosleep(HTASK* tsk, byte hl);
        void tick(unsigned int time);
};

#endif


scheduler.ino
Code: [Select]

#include <Arduino.h>
#include "scheduler.h"

SCHEDULINO::SCHEDULINO()
{
    byte i;
    for ( i = 0; i < TASK_LCOUNT; ++i )
        _first[i] = NULL;
    _pingpong = 0;
    _lt = 0;
}

void SCHEDULINO::add(HTASK* tsk)
{
    if ( TASK_SLEEPING(tsk) )
    {
        tsk->next = _first[TASK_LSLEEP];
        _first[TASK_LSLEEP] = tsk;
        return;
    }
 
    byte p = TASK_PRIORITY(tsk);

    if ( p == TASK_PRIORITY_TIME )
    {
        if ( !_first[TASK_LTIME] ) { _first[TASK_LTIME] = tsk; return;}
        if ( tsk->t < _first[TASK_LTIME]->t )
        {
            tsk->next = _first[TASK_LTIME];
            _first[TASK_LTIME] = tsk;
            return;
        }
       
        HTASK* fp = _first[TASK_LTIME];
        for (; fp->next && tsk->t > fp->next->t; fp = fp->next);
        tsk->next = fp->next;
        fp->next = tsk;
        return;
    }
   
    byte pp = !_pingpong;
   
    if ( !_first[pp] ) { _first[pp] = tsk; return;}
    if ( p > TASK_PRIORITY(_first[pp]) )
    {
        tsk->next = _first[pp];
        _first[pp] = tsk;
        return;
    }
       
    HTASK* fp = _first[pp];
    for (; fp->next && p <= TASK_PRIORITY(fp); fp = fp->next);
   
    tsk->next = fp->next;
    fp->next = tsk;   
}

HTASK* SCHEDULINO::pop(byte hl)
{
    if ( !_first[hl] ) return NULL;
    HTASK* ret = _first[hl];
    _first[hl] = ret->next;
    ret->next = NULL;
    return ret;
}

void SCHEDULINO::tosleep(HTASK* tsk, byte hl)
{
    if ( _first[hl] == tsk )
    {
        _first[hl] = tsk->next;
    }
    else
    {
        HTASK* f = _first[hl];
        for (; f->next && f->next != tsk; f = f->next);
        if ( !f->next ) return;
        f->next = tsk->next;
    }
   
    tsk->next = _first[TASK_LSLEEP];
    _first[TASK_LSLEEP] = tsk;
}

void SCHEDULINO::tick(unsigned int time)
{
    HTASK* t = _first[TASK_LTIME];
    for(; t; t = t->next)
    {
        if ( t->t <= time )
            t->t = 0;
        else
            t->t -= time;
    }
}

void SCHEDULINO::loop(void)
{   
    if ( _lt == 0 )
    {
        _lt = micros();
        return;
    }
   
    tick(micros() - _lt);
    _lt = micros();
   
    while ( _first[TASK_LTIME] && !_first[TASK_LTIME]->t )
    {
        _current = pop(TASK_LTIME);
        if ( (_current->t = _current->loop()) < 2 )
            tosleep(_current,TASK_LTIME);
        else
            add(_current);
    }
   
    if ( !_first[_pingpong] )
    {
        _pingpong = !_pingpong;
        return;
    }
   
    _current = pop(_pingpong);
    if ( TASK_CONTINUE == _current->loop() )
        add(_current);
    else
        tosleep(_current,_pingpong);
}

HTASK* SCHEDULINO::current(void)
{
    return _current;
}

byte SCHEDULINO::delay(unsigned long time)
{
    if ( TASK_PRIORITY_TIME == TASK_PRIORITY(_current) )
    {
        delay(time);
        return 1;
    }
   
    if ( !_current->t )
    {
        _current->t = micros();
        return 0;
    }
   
    if ( micros() >= _current->t + time * 1000)
    {
        _current->t = 0;
        return 1;
    }
   
    return 0;
}


e un esempio di utilizzo:
Code: [Select]

#include "scheduler.h"

SCHEDULINO tasks;

unsigned long t1_loop()
{
    if ( tasks.delay(5000) )
        Serial.println("t1_loop");
    return TASK_CONTINUE;
}


HTASK t1 = { 0,
             TASK_PRIORITY_LOW,
             t1_loop,
             NULL
           };


unsigned long t2_loop()
{
    static byte counter = 50;
   
    if ( !tasks.delay(500) ) return TASK_CONTINUE;
   
    --counter;
    if ( !counter )
    {
        Serial.println("t2->sleep");
        return TASK_TOSLEEP;
    }
   
    Serial.print("t2_loop = ");
    Serial.println(counter);
    return TASK_CONTINUE;
}


HTASK t2 = { 0,
             TASK_PRIORITY_HIGH,
             t2_loop,
             NULL
           };


unsigned long t3_loop()
{
    static byte onof = 0;
   
    digitalWrite(13,onof);
    onof = !onof;
   
    return 700000L;
}


HTASK t3 = { 700000L,
             TASK_PRIORITY_TIME,
             t3_loop,
             NULL
           };

unsigned long t4_loop()
{
    static unsigned long oldt = 0L;
    unsigned long tt = micros();
   
    if ( !oldt )
    {
        oldt = micros();
        return 500000L;
    }
   
    Serial.print("t4_time = ");
    Serial.println( tt - oldt );
    oldt = micros();
   
    return 500000L;
}


HTASK t4 = { 500000L,
             TASK_PRIORITY_TIME,
             t4_loop,
             NULL
           };

void setup()
{
    Serial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,LOW);
   
    tasks.add(&t1);
    tasks.add(&t2);
    tasks.add(&t3);
    tasks.add(&t4);
}


void loop()
{
    tasks.loop();
}


praticamente si ha la possibilità di usare 3 priorità per task, una funzione di delay() da usare dentro ai task e la possibilità di creare task temporizzati, in quest'ultimo caso per adesso è garantito solo il richiamo al superamento del tempo ma aumentarne la precisione non è molto complicato è solo che ho finito il tempo a disposizione....... :)
Dimenticavo, si può mettere a riposo i vari task ma mi sono scordato la funzione x risvegliarli.....ahahahhaahhaha che testa!
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 26, 2015, 04:11 pm
Quindi come dicevo la versione di @astro è l'unica scelta (se proprio vogliamo affliggerci) che possiamo fare ma, ma bisogna dargli un briciolo di brio in piu.
In una mezzoretta ho tirato fuori questo:
Solo per il fatto che è realizzato in C++ è bocciato :), inoltre introduci cose che non servono e appesantiscono il tutto inutilmente, sopratutto parlando di Arduino.
Pessima la scelta di gestire il tempo con la micros(), oltre ad essere imprecisa richiede un sacco di cicli macchina per essere eseguita e poi nessuno ti garantisce il corretto aggiornamento del tempo visto che l'aggiornamento dei ticks non avviene sotto interrupt.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 04:39 pm
@Astro siamo nel forum arduino o no? Parliamo di scheduler per arduino o no? Dunque bisogna adattarsi alla scheda e al linguaggio, anche io sono un purista del c ma arduino no, convertirlo in c è questione di nanosecondi!
Quali sarebbero le cose che non servono?
Ho usato la micros() per il semplice fatto che il codice sopra postato risulta molto piu comprensibile a tutti(quelli che conoscono le liste  :) ).
L'ho poi scritta in 30' non 30gg.......e sicuramente si avvicina di piu ad uno scheduler di quanto potesse fare quel temporizzatore che hai creato  :P ( mi stavo annoiando, era già troppo che non litigavamo piu!  :D )
Title: Re: Scheduler ufficiale
Post by: dally on Jun 26, 2015, 06:23 pm
ego burst
Title: Re: Scheduler ufficiale
Post by: testato on Jun 26, 2015, 06:27 pm
nono, non litigate dai che qui ci esce una bella cosa  :)

E' cosa buona e giusta lasciare la API inalterata, quindi usare i nomi dello scheduler ufficiale.
https://www.arduino.cc/en/Reference/SchedulerStartLoop (https://www.arduino.cc/en/Reference/SchedulerStartLoop)

la funzione yield() e' presente anche sul core della UNO, e' possibile usarla per scrivere la relativa funzione ?
https://github.com/arduino/Arduino/blob/bd8f7932e64fb3a41e3d934437d5eabd8707dcc9/hardware/arduino/avr/cores/arduino/hooks.c (https://github.com/arduino/Arduino/blob/bd8f7932e64fb3a41e3d934437d5eabd8707dcc9/hardware/arduino/avr/cores/arduino/hooks.c)
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 06:58 pm
ahahhahaha @testato lo vuoi a tutti i costi vero?
Dimmi dove sono tutti i file dello scheduler che lo portiamo sulla uno solo per far dispetto ad @Astro.... no dai scherzo, i dispetti non li faccio più....ajahahahhaahah
ma la yield() cosa fa nello specifico?
se è la classica funzione è implementabile, nel mio codice, basta scorrere la lista fino all'ultimo elemento e metterci il proprio task.
Però mi devi spiegare come funziona quello scheduler, ha le priorità? le funzioni sono temporizzabili? Non ho la più pallida idea di come funzioni, io su sti chipettini non li ho mai usati, su quelli grossi grossi si!

@Dally non ho capito bene cosa volessi dire, il soggetto e il significato intrinseco.
Title: Re: Scheduler ufficiale
Post by: testato on Jun 26, 2015, 08:04 pm
questa e' la libreria ufficiale per il SAM
https://github.com/arduino/Arduino/tree/bd8f7932e64fb3a41e3d934437d5eabd8707dcc9/libraries/Scheduler (https://github.com/arduino/Arduino/tree/bd8f7932e64fb3a41e3d934437d5eabd8707dcc9/libraries/Scheduler)
Se installi il core per i Sam dal Board Manager te la ritrovi anche su PC

Lo scheduler e' stato preso da Android, ed e' ancora sotto All Right Reserved  :)
la yield() va a modificare direttamente dei registri in assembly, non so di preciso che fa.

Io credo sarebbe gia' utile e funzionale prendere paroparo la libreria di Astro ed adattarla alla API.
L'idea e' creare una pull request ed integrare la funzionalita' nello scheduler ufficiale, in modo da avere una sola libreria che pero' in base al micro scelto compilera' la roba Android su SAM o la roba di Astro su AVR
Seppoi ci aggiungete altro, o trovate un accordo per scriverne uno nuovo, a noi utenti "normali" non interessa, ci basta la API comune  :)

Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 08:31 pm
@testato ma usa la memoria dinamica! no dai.....devo proprio.....
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 26, 2015, 08:46 pm
Sulla uno non si può fare esattamente quello scheduler, o meglio quello scheduler viene inizializzato in setup e poi nel loop non c'è piu niente!
E come fai nella uno? bisognerebbe chiamare un interrupt ed eseguire la tasks.loop(), @Astro che tempo usiamo? me la fai te la funzione per l'interrupt? servirebbe anche disabilitare solo quel interrupt e riabilitarlo al momento giusto.
Dopotutto è uno scheduler elementare appoggiato per di piu su di una lista dinamica! mha......io non userei la malloc......ma se proprio siamo obbligati.............dopotutto non è work in progress? se gli piace piu la nostra buttano via la loro!
Tanto il succo è semplice, la deve usare anche mia nonna....
Title: Re: Scheduler ufficiale
Post by: astrobeed on Jun 27, 2015, 11:47 am
Bei tempi Astro ... :)

Stessa cosa facevo io, ma prima ... con i 4004, gli F8 e gli 8080 ... in cantina ho ancora quaderni pieni di ... valori esadecimali :D :D :D
Ero sicuro di averne ancora una, mi è toccato cercare in cantina però alla fine l'ho trovata, questa scheda con Z84 (unico chip con dentro Z80 10 MHz e Z80 SIO) ha ben 25 anni, oltre al micro ci sono due Z80 pio, una EPROM da 64K ,  32 k di ram da 85ns, un RTC, una GAL utilizzata come gestore bus, Microprocessor Supervisor con watchdog, all'epoca era un piccolo mostro come scheda applicativa. :)
Agli inizi degli anni 90 le mcu erano ancora acerbe, muovevano i loro primi passi, non erano assolutamente in grado di rivaleggiare con un micro puro come lo Z80 e similari.
Giusto per la cronaca, nel 1990 quella scheda costava quasi 200.000 lire, fatevi i vostri conti di quanto costerebbe al giorno d'oggi tenendo conto della svalutazione.

(http://www.mdaproject.it/doc/Z80.jpg)
Title: Re: Scheduler ufficiale
Post by: gpb01 on Jun 27, 2015, 01:01 pm
Ahhh ... ma allora voj la guera (... co' du' ere) ...  :smiley-mr-green: :D :smiley-mr-green: :D


(http://braguglia.net/images/MCS80.jpg)


(http://braguglia.net/images/MCS-80-Manual.jpg)


... parliamo della seconda metà degli anni '70 ... c'è l'ho incorniciata in salone (la board) :D :D :D

Guglielmo

P.S. ... dopo scendo in cantina e recupero pure il manuale del 4004 :D :D :D
P.P.S. ... e nun te dico negli anni '70 quanto m'è costato fa' quella de board !!!
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 27, 2015, 04:55 pm
ma sto parlando con degli anziani signorini...
 :)  :)  :)  :)  :)  :)  :)
Title: Re: Scheduler ufficiale
Post by: gpb01 on Jun 27, 2015, 04:56 pm
ma sto parlando con degli anziani signorini...
... ma no, figurati ... ci puzza ancora la bocca di latte ...  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Guglielmo
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 28, 2015, 09:48 am
Ho modificato lo scheduler cosi:

scheduler.h
Code: [Select]

#ifndef __SCHEDULER_H__
#define __SCHEDULER_H__

#include <Arduino.h>

#define TASK_DELAYS 0x01

extern "C"
{
    typedef void (*SchedulerTask)(void);
   
    typedef struct _task
    {
        byte flags;
        unsigned int ts;
        unsigned int td;
        SchedulerTask loop;
        struct _task* next;
    }Task;
}

class SchedulerClass
{
    public:
        SchedulerClass();
        void startLoop(Task* task, unsigned long stackSize);
        void delaysLoop(unsigned int mstime);
        void enable(byte e);
   
    private:
   
};

extern SchedulerClass Scheduler;

#endif


scheduler.ino
Code: [Select]

#include <Arduino.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>

#include "scheduler.h"

SchedulerClass Scheduler;

#define _DSI() SREG &= ~(1 << SREG_I)
#define _ENI() SREG |=  (1 << SREG_I)
#define _WDTP16   0
#define _WDTP32   1
#define _WDTP64   2
#define _WDTP125  3
#define _WDTP250  4
#define _WDTP500  5
#define _WDTP1000 6
#define _WDTP2000 7
#define _WDTP4000 8
#define _WDTP8000 9

extern "C"
{   
    volatile unsigned int _tick = 0;
    Task* _first = NULL;
   
    void dispatcher()
    {
        Task* s = _first;
        while ( _first->flags & TASK_DELAYS )
        {
            if ( _tick >= _first->ts + _first->td ) break;
            _first = _first->next;
            if ( s == _first ) return;
        }
       
        _first->flags &= ~TASK_DELAYS;
        _first->loop();
        _first = _first->next;
    }

    void watchdogI(byte e, byte p)
    {
        if ( p > _WDTP8000 ) return;
        _DSI();
        wdt_reset();
        MCUSR &= ~(1 << WDRF);
       
        if( !e )
        {
            WDTCSR |= (1<<WDCE) | (1<<WDE);
            WDTCSR = 0x00;
            _ENI();
            return;
        }
       
        WDTCSR |= (1<<WDCE) | (1<<WDE);
        WDTCSR =  (1<<WDIE) | ( p & 0x0E);
        _ENI();
    }
}

ISR(WDT_vect,ISR_NOBLOCK)
{
    if ( !_first ) reti();
    watchdogI(0,0);
    ++_tick;
   
    dispatcher();
     
    watchdogI(1,_WDTP16);
}


SchedulerClass::SchedulerClass()
{
    watchdogI(1,_WDTP16);
}


void SchedulerClass::startLoop(Task* task, unsigned long stackSize)
{
    _DSI();
    if ( !_first )
    {
        _first = task->next = task;
    }
    else
    {
        task->next = _first->next;
        _first->next = task;
    }
    _ENI();
}

void SchedulerClass::delaysLoop(unsigned int mstime)
{
    mstime /= 16;
    _first->flags |= TASK_DELAYS;
    _first->ts = _tick;
    _first->td = mstime;
}

void SchedulerClass::enable(byte e)
{
    if ( e )
        watchdogI(1,_WDTP16);
    else
        watchdogI(0,0);
}


e viene usata cosi:
Code: [Select]

#include "scheduler.h"

int freeram()
{
    extern int __heap_start, *__brkval;
    int v;
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

void t0_loop()
{
    Serial.print("RAM LIBERA:");
    Serial.println(freeram());
    Scheduler.delaysLoop(500);
}

Task t0 = { 0,0,0, t0_loop, NULL};


void t1_loop()
{
    Serial.println("t1_loop");
    Scheduler.delaysLoop(1500);
}

Task t1 = { 0,0,0, t1_loop, NULL };

void t2_loop()
{
    static byte onof = 0;
    static unsigned long c = 0;
   
    digitalWrite(13,onof);
    onof = !onof;
   
    Serial.println(c++);
   
    Scheduler.delaysLoop(700);
}


Task t2 = { 0,0,0, t2_loop, NULL};

void t3_loop()
{
    static unsigned long oldt = 0;
    unsigned long t = micros();
    if ( !oldt ) { oldt = micros(); return;}
    Serial.print("time:");
    Serial.println(t-oldt);
    Scheduler.delaysLoop(1840);
    oldt=micros();
}
 
Task t3 = { 0,0,0, t3_loop, NULL };
                   
void loop()
{
    Serial.println("LOOP");
    Scheduler.delaysLoop(3000);
}

Task tl = { 0,0,0, loop, NULL};
                   
void setup()
{
    Serial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,LOW);
   
    Scheduler.startLoop(&t0,0L);
    Scheduler.startLoop(&t1,0L);
    Scheduler.startLoop(&t2,0L);
    Scheduler.startLoop(&t3,0L);
    Scheduler.startLoop(&tl,0L);
   
    while(1);
}


Ho usato il metodo di @astro per i tick cosi è contento, per adesso non ho messo ancora la memoria dinamica perchè momentaneamente è una cosa in piu e basta.
Solo che ho un problema, cosi come lo vedete va ma se non voglio mettere Loop nello scheduler e lasciarlo utilizzare normalmente va in crash tutto!
esempio in loop ci metto una print e un delay.
Devo scoprire esattamente il perchè, se volete darmi una mano....ahahahahh

qualche tick viene perso lo so, solo che l'ho modificata per vedre di fare andare la funzione loop()
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 28, 2015, 09:55 am
la isr full tick:
Code: [Select]


volatile byte _lock = 0;

ISR(WDT_vect,ISR_NOBLOCK)
{
    if ( !_first ) reti();
   
    ++_tick;
    if ( _lock ) reti();
   
    _lock = 1;
    dispatcher();
    _lock = 0;
}

Title: Re: Scheduler ufficiale
Post by: testato on Jun 28, 2015, 09:58 am
per quanto riguarda il come usarlo l'unico modo per arrivare all'obiettivo di integrare la modifica nello scheduler ufficiale e' che ci giri lo stesso esempio senza toccarlo.
Questo e' l'esempio ufficiale, quindi le chiamate a funzione devono essere uguali
https://www.arduino.cc/en/Tutorial/MultipleBlinks (https://www.arduino.cc/en/Tutorial/MultipleBlinks)

Se non si puo' fare pace, vuol dire che resta un altro scheduler come ce ne sono tanti ma che non diventera' "ufficiale"  :)
Title: Re: Scheduler ufficiale
Post by: BaBBuino on Jun 29, 2015, 05:42 pm
La storia della malloc mi faceva prudere il naso, e allora sono andato a vedere quante risorse impiega su un coso a 8 bit, con risorse limitatissime:

Se scrivo questo codice:

char a[100];

main()
{

a[30]=77;

}

...poiché l'indirizzo dell'elemento in cui scrivere è noto, il codice generato è molto ridotto (50 words) e la
scrittura nell'array avviene in due cicli di clock.

Se la stessa azione la compio utilizzando l'istruzione malloc():

char * a;

main()
{
 a=malloc(100);
 a[30]=77;
 free(a);
}

Il programma compilato ha dimensioni molto maggiori (325 words) e la scrittura dell'elemento avviene in 6 cicli di clock.

Rispetto alla prima versione il programma è cresciuto di 275 words, di cui 157 dovute alla funzione malloc(), e 104 dovute alla funzione free(), oltre alle 14 words necessarie per la chiamata di tali funzioni.

Inoltre l'array creato, viene inizializzato completamente con tutti valori nulli, il che aumenta ulteriormente l'uso delle risorse.

Direi di lasciare la malloc() ai sistemi PC...
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jun 29, 2015, 06:59 pm
@Babbuino hai bisogno per forza di più word! usi 2 funzioni!
L'array NON VIENE INIZIALIZZATO! se vuoi fare ciò devi usare la calloc().
A parte essere poco prestazionale nel creare e distruggere la memoria il resto rimane veloce in egual modo, nei sistemi embededd so che non si usa perché è pericolosa, sul misra c'è scritto bene, deprecata!
Spreca anche un void* per allocazione, si può studiare sul k&r, una sua implementazione su stack o memoria condivisa con sincronizzazione la si trova nell'easyframework->easyalloc.
@Testato ci sono già scheduler che permettono di fare quello che vuoi, solo che riduci troppo la memoria e non danno tutti sti vantaggi, anzi, io continuo a rimanere dell'idea che uno scheduler in questi chip sia inutile, ancora ancora sul tensy di @astro ma su una uno!
Nessuno ha fatto un esempio di qualche reale utilizzo sulla uno.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 20, 2015, 01:08 pm
sto scrivendo una serie di articoli sugli scheduler fra i quali c'è un possibile porting dello scheduler di Arduino Due sulla Uno, lo scopo principale è quello di far girare gli sketch della due che usano lo scheduler anche sulla Uno.
Il codice si riduce a qualche semplice modifica alla classe dello scheduler ufficiale di Arduino, quando sono andato a testarla ho notato che a volte si impallava tutto!
Eppure lo scheduler è il più semplice dei cooperative e mi sembrava strano di aver commesso un errore così grosso.
Così dopo qualche indagine ho scoperto un bug nella funzione delay contenuta in wriring.c.
Dato che lo scheduler a cooperazione richiede il context switch richiamato dal processo stesso, gli sviluppatori di Arduino hanno aggiunto lo yield() nella funzione delay() e fin qui tutto nella norma, ma non hanno considerato che un task può durare anche più di un millisecondo e questo causa un problema interno alla funzione delay, tale circostanza può portare a un loop infinito
Io ho risolto e ho aperto un issues (https://github.com/arduino/Arduino/issues/4320) dove do anche due possibili soluzioni.
Per adesso mi fermo qui, ci rivediamo ad articolo completato
Title: Re: Scheduler ufficiale
Post by: dally on Dec 20, 2015, 01:59 pm
sto scrivendo una serie di articoli
in first place you'd better learn English!
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 20, 2015, 02:20 pm
@dally fatico a conoscere l'italiano.
L'inglese riesco a leggerlo ma a scriverlo mi faccio aiutare da google, che spesso infila errori la dove magari io non avrei sbagliato.
Comunque gli articoli sono in italiano :p
questo (http://vbextreme.netai.net/2015/12/19/embedded-arduino-scheduler-patre-1/) è il primo articolo, poi esce 1.1 che parla del porting, il 2 che parla di un scheduler preemptive sulla Arduino uno e infine la 2.1 parlerà di sezioni critiche, semafori.
@dally non miro a diventare un giornalista o di cambiare la vostra vita, leggi, se ti piace mi fa piacere, altrimenti Amen. Se non riesci a leggerlo puoi contribuire a scriverlo nella lingua che ti sembra più consona.
Alle critiche sono aperto, alle polemiche no.
Title: Re: Scheduler ufficiale
Post by: meluino on Dec 20, 2015, 04:25 pm
@dally fatico a conoscere l'italiano.
L'inglese riesco a leggerlo ma a scriverlo mi faccio aiutare..........
vbextreme, per quello che può servire ti appoggio pienamente!!
È vero che un tecnico dovrebbe conoscere l'inglese alla perfezione, ma è anche vero che per gente come ME che ha un livello leggermente superiore a quello scolastico in un mondo come questo fanno tre volte fatica, in quanto la maggior parte dei manuali sono appunto in inglese!!
Per una volta che ci sono degli articoli in italiano...........non polemizziamo, anzi fateceli godere!!!

Ciao

Meluino
Title: Re: Scheduler ufficiale
Post by: testato on Dec 20, 2015, 10:03 pm
Grazie VB per questo lavoro, è roba ad alto livello che si vede difficilmente da queste parti.
Fondamentale anche la scelta degli articoli in italiano  ;)

P.s. correggi il titolo, Parte non Patre  :)


Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 20, 2015, 10:43 pm
@testato, grazie per il supporto, corretto la dislessia del titolo.
Domani sono in viaggio per lavoro, spero di riuscire a terminare l'articolo per Natale.
@Meluino, grazie per il supporto.
Title: Re: Scheduler ufficiale
Post by: meluino on Dec 21, 2015, 12:16 am
@testato, grazie per il supporto, corretto la dislessia del titolo.
Domani sono in viaggio per lavoro, spero di riuscire a terminare l'articolo per Natale.
@Meluino, grazie per il supporto.
Grazie a te per il lavoro svolto!!!
Title: Re: Scheduler ufficiale
Post by: zoomx on Dec 21, 2015, 02:44 pm
vbextreme,
l'ho letto. L'unica critica che faccio è che il significato delle variabili io lo metterei all'interno del codice come commento altrimenti devo fare su e giù con il browser.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 21, 2015, 05:35 pm
Visto che con .ino in genere si pensa ad uno sketch io cambierei estensione in .c lasciando .ino solo all'esempio.

Con le nuove release è possibile usare sottocartelle nella cartella dello sketch, quindi potresti fare un .zip da scaricare con dentro .ino+folder
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 22, 2015, 11:29 am
Ero rimasto alla 1.0 che accettava solo file .ino interni allo sketch.
I commenti dentro al codice non mi piacciono molto, si finirebbe per leggere male sia il codice che i commenti.
Io la vedo così:
uno legge il codice e le parti che non comprende va a leggere i commenti.
Comunque provvederò a migliorarlo.
Per il codice pensavo di metterlo su github con un branch per ogni articolo.

Grazie per tutto. 
Title: Re: Scheduler ufficiale
Post by: testato on Dec 22, 2015, 06:23 pm
volevo fare una prova ma non compila, forse errori di copia incolla verso il blog ?
inizialmente fa errori sul wdt_reset(); quindi ho incluso #include <avr/wdt.h> ed ho risolto

ma poi continua, ad esempio quando va a settare il registro watchdog
WDTCSR |= (1< ip; --i)

dice che ip non e' dichiarato

ed altri

Testato su IDE 1.6.7 Win7-64

Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 22, 2015, 07:35 pm
deve essere successo qualcosa al sito....
scusa @testato, qui (http://forum.masterdrive.it/blogs/vbextreme/embedded-arduino-scheduler-parte-1-180/) forse va.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 22, 2015, 08:50 pm
yep, non e' successo qualcosa lato blog, e' proprio una versione diversa  :)

ho ammazzato un po' di define e spostati i file in una subfolder, in modo da avere solo lo sketch sull'IDE

Confermo che funzionano i tre loop  :)

allego lo zip per chi vuole rpovare al volo
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 23, 2015, 05:34 am
Quote from: @quote
yep, non e' successo qualcosa lato blog, e' proprio una versione diversa
l'avevo pure controllato!, ma poi ho pasticciato qualcosa per separare meglio il codice dal messaggio e si vede che devo aver fatto qualcosa di sbagliato...
Ho una connessione poco stabile e sono affogato di impegni ma prometto che lo miglioro, nel frattempo divertiti con quel giochino, io adesso torno a scrivere l'articolo sul porting, sto anche migliorando il codice dello scheduler che l'avevo buttato li solo per vedere se funzionava.
Comunque l'articolo 1.0 e 1.1 saranno solo l'introduzione ad uno scheduler molto piu potente che presenterò alla 2.0
Codesto scheduler sarà di tipo preemptive con possibilità di lavorare anche come cooperative, avrà semafori, temporizzazioni, sezioni critiche, l'unica vera limitazione è l'uso del watchdog al posto di un vero timer.
questo
Code: [Select]

static void _scheduling(void)
{
    struct task* t;
    for (t = (struct task*) _task; NULL != t; t = t->next )
    {
        if ( t->ts == TSK_WAIT && _tick >= t->mytick )
        {
            critical_begin();
            t->mytick = _tick + t->tick;
            t->ts = TSK_RUN;
            critical_end();
            if ( t->fnc(t) )
            {
                t->ts = TSK_STOP;
                t->state = 0;
            }
            else
                t->ts = TSK_WAIT;
        }
    }
}

sarà il suo cuore.




per il resto grazie mille, +1.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 23, 2015, 08:29 am
Sta roba fa girare la testa, senza commenti capirei il 30%  :)

Visto che è tutto in C, ha senso (non so se solo stilistico o se ha anche influenze sul risultato) usare .c come estensione e poi aggiungere extern C ?
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 23, 2015, 10:07 am
extern C serve per la decorazione dei nomi, ma se lo richiami fuori da una classe è indifferente.
l'estensione io lascierei la .cpp in questo modo non si hanno problemi se si vuole inserire del debug con la Serial.


Ho proseguito a scrivere l'articolo 1.1 ma è lunghissimo e mi ci vuole molto piu tempo e con il Natale alle porte, diventa difficile.
Pertanto per ringraziarvi vi posto un'anteprima, ovvero il codice dello scheduler e come installarlo.






Quindi fase 1 "togliamo i bug":
Come accennato precedentemente Arduino delay ha un bug (https://github.com/arduino/Arduino/issues/4320), causa codesto problemino e alla scarsa potenza dell'avr328 finiremo molto probabilmente in un loop infinito, quindi risolviamolo cosi:
Portiamoci nella directory dove è contenuto il file "wiring.c", nel mio caso:"~/Arduino-master/build/linux/work/hardware/arduino/avr/cores/arduino"
Per sicurezza copiamo il file wiring.c in wiring.old
adesso apriamo wiring.c e portiamoci dove vedete questo:
Code: [Select]

void delay(unsigned long ms)
{
   
 uint16_t start = (uint16_t)micros();

 while (ms > 0) {
 yield();
 if (((uint16_t)micros() - start) >= 1000) {
 ms--;
 start += 1000;
 }
 }
}

bene, adesso cancellate quella funzione e copiateci codesto codice:
Code: [Select]

void delay(unsigned long ms)
{
    uint32_t start = (uint32_t)micros();

    while (ms > 0) {
        yield();
        while ( ms > 0 && ((uint32_t)micros() - start) >= 1000) {
            ms--;
            start += 1000;
        }
    }
}

salvate e chiudete tutto.

fase 2 "installiamo lo scheduler":
Aprite Arduino IDE, cliccate su "Sketch->inclusione librerie->gestione librerie"
Ora nella nuova finestra in alto a destra scrivete "scheduler" e installate "Scheduler by Arduino 0.4.4"
Chiudete l'ide

fase 3 "iniettiamo un UNO nel DUE":
Aprite la directory dove è contenuto lo scheduler, nel mio caso :"~/Arduino/libraries/Scheduler/src"
Rinominate Scheduler.cpp in Scheduler.old
Ora Scaricate il file che ho messo in allegato e mettetelo in quella directory

fase 4 "testiamo":
Aprite nuovamente l'IDE di arduino, cliccate su "file->esempi->scheduler->MultipleBlinks".
Adesso vedete il codice multitask di esempio(ufficiale) per arduino DUE, collegate due led con una resistenza sul pin 12 e 11 sulla vostra Arduino UNO, Selezionate la scheda "Arduino/Genuino UNO", selezionate la porta com, compilate ed inviate lo sketch.
Dovrebbero lampaggiare il led 13 e 12 mentre l'11 si accende e spegne tramite l'invio da monitor seriale di 0 o 1.
[edit]con la speranza che la fretta non mi abbia fatto commettere l'ennesimo stupido errore[/edit]

Buon Divertimento e a presto con l'articolo che spiegherà tutto molto meglio
Title: Re: Scheduler ufficiale
Post by: Maurotec on Dec 23, 2015, 11:15 am
Volevo anche io provare il codice, ma purtroppo non uso Arduino IDE e il core ecc. Ho creato un progetto con l'IDE (QtCreator) che uso normalmente con avr-gcc (o g++). Ho un sotto progetto scheduler0 che verrà compilato per essere una libreria, ora con tutte ste versioni non ci ho capito nulla, quale .cpp e .h devo usare?

Visto che non ho la funzione 'delay()' del core arduino dovrò aggiungerla, è fattibile?

All'interno dello stesso progetto vbe_scheduler.pro, posso creare altri sottoprogetti, questi possono essere applicazioni o librerie, sia C (cioè usa gcc per compilare che per linkare) o C++ (cioè usa gcc per compilare e g++ per linkare).
Significa che posso creare più versioni di libreria/applicazione personalizzando il build fino nei minimi dettagli.

Ciao, ti seguo.

 
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 23, 2015, 11:56 am
@maurotec, puoi usare lo scheduler che ha messo @testato in formato .zip, quello scheduler non dovrebbe aver bisogno di niente in particolare.
Fai riferimento al link del messaggio #135 che praticamente è l'articolo 1.0
Praticamente è simile allo scheduler ufficiale ma con molte piu funzionalità.

a seguire(non ancora finito) verrà l'articolo 1.1 che parla del porting dello scheduler ufficiale sulla UNO, dato che il Natale incombe  ho postato il codice e come installarlo, ma questo discorso è valido solo per l'IDE arduino ed il suo framework, se tu non lo usi non ha senso tentare di usarlo.

Infine l'articolo 2.0 parlerà dello scheduler preemptive e anche questo potrai usarlo anche senza il core arduino.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 23, 2015, 06:12 pm
extern C serve per la decorazione dei nomi, ma se lo richiami fuori da una classe è indifferente.
Per decorazione intendi la colorazione automatica dei metodi ?
Su arduino non è solo questione di colori, ma se non si dichiara extern C non viene compilato il codice, è obbligatorio usarlo se si vogliono usare file con estensione .c
Quello che non ho mai capito è se il codice compilato di un .cpp o di un .c è comunque identico o la toolchain li tratta diversamente

Comunque con .cpp non ci sono problemi quindi vada per .h+.cpp

(Che poi, approfittando ed andando OT, ho letto che c'è un filone di programmatori che considera moderno e giusto usare solo .h, integrando tutto il codice in un solo file, voi che ne pensate ?)

Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 23, 2015, 06:34 pm
quando tu crei una funzione il compilatore gli cambia il nome, ad esempio l'overload delle funzioni nel C++ potrebbe assumere questa forma:
Code: [Select]

void ciao(int)
void ciao(long)

diventa in Assembly

ciao_int
ciao_long

quella è la decorazione dei nomi e differisce tra C e il CPP come tra qualsiasi altro linguaggio.
Naturalmente il mio era un esempio, nella realtà vengono decorati in maniera diversa.

Integrare in un solo file è roba solo da plus plus, i puristi del C lo evitano come la peste.


Provato il porting?
Title: Re: Scheduler ufficiale
Post by: Maurotec on Dec 24, 2015, 12:12 am
Quote
Per decorazione intendi la colorazione automatica dei metodi ?
Java e solo Java ti fanno male, scendi a perlustrare i sottofondi del compilatore C/C++, si scoprono cose interessanti e si evita di prendere fischi per fiaschi.  :smiley-mr-green:

Quote
Su arduino non è solo questione di colori, ma se non si dichiara extern C non viene compilato il codice, è obbligatorio usarlo se si vogliono usare file con estensione .c
extern C la usato proprio per risolvere il problema, tra l'altro così lo si può usare con il linker C e con il linker g++.

@vbextreme
Quella del plexiglass l'ho trovata divertente, chissà cosa pensa la gente. Il plexiglass non mi fa effetto, ma inox, allumino e legno di ulivo li trovo molto attraenti.

Comunque ritornando allo scheduler, ho compilato, fornendo una millis() vuota, per fare un testo occorre riempirla, due sono le possibilità:
    1 ) Ho già codice pronto che usa il timer 0 nel modo tradizionale, va in overflow salta alla ISR e una variabile da 32bit
         viene incrementa, quindi copio ed incollo.
    2 ) Di recente i timer sono la mia ossessione, ciò ha però prodotto un risultato, leggendo scopro come il timer da 8
         bit può essere esteso facilmente a 16 bit (e forse anche a 24,32 ecc), grazie al flag di overflow che può essere usato
         come riporto, forse forse la millis() fa uso di questo flag. Non so che vantaggio ne posso trarre.

Quindi cosa scrivo dentro la millis() e come incremento il contatore, modo (1) o (2)?

Ho inserito rapidamente anche i commenti in stile doxygen e ricavato la doc html, da sistemare, ma sinceramente
non avrei saputo cosa scrivere nella pagina principale. Devo ancora commentare le struct e i loro membri, dovrei anche
dividere la doc usando \internal dove serve, ma per il momento mi devo dedicare ad altro.

PS: Io penso che se avessi maggiore tempo da dedicare per rivedere gli errori ortografici e migliorare l'esposizione,
       non ti vedo male come giornalista. Mi sa però che fatichi di più a scrivere l'articolo, che il codice sorgente.

Ciao.
       
     
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 24, 2015, 05:40 am
Quote from: @MauroTec
Mi sa però che fatichi di più a scrivere l'articolo, che il codice sorgente.
Avevo 4 in italiano, inutile dirlo, ve ne siete accorti tutti.

Quote from: @MauroTec
Quella del plexiglass l'ho trovata divertente, chissà cosa pensa la gente. Il plexiglass non mi fa effetto, ma inox, allumino e legno di ulivo li trovo molto attraenti
Il plexiglass è facile da modellare e costa relativamente poco, il legno è pesante e forse un pò troppo vintage, infine il metallo costa un botto.


usa un timer e con l'overflow ricavati all'incirca i millisecondi, altrimenti usa il timer1 lo imposti con il divisore a 8 e hai TCNT1 con risoluzione di 0.5us, vorrà dire che : microsecodi == TCNT1 / 2;
quindi ti fai una macro
Code: [Select]

#define Micros() (TCNT1 >> 1)

Togli milis() e ci metti Micros(), ma attento che non puoi superare i 32 millisecondi di ritardo tra tutti i task.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 24, 2015, 07:55 am
Sistemato un pò il sito vbextreme (http://vbextreme.netai.net/) ora il codice dovrebbe funzionare.
messo anche kla registrazione in modo che possiate lasciare commenti.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 24, 2015, 08:08 am
Grazie, non avevo mai sentito della decorazione  :)
Approfondiro'

Appena trovo un attimo provo la seconda versione
Title: Re: Scheduler ufficiale
Post by: testato on Dec 24, 2015, 04:55 pm
OHH YEHAAA  :)

Complimenti, va che e' una bellezza e non usa nemmeno chissa' quali risorse:
- 3682 B di Flash
- 248B di Ram

Ma questo perche' c'e' la seriale, senza seriale sono:

2304 B di Flash
25 B di RAM

per il discorso Bug del delay mi sembrano molto propensi a integrarlo, ti hanno chiesto la pull request (in genere vedo che su GitHub preferiscono che la fa l'autore della modifica e non loro stessi), se non hai tempo posso farla io (specificando che e' a tuo nome  ;) )


Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 24, 2015, 06:00 pm
@testato ho chiesto conferma e hanno ribattuto, aspetto dopo le feste e provo con il pull.
grazie per la conferma che funziona. visto che ho modificato il sito, in particolare il codice?
Title: Re: Scheduler ufficiale
Post by: testato on Dec 24, 2015, 06:46 pm
non so se si e' capito, ma io intendo che funziona il Porting dello scheduler della Due  ;)
Sara' la nuova funzione piu' importante sugli AVR da anni a questa parte.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 24, 2015, 07:17 pm
@testato di scheduler per avr ne esistono a trilioni.
Più che altro adesso c'è l'ufficiale per Arduino UNO, che in realtà usa un trucco per non sovraccaricare il piccolo chip.
@Testato buon natale!
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 24, 2015, 07:24 pm
@Testato appena finisco questo immenso progetto prometto di creare una funzione chiamata delayAsync() in modo che non dobbiamo più rispondere all'ennesimo thread sulla millis()...........
Title: Re: Scheduler ufficiale
Post by: testato on Dec 24, 2015, 07:24 pm
si intendevo la novita' sul core arduinico degli AVR  :)

Da anni chiedo una Delay2, con lo scheduler ed una delay non delay si smaltisce il 70% delle richieste

Grazie, Buon Natale a te ed a tutto il Forum
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 26, 2015, 09:23 am
Articolo completo (http://vbextreme.netai.net/2015/12/26/embedded-arduino-scheduler-patre-1-1/) che riguarda il porting
Title: Re: Scheduler ufficiale
Post by: nid69ita on Dec 26, 2015, 10:44 am
Articolo completo (http://vbextreme.netai.net/2015/12/26/embedded-arduino-scheduler-patre-1-1/) che riguarda il porting
Grazie mille.  :)

P.S. nel titolo sul tuo sito hai scritto "Patre 1.1" invece di "Parte"
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 26, 2015, 12:57 pm
mha! è la seconda volta! XD!
grazie per la segnalazione
Title: Re: Scheduler ufficiale
Post by: testato on Dec 26, 2015, 03:33 pm
Eccelso  :)

Puoi aggiungere all'articolo, oppure solo qui, qualche parola su yield() ?
L'ultima volta che guardai nel core era solo una funzione vuota.

p.s. perché si chiama proprio yield() ?
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 09:40 am
@Testato nel core Arduino la yield() è fatta puntare ad una funzione vuota, almeno che qualcun'altro non la definisce.
Quindi quando si va a caricare il codice dello scheduler si userà in automatico la funzione yield dichiarata in scheduler.cpp.

La funzione yield() cerca se c'è un task in attesa e in tal caso gli passa l'esecuzione. "yield" dovrebbe significare "dare", "to yield" "cedere".
Comunque non bisogna dare troppo peso ai nomi.
Title: Re: Scheduler ufficiale
Post by: SukkoPera on Dec 27, 2015, 12:01 pm
"Yield" è il verbo che si usa per il "dare la precedenza" in macchina. Qua il concetto è lo stesso, in fondo!

E poi è il nome "standard" per questa operazione, tutte le librerie di threading che mi vengono in mente al momento hanno la funzione yield(): da pthreads a Python a Java!
Title: Re: Scheduler ufficiale
Post by: testato on Dec 27, 2015, 01:26 pm
grazie ora mi e' piu' chiaro

Code: [Select]
void yield(void) {
    //usiamo il nostro scheduler
    #ifndef __AVR_ATmega328P__
coopDoYield(cur);
    #else // is UNO
ecc.ecc


p.s. i nomi quando scelti correttamente aiutano, non conoscevo il significato in inglese di Yield

Title: Re: Scheduler ufficiale
Post by: nid69ita on Dec 27, 2015, 01:49 pm
Solo a titolo informativo, scaricando la libreria Scheduler con ide 1.6.7 da menu apposito di gestione librerie, ho visto anche questa, fresca di versione 2.0 (installata da zip, da gestore non va):
http://playground.arduino.cc/Code/TaskScheduler
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 03:09 pm
@nid69ita ma non è compatibile con quello ufficiale, in piu quella soffre del bug del delay e infatti scrive:
Quote
a) DO NOT use Arduino's delay() function. It is blocking and will hold the entire chain. Instead break the callback method into two, switch the callback method of the task where delay is necessary and delay the task by that number of millis. You get your delay, and other tasks get a chance to run:
Invece tutto lo scheduler di cui parlo nell'articolo 1.1 è solo ed esclusivamente il porting di quello ufficiale, in piu sto cercando di far applicare il fix per la funzione delay.

Title: Re: Scheduler ufficiale
Post by: testato on Dec 27, 2015, 03:42 pm
Il lavoro di VB andra ad aggiornare lo scheduler ufficiale, è molto meglio di una lib a parte che effettivamente esistono da tempo.
È un lavoro che avrebbe dovuto fare da tempo il team stesso.



Title: Re: Scheduler ufficiale
Post by: testato on Dec 27, 2015, 03:58 pm
VB hai problemi a fare la pullrequest per il bug su delay? Lo chiedo perche forse non vi state capendo su github, loro aspettano la PR per fare il merge (non puoi farla tu direttamente)

Basta un copiaincolla di un minuto perche puoi fare la PR direttamente online senza passare da git
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 04:11 pm
@testato ho litigato con "git rebase" e "git fetch", mi sbagliava tutto! ho poi cancellato il core e dopo un pull è tornato tutto a funzionare come doveva, ma nel frattempo si era chiuso il vecchio pull request e ne ho aperto uno nuovo dove viene rispettato ciò che richiedono.
fix delay/yield avr (https://github.com/arduino/Arduino/pull/4349)

Come si fa dal sito a fare la PR?
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 04:16 pm
@testato tu che ne sai di piu come procedo per inviare lo scheduler?
a chi lo faccio il pull request?
Title: Re: Scheduler ufficiale
Post by: testato on Dec 27, 2015, 05:56 pm
quando fai piccole correzioni, specialmente se ad un solo file come nel caso del delay, la cosa piu' smeplice e' fare tutto dal sito stesso, si va sul file da modificare si fanno le modifiche e ti si accende un tastone verde per fare la pull request. Automaticamente viene creato un branch sul tuo profilo, chiamato patch-1 e viene sottoposto come pullrequest.

E' utilissimo anche quando trovi errori di documentazione che quindi trovi mentre leggi online, in quel caso se non ci fosse questa funzione sarestri constretto a fare il clone del rpogetto, ecc ecc, cosa che difficilmente uno si mette a fare per un banale errore di battitura. INvece visto che puoi fare questa specie di editing in stile wikipedia, rapida ed online, allora magari ti vien voglia di sergnalare anche le piccole cose.

Quando la tua PullREquest viene mergiata dall'autore originale ti viene detto che puoi cancellare il tuo branch temporaneo e lo fai con un altro bel tastone verde.


Quindi con lo scheduler stesso discorso, cioe' se sara' un solo file ad essere modificato, tipo solo scheduler.cpp, allora puoi fare tutto online, se invece hai da cambiare piu' di un file procedi regolarmente dal tuo pc via GIT

Per lo scheduler il team ha un repo a parte per le librerie ufficiali, quindi ti basta fare la PR su questa:
https://github.com/arduino-libraries/Scheduler



Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 06:22 pm
Grazie @testato... magari la prossima volta farò proprio cosi... :smiley-mr-green:
Comunque è li in attesa di merge.....

Adesso vado a spulciare lo scheduler e vedo che aria tira.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 06:59 pm
aria silente....sono pronto con il pull, appena approvano la delay() parto all'attacco con il porting.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 27, 2015, 10:05 pm
Considera che saranno, giustamente, in ferie. Credo che è cristian a dover mergiare, ed è stato gia chiamato in causa ☺
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 27, 2015, 10:19 pm
più che altro 0 issues e 0  pull request....
se cristian si deve occupare solo di quello è in vacanza perenne.....buahahaha.... almeno posso parlare in italiano, ho sudato freddo causa il mio pessimo inglese.
Title: Re: Scheduler ufficiale
Post by: zoomx on Dec 28, 2015, 07:47 am
vbextreme,

grazie per il lavoro svolto. Nonostante sia morto di sonno sono pressoché riuscito a capire quasi tutto.
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 28, 2015, 06:22 pm
@testato mi ha ricordato di una limitazione dello scheduler, dato che lo scheduler non implementa un vero context switch succede che se un task è in esecuzione e avviene una yield il task rimarrà bloccato fino a che il task chiamato non termina.
esempio task1 chiama delay(100), avviene una yield su task2 e anche lei chiama delay(100), a questo punto la yield non ha le capacità di ridare la palla a task1 pertantanto rimane in attesa ed esce, a questo punto riprende task1 ma il delay avrà atteso 200ms e non 100.
Questa limitazione offre il vantaggio di usare pochissima memoria sram e non limita lo stack di un processo.

Ora il dilemma è se modificare lo scheduler per essere identico a quello della due, in questo caso dovrei creare uno stack per ogni task e ricreare un vero context switch.
Assegnare una porzione a solo un task significa rubarla ad un'altro che non potrà più usare, facendo una botta di conti serve almeno 36byte di memoria solo per il context switch in più un pò per gestire il task, diciamo 250byte quindi si potrebbero avere solo 8 task in esecuzione "normalmente".

Cosa proponente?
Title: Re: Scheduler ufficiale
Post by: testato on Dec 29, 2015, 12:37 am
Cosi come è si comporta in modo semirandomico, come hai visto col mio esempio sembra saltuario, il che ti manda fuori strada se ad esempio stai scrivendo un programma e improvvisamente sembra che si blocca per chissa quale motivo.

Non dimentichiamo che abbiamo gia il limite del loop che non si comporta uguale ai loop_x

Questa modifica renderebbe "normale" anche il loop() ?
Title: Re: Scheduler ufficiale
Post by: nid69ita on Dec 29, 2015, 03:24 pm
Secondo me non è un limite avere solo 8 task.
Però sarebbe possibile avere qualcosa tipo una #define da qualche parte per avere o non avere questo content switch, così da disabilitarlo e quindi avere il possibile problema ma meno uso di memoria ?
Title: Re: Scheduler ufficiale
Post by: zoomx on Dec 29, 2015, 07:47 pm
Quoto anche io, probabilmente è meglio avere entrambe le possibilità.

Piuttosto
Quote
* avr: fixed yield() usage inside delay(). Thanks @vbextreme
nel nuovo IDE 1.6.8
Title: Re: Scheduler ufficiale
Post by: testato on Dec 29, 2015, 10:28 pm
complimenti VB per la menzione ufficiale  :)

Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 30, 2015, 02:07 am
grazie,  :-[

sto cercando di implementare lo scheduler identico a quello della DUE, solo che ho un problema XD

Ho scritto qui (http://forum.ubuntu-it.org/viewtopic.php?f=33&t=606095) perchè ogni tanto passa un talento dell'assembly, speriamo che legga, magari se passa anche @astrobeed..................
adesso vado a letto che mi bruciano gli occhi....
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 30, 2015, 08:07 pm
quel problema è risolto.
Ora manca risolvere l'ultimo problemino ed è finito, adesso ho testato il salvataggio dello stack ed il contest switch, ma funziona parzialmente, quando vado a ritornare crasha.
Appena trovo il bug è completo, almeno spero.
Title: Re: Scheduler ufficiale
Post by: ibbba on Dec 30, 2015, 08:31 pm
ottimo lavoro veramente...
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 30, 2015, 09:24 pm
grazie, bug trovato, ora manca solo il tempo....
nel frattempo vi posto l'output su cui sto lavorando:
Code: [Select]


wait a key to start
loop=162
loop1=136
startLoop():
startLoop(): coopTaskStart=284
startLoop(): startLoopHelper=450
coopSpawn():
coopSpawn(): alloc stack=250
coopSpawn(): endpp stack=877
coopSpawn(): start stack=1126
coopSpawn(): NO EM0
coopSpawn(): NO EM1
loop
yield(): start
printv(): v=0
coopSchedule():
coopSchedule(): taskdied=0
coopSchedule(): current task
coopSchedule(): cur=861
coopSchedule(): sp=2252
coopSchedule(): pc=350
coopSchedule(): data=0
coopSchedule(): task=0
coopSchedule(): next task
coopSchedule(): sp=1126
coopSchedule(): pc=284
coopSchedule(): data=136
coopSchedule(): task=450
startLoopHelper():
startLoopHelper(): slhTask =136
startLoopHelper(): while(true)
loop1
yield(): start
printv(): v=0
coopSchedule():
coopSchedule(): taskdied=0
coopSchedule(): current task
coopSchedule(): cur=1129
coopSchedule(): sp=1071
coopSchedule(): pc=350
coopSchedule(): data=136
coopSchedule(): task=450
coopSchedule(): next task
coopSchedule(): sp=2252
coopSchedule(): pc=350
coopSchedule(): data=0
coopSchedule(): task=0
printv(): v=93
printv(): v=5
printv(): v=7
yield(): return
loop
yield(): start
printv(): v=0
coopSchedule():
coopSchedule(): taskdied=0
coopSchedule(): current task
coopSchedule(): cur=861
coopSchedule(): sp=2252
coopSchedule(): pc=350
coopSchedule(): data=0
coopSchedule(): task=0

wait a key to start


questo
Code: [Select]

yield(): return

era quello che mancava, ora devo sistemarlo.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 30, 2015, 11:44 pm
ma la parte in assembly e' obbligatoria ? non basta il C ?

Lascio i motori accesi per i test  :)

Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 31, 2015, 12:04 am
no, dal C non puoi fare il context switch.
Per farlo devi:
salvare i registri
salvare lo stack
caricare il nuovo stack
caricare i nuovi registri

poi devi metterci tutto il contorno e integrarlo in un codice pensato per ARM, quindi calcolatrice alla mano ricalcolare i vari offset per la icall e per il riposizionamento del nuovo stack allocato nella malloc.
Insomma io l'avrei fatto decisamente più semplice e senza nemmeno usare la malloc che è inutile per questo contesto, dato che si sa a priori il numero dei task.
vabbhe.

Se era solo C a questo punto avrei già finito, ma non sono una cima in assembly e riuscire a infilare la dentro l'avr è ben sopra alle mie capacità, ma un passo alla volta sto sbrogliando la matassa.

Quasi dimenticavo, alla fine andrà anche ripulito, nella directory src ho più di 10 file tra header, .cpp, e disassemblamenti vari per vedere come mi ottimizza il codice GCC.
Insomma è un bel lavorone...
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 31, 2015, 09:15 am
@Testato hai ancora la macchina calda?

La beta2 è pronta!!!
Ho lasciato la dimensione dello stack a 250byte cosi possono partire 6 loop oltre al loop di default che in totale diventano 7 task massimi che si possono avere in esecuzione contemporaneamente.

Potrebbero esserci ancora dei problemi perchè devo sistemare ancora due o tre cosucce, infine manca di ripulire il codice.
In allegato trovate lo scheduler, testatelo e fatemi sapere cosa accade.
Lasciate il Serial Monitor Aperto cosi vedete se finite la memoria, ho lasciato quel messaggio solo per adesso, quindi assicuratevi che nel Setup ci sia il Serial.begin(), poi conclusi i test lo levo.


Buona Fine e Buon Inizio
Title: Re: Scheduler ufficiale
Post by: nid69ita on Dec 31, 2015, 10:14 am
Avviato il test ore 10:11 minuti, per ora non ha esaurito la SRAM  :)
Lo lascio li qualche ora per testare ?
Ore 10:35 ancora gira
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 31, 2015, 10:45 am
sketch usato per il test?
Comunque puoi fermarlo gia dopo 5/10 minuti.

Sono molto contento! grazie!
Title: Re: Scheduler ufficiale
Post by: nid69ita on Dec 31, 2015, 12:18 pm
Il multipleblinks con i 3 led collegati. Spento ora alla 12:15 dopo quasi 2 ore
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 31, 2015, 12:37 pm
GRANDE!
@testato, prova il tuo sketch.
Title: Re: Scheduler ufficiale
Post by: testato on Dec 31, 2015, 06:06 pm
Scusa sono stato finora appresso ad un mio progetto.
Ora è tardi, mi aspetta lo zampone, se ne parla domani.

Buon anno a tutti  :)

Title: Re: Scheduler ufficiale
Post by: nid69ita on Dec 31, 2015, 06:15 pm
Ora è tardi, mi aspetta lo zampone, se ne parla domani.
Ne parliamo ... il prossimo anno  :smiley-mr-green:
Title: Re: Scheduler ufficiale
Post by: vbextreme on Dec 31, 2015, 06:26 pm
al prossimo anno!!!! buon zampone a tutti e mangiate tante lenticchie!
Title: Re: Scheduler ufficiale
Post by: testato on Jan 01, 2016, 05:03 pm
O cavolo.... sembra che funziona  :)

Allego qui il mio esempio che prima dava problemi per chi vuole rpovare anche questo,
ora te lo PullRequesto in modo da tenerlo nella lib ufficiale quando sara' mergiata.
Lo divido in piu' Tab in modo da rafforzare il concetto

Code: [Select]
/*
 Multiple PWM

 Demonstrates the use of the Scheduler library

 Hardware required :
 * LEDs connected to pins 10 and 11 for the UNO board (on other board change the pwm pins)

 created 28 Dic 2015
 by Testato
 
*/


// Include Scheduler since we want to manage multiple tasks.
#include <Scheduler.h>

byte counter1;
byte counter2;
byte led1 = 10;
byte led2 = 11;


void setup() {

  // Setup the two led pins as OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  // Add "loop2 and loop3" to scheduler
  // "loop" is always started by default
  Scheduler.startLoop(loop2);
  Scheduler.startLoop(loop3);
}


// Task no.1 (standard Arduino loop() )
void loop() {
  yield();
}


// Task no.2
void loop2 () {
 analogWrite(led1, counter1);
 counter1 += 50;

  // When multiple tasks are running, 'delay' passes control to
  // other tasks while waiting and guarantees they get executed
  // It is not necessary to call yield() when using delay()
  delay(1000);
}


// Task no.3
void loop3 () {
 analogWrite(led2, counter2);
 counter2++;
 delay(7);
}
Title: Re: Scheduler ufficiale
Post by: nid69ita on Jan 01, 2016, 05:19 pm

Code: [Select]
const byte led1 = 10;

 ;)
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 01, 2016, 06:16 pm
@testato, fa lavorare anche il loop().

Devo ancora ottimizzarlo, adesso vengono salvati tutti i 31 registri ma se non ho capito male la documentazione posso salvarne solo la metà, con incremento prestazionale e riduzione di memoria usata.
Ora l'unica differenza tra lo scheduler Avr e quello ARM è dove vengono salvati i registri.
Nel ARM si creano due strutture distinte, la prima contiene le info del task + i registri, la seconda area di memoria lo stack.
nel Avr invece i registri tranne l'sp vengono salvati nello stack riducendo così la dimensione della struttura "info".
In questo modo si avrà più memoria disponibile, come contro adesso serve uno stack libero di almeno 40byte per poter eseguire la yield, se invece ho intuito bene potrebbero bastare solo 20byte.
Nei prossimi giorni provo a contattare un amico esperto di Assembly, per vedere se la mia teoria è giusta.
Scriverò in seguito un articolo che spieghi bene il tutto.

Buon inizio!!!!!! a tutti!!!!!
Title: Re: Scheduler ufficiale
Post by: testato on Jan 01, 2016, 09:01 pm
Code: [Select]
const byte led1 = 10;

 ;)
a questo punto:
Code: [Select]
#define LED1 10
:)
Title: Re: Scheduler ufficiale
Post by: testato on Jan 01, 2016, 09:24 pm
@testato, fa lavorare anche il loop().
ok, aggiunto classico blink sul loop rpincipale, sembra tutto ok

allego l'attuale versione su tre tab
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 04, 2016, 10:45 am
Ho parlato con il prof e mi ha consigliato di salvare sempre tutti i registri perchè in caso di un bug sarebbe difficilissimo capirlo.
Ho anche reso del tutto uguale i due scheduler, adesso anche quello dell'avr salva i registri in una struttura apposita, anche qui mi è stato consigliato, meglio sprecare qualcosina in piu ma migliorare la stabilita, questo è d'obbligo per arduino.
Per adesso ho lasciato solo la UNO, per la Mega e la Leonardo bisogna guardare bene il datasheet.

Quindi adesso siamo alla versione RC1, che trovate in allegato, se passa i vostri test faccio il pull request.
Title: Re: Scheduler ufficiale
Post by: steve-cr on Jan 05, 2016, 03:43 pm
Ma voi siete dei miti !!!  :)
Good job!

e a che serve uno scheduler in un arduino???

Certo che per uno che all'inizio scriveva così......
Title: Re: Scheduler ufficiale
Post by: testato on Jan 05, 2016, 04:26 pm
per me va, e' accesa con il multiplepwm da 1 giorno  ;)

p.s. non stai aggiornando il tuo repo su github ?
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 05, 2016, 08:05 pm
no non sto aggiornando niente, domani riallineo tutto(spero, se ho un briciolo di tempo).
@Testato a proposito, nella mia directory ho gia tutto pronto, cosa faccio? una pull cosi ho anche il tuo codice e poi faccio la push?
Ho cambiato anche il file "library.property" e il "Read Me", è corretto?
Title: Re: Scheduler ufficiale
Post by: testato on Jan 05, 2016, 08:40 pm
Si puoi fare cosi, oppure puoi mergiare la pull request direttamente online.
Sia prima che dopo il tuo commit, le pull request restano sempre aperte finche non le gestisci, quindi non c'è rischio di perderle
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 05, 2016, 09:14 pm
si ma se faccio il merge dopo non viene inserita nell'ufficiale giusto?
quindi io domani faccio il merge e poi il push, ahahah sarà il primo pull request della libreria...ricordo che ha 0 issues e 0 pull, ma viene usata?
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 06, 2016, 06:43 am
pull request effettuata.
Title: Re: Scheduler ufficiale
Post by: testato on Jan 06, 2016, 05:45 pm
Non ho capito.
Se fainil merge della mia PR sul tuo repo, poi quando la tua PR sarà mergiata ci sarà anche il mio codice.
La cosa funziona anche con tempi diversi, cioè se tu fai la tua PR, nel frattempo che non viene mergiata puoi continuare a fare commit ed accettare PR, esse saranno accodate alla tua PR

Quindi se tu mergi la mia PR dopo aver creato la tua PR, ma prima che la tua PR viene mergiata, il mio codice verrà ugualmente integrato.
Questo serve perché in questo modo puoi aggiungere lavoro, correzioni, ecc a PR prima che vengano mergiate.

Infatti quando online modifichi un file github ti chiede se quella modifica vuoi che venga legata alla PR già presente.

Non so se intendevi questo  :)


Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 06, 2016, 06:09 pm
ok, grazie testato, ti ho risposto sul PR.

Ma non risponde nessuno sullo scheduler?
Dici che bisogna bussare ad Arduino/Arduino?
Title: Re: Scheduler ufficiale
Post by: testato on Jan 07, 2016, 12:59 am
e' roba troppo ad alto livello, saranno impauriti dall'assembly  :)
Aspettiamo un paio di giorni.
C'e' da dire che forse puo' frenare il fatto che sia solo per il 328, ma che cavolo, e' un lavoro eccezionale e grosso, devono accettarlo al volo. Si dovra' anche cambiare la documentazione sul reference per die che e' incluso il 328
Nel frattempo mergia la mia PR, magari e' una pedina in piu' dargli in pasto un nuovo esempio
Title: Re: Scheduler ufficiale
Post by: vbextreme on Jan 07, 2016, 12:14 pm
@testato, per adesso è solo per la 328 poi chissà.
Questa però non può essere una scusa per non rispondere!
Ho aperto un issues  (https://github.com/arduino/Arduino/issues/4398) ed è stato immediatamente chiuso.
Vediamo un pò adesso se rispondono, anche un solo no grazie.
Title: Re: Scheduler ufficiale
Post by: testato on Jan 07, 2016, 08:14 pm
col mio ultimo esempio, che allego per chi vuole provare, ho notato un altra cosa, dopo un po di tempo la sequenzalieta' cambia tempistiche, cioe mentre allinizio i tre led si accendono correttamente poi pian piano shiftano i tempi l'un l'altro.
E' normale ?

Title: Re: Scheduler ufficiale
Post by: vbextreme on Feb 05, 2016, 03:26 pm
Per chi volesse seguire meglio Scheduler ufficiale (http://forum.arduino.cc/index.php?topic=371628.new#new) era nato per ricercare tester.

Comunque nuova release con memoria statica, mutex, semafori, priorità, possibilità di fermare o riprendere l'esecuzione di un task.
Tanti esempi, non fatevi mancare il ServoWithoutTimer :)