Асинхронные вызовы функций в эскизе Arduino

В эскизе Arduino существует ли способ сделать асинхронные вызовы функций внутри цикла? Подобно прослушиванию запросов через HTTP-сервер и обработке их с помощью неблокирующего способа.

12 голосов | спросил Jacer Omri 3 J0000006Europe/Moscow 2014, 06:20:18

2 ответа


9

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

Темы

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

Было бы сложно организовать это с помощью HTTP, тем более, что вы должны сделать

Задержки

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

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

Прерывания

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


Насколько я понимаю, секция Threading будет наиболее подходящей. Эта тема довольно неопределенная, поэтому вам придется поэкспериментировать с несколькими вещами и найти что-то, что работает.

ответил Anonymous Penguin 3 J0000006Europe/Moscow 2014, 06:57:48
3

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

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

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

ответил Aurast 3 J0000006Europe/Moscow 2014, 07:48:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132