Skocz do zawartości

Wielozadaniowosc w Arduino


Pomocna odpowiedź

Napisano

Czy sample ze strony arduino.cc pt: Blink Without Delay mozna uznac za wielozadaniowosc, czy wielozadaniowosc to cos szerszego i dziala inaczej? Gdy chce kontrolowac w 1 czasie min 2 procesy? NA przemyslowym PLC nie ma z tym wiekszego problemu a tu nie wiem. Czy jest takie cos mozliwe na Arduino?

Andre, też szukałem czegoś o wielowątkowości Arduino 🙂 google ma dość sporo odpowiedzi na ten temat. Wystarczy wpisać hasło np.: "Arduino wielowątkowość" i pierwsze 2 wpisy powinny dać już wystarczająco dużo informacji jak można zrealizować wątki w Arduino. Zerknij choćby tu: leOS2

Pozdrawiam.

Wielozadaniowość nie musi być zawsze rozwiązana za pomocą wątków. Jest wiele możliwych podejść.

Przykład z blink without delay, to chyba najprostsze rozwiązanie, tak zwana pętla wydarzeń (event loop) -- robimy tylko jedną rzecz na raz, ale robimy to w małych porcjach, a kolejne zadania czekają na swoje wykonanie w kolejce. Można ten przykład znacznie rozwinąć i uogólnić.

Wątki to inne podejście -- tam trzymamy w pamięci jednocześnie wiele stanów aplikacji i przełączamy się pomiędzy nimi. Zazwyczaj robione jest to przez system operacyjny, którego na AVR-ach raczej brak, ale są jakieś wynalazki z namiastką tego (nie jestem pewien, czy na AVR daja radę).

Jeszcze innym podejściem jest wykorzystanie wielu mikrokontrolerów -- tak robi na przykład Propeller. Oczywiście nic nie zabrania zrobienia tak z Arduino na naszym robocie -- osobny mikrokontroler do sterowania serwami, osobny do czytania stanu czujników, etc.

Dzieki za rady i odpowiedzi. Kombinuje ze pomocne w uzyskaniu Wielowatkowosci moga tez byc Interrupty - napisze po amatorsku - 'biegaja w tle' i jak sie cos wydarzy (np ANIN-czujka temperatury trigg) przerywaja mi proces. Czytam o tym na stronie producenta opis funkcji attachInterrupt()...

Problem z przerwaniami jest taki, że jak sama nazwa wskazuje, przerywają działanie twojego programu w losowym momencie, kiedy wydarzy się jakieś zewnętrzne zdarzenie. Wynikają z tego dwie główne bolączki: 1) nigdy nie wiesz w jakim stanie akurat będzie twój program kiedy wykona się przerwanie, 2) przerwanie może się wykonać w jakimś krytycznym czasowo momencie i spowolnić wykonanie twojego programu.

Dlatego często robi się tak, że procedura obsługi przerwania jest minimalna i ustawia jedynie jakąś flagę (albo dodaje wydarzenie do kolejki), a cała logika dzieje się w głównej pętli (sprawdzanie flagi i odpowiednia reakcja). W ten sposób kod w przerwaniu wykonuje się szybko i nie wpływa bezpośrednio na resztę programu, dzięki czemu zachowuje się on bardziej przewidywalnie.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...