Go Down

Topic: ArduinoDue Scheduler (Read 945 times) previous topic - next topic

kattivik76

Ciao a tutti,

ho inserito la libreria http://arduino.cc/en/Reference/Scheduler nel mio progetto,
ma non ho capito come interagisce con il loop (main) e gli altri task.

ho notato che se eseguo un programma con un banale delay(xxx); contenuto in un task chiamato loop2(); arduino si blocca o si resetta...
inoltre non mi è chiaro cosa serva l'istruzione yield();

passa il controllo ad un altro task, ma il task corrente rimane in esecuzione o si interrompe?

la gestione dei task mi server per poter visualizzare in tempo reale su un display la posizione corrente, la posizione richiesta e la velocità di movimentazione di un motore stepper, e visto che il comando del motore per la gestione del BigEasyDriver avvieme mediante ciclo do{} non posso gestire il display nello stesso task in quanto esso è come se si "bloccasse" fino al termine del posizionamento del motore.

la struttura che vorrei realizzare è la seguente:

task loop() lanciato di default e contenente il parse gcode e la gestione del motore (questo task contiente il ciclo do{})
task display(); per la gestione del display e la selezione delle informazioni da visualizzare in base ai modi di funzionamento
task mode(); gestisce i modi di funzionamento e gli I/O verso led di segnalazione, pulsanti vari e selettori

spero che qualcuno mi possa spiegare meglio ;)

grazie

saluti
kattivik76
kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

leo72

Lo scheduler inserito nell'Arduino Due è di tipo cooperativo, significa che il SO non esegue nessun controllo sulla durata di un task ed il passaggio da un task all'altro è lasciato al programmatore.

Lo scheduler della Due si basa su un delay modificato, che freeza un task e passa al successivo, in modo che durante l'attesa del task il SO esegua altri task.
Se un task non deve attendere, allora deve usare il meccanismo yield() che informa lo scheduler di controllare gli altri task.

Guarda l'esempio MultiBlink:
http://arduino.cc/en/Tutorial/MultipleBlinks

Nel loop c'è un delay. In realtà quel delay è modificato affinché sia controllato lo scheduler per vedere se ci sono task da eseguire. Loop2 è un task, al cui interno ci sono 2 delay per alternare un led. Se delay funzionasse alla vecchia maniera, il codice rimarrebbe bloccato. Invece, mentre pensi che sia eseguito un delay, lo scheduler va al task successivo, loop3.
Questo viene eseguito di getto e siccome non deve aspettare nulla, usa yield per rendere il controllo allo scheduler, a differenze di loop e loop2 che passano inconsciamente il controllo proprio col delay.

kattivik76

grazie Leo,

quindi se non ho capito male:

mettiamo che io abbia 5 task,

loop();  //contiene dei delay per gli impulsi dello stepper
task02(); contiene dei delay per il display
task03(); nessun delay, solo stati logici
task04(); nessun delay, solo stati logici
task05(); contiene dei delay

in questo caso, l'istruzione yield(); va messa soltanto in task03(); e task04(); giusto?

grazie
saluti

kattivik76
kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

leo72

Sì, dovrebbe andare così.

kattivik76

grazie Leo,

quindi sarebbe plausibile il fatto che mi si resetti o si blocchi arduinodue in caso di posizionamento errato di yield();?

stasera ci riprovo :)

grazie :)

kattivik76
kattivik76
Sviluppo e realizzazione  Progetti Arduino
Teamspeack -> Arduino.cc -> 79.38.142.178:9987

Go Up