Czy w szkicu Arduino istnieje sposób wykonywania asynchronicznych wywołań funkcji w pętli? Podobnie jak słuchanie żądań za pośrednictwem serwera HTTP i przetwarzanie ich w sposób nieblokujący .
Czy w szkicu Arduino istnieje sposób wykonywania asynchronicznych wywołań funkcji w pętli? Podobnie jak słuchanie żądań za pośrednictwem serwera HTTP i przetwarzanie ich w sposób nieblokujący .
Odpowiedzi:
Tak i nie. Jesteś trochę niejasny, co chcesz zrobić. Zrobiłem to w kilku różnych sekcjach (głównie skupionych na czytaniu danych z czujników ... dotyczy to wszystkiego, ale takiego kontekstu używam):
AFAIK wszystkie Arduino mają tylko jeden rdzeń (mogą robić jedną rzecz jednocześnie). W przypadku większości kart Arduino wielowątkowość sprzętowa nie jest obsługiwana. Istnieją jednak sposoby implementacji wielowątkowości oprogramowania . Podejście AsheeshR nie zadziałałoby dobrze w przypadku funkcji, których wykonanie zajmuje dużo czasu (np. Coś w bibliotece, co zajmuje trochę czasu lub opóźnienie), ponieważ zostałyby zakłócone przez te instrukcje, ale działałoby to dobrze przez krótki czas działa jak pinMode()
. Biblioteka Protothreads podana tam może być w tym lepsza, ale tak naprawdę nie wiem.
Trudno byłoby to zharmonizować za pomocą HTTP, zwłaszcza że trzeba to zrobić
Typowym sposobem przeciągnięcia szkicu jest użycie opóźnienia. Można to rozwiązać za pomocą w pętli głównej instrukcji if i millis()
funkcji, która zwraca czas (nie czas zegarowy, ale czas od uruchomienia Arduino). Możesz również wykonać pętlę w pętli, aby sondować dane czujnika.
millis()
Podejście nie działa dobrze z rzeczy, które powodują, że cały program do stajni (czyli więcej opóźnień lub pętle że ostatnia zauważalna ilość czasu). Zauważ, że 100 ms IIRC to ogólny maksymalny czas, aby interfejs użytkownika nie wydawał się opóźniony.
Przerwania to świetny sposób na utrzymanie prawie asynchroniczności. Za każdym razem, gdy zmienia się stan kodu PIN, uruchamiają krótki fragment kodu (określony przez użytkownika). Odrywa się od loop()
i wraca tam, gdzie zostało przerwane po uruchomieniu „ ISR ”. Nie mam dużo czasu, aby wyjaśnić, jak to zrobić, ale szybkie wyszukiwanie w Google przyniesie wiele wyników.
Na twoim przykładzie najbardziej przydatna byłaby sekcja wątków. Ten temat jest dość niejasny, więc musisz eksperymentować z kilkoma rzeczami i znaleźć coś, co działa.
Właśnie opublikowałem jakiś kod dla harmonogramu zadań na placu zabaw pewnego dnia, możesz rzucić okiem, może dostosujesz go do swoich potrzeb.
Procesor Arduino jest z natury jednowątkowy i nie może wykonywać wielu zadań. Jak już wspomniano, istnieją jednak sposoby na złudzenie wielozadaniowości. Annonomus Penguin trafił całkiem nieźle.
Zobacz także TimerOne (prawdopodobnie lepiej;)