In uno schizzo di Arduino, c'è un modo per effettuare chiamate di funzione asincrone all'interno del loop? Come ascoltare le richieste tramite il server http ed elaborarle in modo non bloccante .
In uno schizzo di Arduino, c'è un modo per effettuare chiamate di funzione asincrone all'interno del loop? Come ascoltare le richieste tramite il server http ed elaborarle in modo non bloccante .
Risposte:
Sì e no. Sei un po 'vago su quello che vuoi fare. L'ho trasformato in alcune sezioni diverse (principalmente incentrato sulla lettura dei dati del sensore ... si applica a tutto ma questo è il contesto che sto usando):
AFAIK tutti gli Arduinos hanno un solo core (possono fare una cosa alla volta). Per la maggior parte delle schede Arduino, il multithreading hardware non è supportato. Tuttavia, ci sono modi per implementare il multithreading software . L'approccio di AsheeshR non funzionerebbe bene per il completamento di funzioni che richiedono molto tempo (ovvero qualcosa in una libreria che richiede un po 'di tempo o un ritardo) perché verrebbe bloccato da quelle istruzioni, ma funzionerebbe bene in breve funziona come pinMode()
. La libreria di Protothreads elencata potrebbe essere migliore in questo, ma non lo so davvero.
Sarebbe difficile orchestrarlo con HTTP, soprattutto perché devi farlo
Un modo comune per lo stallo di uno schizzo è l'uso di un ritardo. Questo può essere risolto usando, nel ciclo principale, un'istruzione if e la millis()
funzione che restituisce un tempo (non un tempo di clock, ma piuttosto il tempo dall'inizio di Arduino). È inoltre possibile eseguire un loop all'interno del loop per eseguire il polling dei dati del sensore.
L' millis()
approccio non funzionerebbe bene con le cose che causano lo stallo dell'intero programma (ovvero più ritardi o loop che durano una notevole quantità di tempo). Si noti che 100ms IIRC è il tempo massimo generale per rendere l'interfaccia utente non sgraziata.
Gli interrupt sono un ottimo modo per mantenere le cose quasi asincrone. Eseguono un breve codice (specificato dall'utente) ogni volta che cambia lo stato di un pin. Si interrompe da loop()
e ritorna da dove era stato interrotto una volta eseguito " ISR ". Non ho molto tempo per spiegare come farlo, ma una rapida ricerca su Google produrrà molti risultati.
Per quanto riguarda l'esempio, la sezione di threading sarebbe la più applicabile. Questo argomento è piuttosto vago, quindi dovrai sperimentare alcune cose e trovare qualcosa che funzioni.
Ho appena pubblicato del codice per un programmatore di attività nel parco giochi l'altro giorno, potresti dare un'occhiata, forse puoi adattarlo alle tue esigenze.
Il processore di Arduino è intrinsecamente a thread singolo e non può essere multi-task. Come è stato menzionato, esistono tuttavia modi per creare l'illusione del multitasking. Il pinguino di Annonomus ha colpito abbastanza bene quelli.