Асинхронна функція викликає в ескізі Arduino


14

Чи є в ескізі Ардуїно спосіб здійснення асинхронних викликів функцій в циклі? Як і прослуховування запитів через http-сервер, і обробляйте їх не блокуючим способом.


1
Якщо ви не початківець на C ++, то можете поглянути на бібліотеку Cosa ( github.com/mikaelpatel/Cosa ). Це повне перезапис бібліотеки Arduino, щоб зробити її кращою: OOP і загалом керований перериванням. Я думаю, що вони підтримують HTTP, але я ще не перевірив цю частину.
jfpoilpret

Відповіді:


11

Так і ні. Ви ніби неясні щодо того, що хочете зробити. Я зробив це в декілька різних розділів (в основному зосереджений на зчитуванні даних сенсорів ... це стосується всього, але це контекст, який я використовую):

Нитки

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

Це важко було б організувати за допомогою HTTP, тим більше, що вам доведеться це зробити

Затримки

Поширеним способом ескізу для зупинки є використання затримки. Це можна вирішити, використовуючи, в основному циклі, оператор if і millis()функцію, яка повертає час (не час, а швидше час з моменту запуску Arduino). Ви також можете зробити цикл у циклі для опитування даних датчика.

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

Переривання

Переривання - це чудовий спосіб зберегти речі майже асинхронними. Вони виконують короткий фрагмент коду (який ви вказали) щоразу, коли стан шпильки змінюється. Він відривається від loop()і повертається туди, де він припинився, коли " ISR " був запущений. У мене не так багато часу, щоб пояснити, як це зробити, але швидкий пошук в Google дасть багато результатів.


Що стосується вашого прикладу, розділ для різьблення рішень був би найбільш застосовним. Ця тема досить розпливчаста, тому вам доведеться експериментувати з кількома речами і знайти щось, що працює.


3

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

Процесор Arduino за своєю суттю є однопотоковим і не може виконувати багато задач. Як було зазначено, однак існують способи створити ілюзію багатозадачності. Пінгвін-анонім потрапив на них досить добре.

Також перевірте TimerOne (це, мабуть, краще;)


TimerOne - це погана ідея, оскільки він працює лише з ардуїнами на основі avr. Наприклад, мій Wemos D1 R1 не працює
В’ячаслав Герчич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.