looper - un semplice schedulatore senza timer/interrupt

ma senza bloccare ad esempio gli interrupt

non tirare inmezzo gli interrupt, questa librerira NON li usa. ed è per questo che ha creato la cosa leo.

m = timer0_millis;

questa è l'unica iustruzione per cui gli interrupt sono bloccati, poi li riattiva con

SREG = oldSREG;

quindi parliamo di una decina di clock, 20 a star larghi direi, andando a naso.

La delayMicroseconds invece è fatta in maniera molto diversa

non hai timer così precisi, quindi si basa sul fatto che sa che ad una certa frequenza di clock certe istruzioni impiegano tot clock, e quindi tot clock * frequenza = tempo.... e tanta imprecisione :slight_smile:

potra' tecnicamente un domani esistere, creata dal team arduinico stesso ed integrato nel core, una newdelay(1000); che non sia bloccante ?

ni.
nel senso: la delay non bloccante come fa a sapere che codice deve eseguire al termine del 1000?
risposta: gli passi come parametro una funzione, che conterrà il codice da eseguire ogni tot.
e già esiste: looper(non usa interrupt quindi ogni tatnto devi chiamare scheduler(), meno preciso, ma permette funzioni lunghe) e leOS(interrupt, basta settare il dalay e la funzione ed eventualmente il tempo di ripetizione, ma essendo la funzione eseguita in interrupt ha i classici svantaggi)

Ora, tu dici creata dal team. io ti dico: perché la SoftSerial attuale è esterna, e poi integrata nel core perchè considerata "degno sostituto". Lo stesso POTREBBE avvenire con il leOS o lo sheduler.

senza dover includere librerie

Anche la delay che usi è una libreria.. solo che la include in automatico arduino IDE. Quindi si può fare, ma ci vuole una ottima ragione.

Quindi risposta generale:
NO: se non chiami sheduler (come leOS), allora sei bloccato dalle limitazioni interrupt. Se usi looper() e metti sheduler() nel main(nascosto) dell'arduino a fine di ogni loop ( come per SerialEvent() )se il tuo loop() è pieno di delay non avrai mai i task eseguiti con la giusta tempistica.
Quindi non esiste un testatoDelay() come lo intendi.. niente "silver bullet".
A meno che non si riesca a creare un VERO scheduler con due thread: uno per la loop e uno, con priorità superiore, per task schedulati, cche magari lancia ogni sotto-task in un thread a parte. Però a questo punto... che thread a precedenza sugli altri?