Chamadas de função assíncrona no esboço do Arduino

14

Em um esboço do Arduino, existe uma maneira de fazer chamadas de função assíncronas dentro do loop? Como ouvir solicitações através do servidor http e processá-las de maneira não-bloqueante .

Jacer Omri
fonte
1
Se você não é iniciante em C ++, pode ver a biblioteca Cosa ( github.com/mikaelpatel/Cosa ). É uma reescrita completa da biblioteca do Arduino para torná-lo melhor: OOP e geralmente orientado a interrupções. Acho que eles suportam HTTP, mas ainda não verifiquei essa parte.
precisa saber é o seguinte

Respostas:

11

Sim e não. Você é meio vago sobre o que quer fazer. Eu fiz isso em algumas seções diferentes (principalmente focadas na leitura dos dados do sensor ... isso se aplica a tudo, mas esse é o contexto que estou usando):

Tópicos

AFAIK todos os Arduinos têm apenas um núcleo (eles podem fazer uma coisa de uma vez). Para a maioria das placas Arduino, o multithreading de hardware não é suportado. No entanto, existem maneiras de implementar multithreading de software . A abordagem do AsheeshR não funcionaria bem para funções que demoram muito tempo para serem concluídas (por exemplo, algo em uma biblioteca que demora um pouco ou demora) porque seria bloqueado por essas instruções, mas funcionaria bem em breve funções como pinMode(). A biblioteca Protothreads listada pode ser melhor nisso, mas eu realmente não sei.

Seria difícil orquestrar isso com HTTP, especialmente porque você precisa

Atrasos

Uma maneira comum de um esboço parar é o uso de um atraso. Isso pode ser resolvido usando, no loop principal, uma instrução if e a millis()função que retorna uma hora (não uma hora do relógio, mas a hora desde que o Arduino foi iniciado). Você também pode fazer um loop dentro do loop para pesquisar dados do sensor.

A millis()abordagem não funcionaria bem com coisas que causam a paralisação de todo o programa (ou seja, mais atrasos ou loops que duram uma quantidade notável de tempo). Observe que 100ms IIRC é o tempo máximo geral para fazer uma interface do usuário não parecer atrasada.

Interrompe

As interrupções são uma ótima maneira de manter as coisas quase assíncronas. Eles executam um pequeno pedaço de código (que você especifica) toda vez que um estado de alfinete é alterado. Ele rompe com o loop()e retorna ao ponto em que parou quando o " ISR " foi executado. Não tenho muito tempo para explicar como fazer isso, mas uma pesquisa rápida no Google produzirá muitos resultados.


No seu exemplo, a seção de segmentação seria a mais aplicável. Como esse tópico é bastante vago, você precisará experimentar algumas coisas e encontrar algo que funcione.

Pinguim anônimo
fonte
3

Acabei de publicar um código para um agendador de tarefas no parquinho outro dia; você pode dar uma olhada, talvez possa adaptá-lo às suas necessidades.

O processador do Arduino é inerentemente de thread único e não pode realizar várias tarefas. Como foi mencionado, existem maneiras de criar a ilusão de multitarefa. O Annonomus Penguin atingiu muito bem aqueles.

Verifique também o TimerOne (provavelmente é melhor;)

Aurast
fonte
O TimerOne é uma péssima idéia, pois funciona apenas com arduinos baseados em avr. Por exemplo meu Wemos D1 R1 não funciona
Vyachaslav Gerchicov