Вызов асинхронных функций в скриншоте Arduino


14

Есть ли в скриншоте Arduino способ выполнения асинхронных вызовов функций внутри цикла? Как слушать запросы через http-сервер и обрабатывать их неблокирующим образом.


1
Если вы не новичок в C ++, вы можете взглянуть на библиотеку Cosa ( github.com/mikaelpatel/Cosa ). Это полная переписка библиотеки Arduino, чтобы сделать ее лучше: ООП и обычно управляемая прерываниями. Я думаю, что они поддерживают HTTP, но я еще не проверял эту часть.
jfpoilpret

Ответы:


11

Да и нет. Вы немного расплывчаты в том, что хотите сделать. Я сделал это в нескольких разных разделах (в основном, на чтение данных датчика ... это относится ко всему, но это контекст, который я использую):

Потоки

AFAIK все Arduinos имеют только одно ядро ​​(они могут делать одну вещь одновременно). Для большинства плат Arduino аппаратная многопоточность не поддерживается. Однако существуют способы реализации программной многопоточности . Подход AsheeshR не будет работать хорошо для функций, выполнение которых занимает много времени (то есть что-то в библиотеке, что занимает некоторое время или задержка), потому что это может быть заблокировано этими инструкциями, но это будет работать хорошо для краткости функции как pinMode(). Библиотека Protothreads, перечисленная там, могла бы быть лучше в этом, но я действительно не знаю.

Было бы сложно согласовать это с HTTP, тем более, что вы должны сделать

Задержки

Распространенным способом остановки эскиза является использование задержки. Это можно решить, используя в основном цикле оператор if и millis()функцию, которая возвращает время (не время часов, а время с момента запуска Arduino). Вы также можете сделать цикл внутри цикла для опроса данных датчика.

millis()Подход не будет хорошо работать с вещами , которые вызывают всю программу в киоске (т.е. больше задержки или петли , которые в прошлом заметное количество времени). Обратите внимание, что 100 мс IIRC - это общее максимальное время, чтобы пользовательский интерфейс не выглядел медленным.

Прерывания

Прерывания - это отличный способ сохранить вещи почти асинхронными. Они запускают короткий фрагмент кода (который вы указываете) каждый раз, когда изменяется состояние вывода. Он отрывается от loop()и возвращается туда, где остановился после запуска « ISR ». У меня не так много времени, чтобы объяснить, как это сделать, но быстрый поиск в Google даст много результатов.


Насколько вы пример, раздел потоков будет наиболее применимым. Эта тема довольно расплывчата, поэтому вам придется поэкспериментировать с несколькими вещами и найти то, что работает.


3

Я только что опубликовал код для планировщика задач на игровой площадке на днях, вы можете взглянуть на него, может быть, вы можете адаптировать его под свои нужды.

Процессор Arduino по своей природе является однопоточным и не может выполнять несколько задач. Как уже упоминалось, существуют способы создать иллюзию многозадачности. Эннономус Пингвин ударил по ним довольно хорошо.

Также проверьте TimerOne (это, вероятно, лучше;)


TimerOne - плохая идея, потому что он работает только с arduinos на основе AVR. Например, мой Wemos D1 R1 не работает
Вячеслав Герчиков
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.