[Risolto] Background su leonardo

Ciao a tutti, premetto che non sono un gran programmatore di C ma me la cavo piuttosto bene col VB.NET.
Ho fatto un programma per il mio Arduino per comandare tre motori stepper per una mini cnc 3 assi e il sistema funziona abbastanza bene, per spiegare il tutto in poche righe ho 5 stringhe nelle quali memorizzo i miei comandi iso e mammano che le righe vengono eseguite in seriale passo le righe nuove, uso quindi queste stringhe come una sorta di “buffer”.
Ovviamente dalle stringhe di comando devo estrarre le coordinate ed elaborarle per poterle eseguire, appena ho finito la stringa attuale elaboro quella nuova e così via…
Vorrei se possibile poter fare questa elaborazione in background in modo da non interrompere per alcuni millisecondi l’esecuzione dell’iso, è possibile? cercando un po in rete ho letto qualcosa su il sistema (RTOS) ma non ho trovato nulla che spieghi da zero e in modo semplice la cosa.

A te servirebbe un sistema multithreading che, su questo genere di microcontrollori, NON esiste. Un sistema multithreading contiene CPU con più core oppure con un solo core ma con più pipeline interne, una cosa cioè capace di eseguire più di un flusso di istruzioni alla volta. Sui micro ad 8 bit tipo quelli montati sulla tua Leonardo non si hanno né più core né più pipeline quindi solo 1 flusso di istruzioni alla volta. Quindi, se leggi la seriale, non puoi fare altro. Anche gli RTOS utilizzabili hanno questo limite, sono "sistemi operativi in tempo reale", nel senso che rispondono immediatamente ad un input, ma non possono eseguire più compiti contemporaneamente: anche i loro scheduler, infatti, altro non fanno che switchare continuamente da un task all'altro.

Detto questo.. tu che esigenze hai? Hai bisogno realmente di un sistema che non interrompa mai l'esecuzione del codice principale, neanche per leggere il buffer seriale? Buffer che, ti ricordo, viene riempito in automatico dalla periferica seriale, che lavora in modo indipendente dalla CPU.

Non ho alcuna esigenza in particolare perchè per come ho strutturato il programma l'elaborazione della stringa "spende" circa 1/2 millisecondi quindi non comporta ritardi di grossa incidenza anzi ci può stare senza alcun problema solo se era possibile lo avrei fatto in multithread, sarebbe stato molto più fico ed elegante e poi per come sono fatto io cerco sempre di migliorare i miei programmi anche quando vanno già bene ed inoltre sarebbe stata l'occasione buona per imparare qualcosa di nuovo ed interessante per altre applicazioni future. Nella gamma Arduino non esiste nessun modello in grado di gestire il multithread?

Arduino non fornisce un sistema di scheduling dei task. Esistono alternative più o meno complesse, dagli scheduler base come ad esempio il mio looper, che richiama alla fine del loop() uno scheduler che altro non fa che richiamare a sua volta delle funzioni ad intervalli regolari, al leOS, altro mio scheduler questa volta basato sui timer, fino ad arrivare a prodotti molto più complessi, RTOS veri e propri. E qui non hai che da sbizzarrirti: si va dai prodotti amatoriali tipo Scoop e simili passando per prodotti semi-professionali tipo NilRTOS o FreeRTOS per arrivare a prodotti commerciali .

(per le mie soluzioni, trovi il link al mio sito in calce, ti scarichi i prodotti e trovi la documentazione ed alcuni esempi di codice)

ok grazie mille delle info se in futuro ne avrò davvero bisogno vedrò di approfondire la cosa.