Scheduler ufficiale

al prossimo anno!!!! buon zampone a tutti e mangiate tante lenticchie!

O cavolo.... sembra che funziona :slight_smile:

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

/*
 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);
}
const byte led1 = 10;

:wink:

@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!!!!!

nid69ita:

const byte led1 = 10;

:wink:

a questo punto:

#define LED1 10

:slight_smile:

vbextreme:
@testato, fa lavorare anche il loop().

ok, aggiunto classico blink sul loop rpincipale, sembra tutto ok

allego l'attuale versione su tre tab

MultiplePWM.zip (1.31 KB)

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.

SchedulerRC1.zip (7.3 KB)

Ma voi siete dei miti !!! :slight_smile:
Good job!

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

Certo che per uno che all'inizio scriveva così......

per me va, e' accesa con il multiplepwm da 1 giorno :wink:

p.s. non stai aggiornando il tuo repo su github ?

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?

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

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?

pull request effettuata.

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 :slight_smile:

ok, grazie testato, ti ho risposto sul PR.

Ma non risponde nessuno sullo scheduler?
Dici che bisogna bussare ad Arduino/Arduino?

e' roba troppo ad alto livello, saranno impauriti dall'assembly :slight_smile:
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

@testato, per adesso è solo per la 328 poi chissà.
Questa però non può essere una scusa per non rispondere!
Ho aperto un issues ed è stato immediatamente chiuso.
Vediamo un pò adesso se rispondono, anche un solo no grazie.

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 ?

MultipleSketch.zip (1.35 KB)

Per chi volesse seguire meglio Scheduler ufficiale 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 :slight_smile: