Чи є в ескізі Ардуїно спосіб здійснення асинхронних викликів функцій в циклі? Як і прослуховування запитів через http-сервер, і обробляйте їх не блокуючим способом.
Чи є в ескізі Ардуїно спосіб здійснення асинхронних викликів функцій в циклі? Як і прослуховування запитів через http-сервер, і обробляйте їх не блокуючим способом.
Відповіді:
Так і ні. Ви ніби неясні щодо того, що хочете зробити. Я зробив це в декілька різних розділів (в основному зосереджений на зчитуванні даних сенсорів ... це стосується всього, але це контекст, який я використовую):
AFAIK у всіх Arduinos є лише одне ядро (вони можуть робити одну справу відразу). Для більшості плат Arduino апаратне багатопотокове не підтримується. Однак існують способи впровадження програмного багатопотокового прочитання . Підхід AsheeshR не спрацював би для функцій, які потребують тривалого часу (тобто щось у бібліотеці, яке потребує певного часу, або затримка), оскільки ці інструкції будуть забиті, але він би працював добре на короткий час такі функції, як pinMode()
. Бібліотека Protothreads, перелічена там, може бути кращою в цьому, але я не знаю насправді.
Це важко було б організувати за допомогою HTTP, тим більше, що вам доведеться це зробити
Поширеним способом ескізу для зупинки є використання затримки. Це можна вирішити, використовуючи, в основному циклі, оператор if і millis()
функцію, яка повертає час (не час, а швидше час з моменту запуску Arduino). Ви також можете зробити цикл у циклі для опитування даних датчика.
millis()
Підхід не буде добре працювати з речами , які викликають всю програму в кіоску (тобто більше затримки або петлі , які в минулому помітну кількість часу). Зауважте, що 100 мс IIRC - це загальний максимальний час, щоб зробити інтерфейс користувача не здаватись лагким.
Переривання - це чудовий спосіб зберегти речі майже асинхронними. Вони виконують короткий фрагмент коду (який ви вказали) щоразу, коли стан шпильки змінюється. Він відривається від loop()
і повертається туди, де він припинився, коли " ISR " був запущений. У мене не так багато часу, щоб пояснити, як це зробити, але швидкий пошук в Google дасть багато результатів.
Що стосується вашого прикладу, розділ для різьблення рішень був би найбільш застосовним. Ця тема досить розпливчаста, тому вам доведеться експериментувати з кількома речами і знайти щось, що працює.
Я щойно опублікував якийсь код для планувальника завдань на ігровому майданчику на другий день, ви можете захотіти заглянути, можливо, ви зможете адаптувати його до своїх потреб.
Процесор Arduino за своєю суттю є однопотоковим і не може виконувати багато задач. Як було зазначено, однак існують способи створити ілюзію багатозадачності. Пінгвін-анонім потрапив на них досить добре.
Також перевірте TimerOne (це, мабуть, краще;)