Skocz do zawartości

Wielozadaniowośćna Arduino - pozbądź się delay


Gość es2

Pomocna odpowiedź

Bardzo częstym grzechem w programach na uC, nie ważne czy to AVR, czy ARM czy 8080, jest używanie delay. Takie postępowanie prowadzi do "blokowania" uC. W czasie delay, trwającego dziesiątki a czasem setki ms uC wykonuje tylko przerwania. Jest na to sposób. Nie można używać delay czy pętli czekającej na zdarzenie (np naciśnięcie przycisku). Jak więc zrealizować program bez delay? Wiele problemów rozwiążą przerwania ale nie wszystkie. Jak nie można czegoś zrobić na przerwaniach, to można użyć timerów i maszyny stanów. W ten sposób można zrealizować pseudo wielozadaniowość. Podstawowe informacje można znaleźć pod adresem https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418

Używając podobnych mechanizmów zrealizowałem konwerter WS2812 via DMA, który w czasie transmisji do led dekoduje ramki DMX z USB (konwerter USB-SPI FT221), bez ich gubienia. W tym samym czasie, odebrane ramki DMX wysyła po RS485 oraz DMX z dodatkowego wejścia RS485 używając SC16IS760IPW. Wszystko to działa dlatego, że nie ma delay. Jedyne przerwania są od timera i od USART dla WS2812.

Trochę o maszynie stanów napisałem w wątku https://www.forbot.pl/forum/topics74/obsluga-modulu-z-dwoma-przekaznikami-vt15407.htm

Zawsze trzeba policzyć, kiedy muszą być użyte przerwania a kiedy można użyć maszyny stanów i/lub timerów w pętli głównej.

Jeśli linki nie wyjaśniają problemu wielozadaniowości proszę pytać.

Link do komentarza
Share on other sites

Użycie delay nie jest błędem. Jego niepoprawne użycie faktycznie jest. A do wielozadaniowości wcale nie trzeba używać przerwań - albo chociaż niekoniecznie tak jak opisałeś. Nawet na Arduino można sobie odpalić FreeRTOS-a i pisać program wielowątkowy z delay-ami bez problemu. Wszystko zależy co chcemy rozwiązać i co potrafimy.

Link do komentarza
Share on other sites

Gość es2
A do wielozadaniowości wcale nie trzeba używać przerwań

Nie ma innej sensownej możliwości. Przerwania i tak jakies pojawią się a omijanie ich na siłę nie ma sensu. Weźmy przykład konwertera WS2812 via DMX, o którym pisałem. Czy istnieje możliwość, aby w czasie transmisji do 512led WS2812 odbierać dane z DMX bez używania przerwań?

Odmierzanie czasu. Można używać metody w stylu millis. Należy jednak zauważyć, że bez względu na to czy chcę odczekać 100ms, czy kilka godzin zawsze używam zmiennej pomocniczej 32-bit. Gdy na przerwaniach 1ms zrealizuje sobie wirtualne timery, gdy odmierzam czasy do 255ms użyje 8-bit, do 65 sekund zmiennej 16-bir, większych 32-bit. Jak się używa 20..30 takich timerów do odliczania timeotów itp oszczędności w zużyciu ram są duże biorąc pod uwagę, ze większość tych czasów to dziesiątki ms, niewiele czasy rzedu sekund, a ponad 65 sekund do rzadkość (np zapytania ARP).

[ Dodano: 16-04-2018, 11:24 ]

Nawet na Arduino można sobie odpalić FreeRTOS-a

Takie z deszczu pod rynnę. AVR ma za mało ram aby sensownie wykorzystać systemy wielozadaniowe. Kolejna sprawa, to, że jak ktoś potrafi użyć RTOS, to nie bedzie bawił się Arduino (z Arduino to chyba tylko PCB zostanie) i nie będzie czytał tego wątku.

Moje "Arduino":

IDE "Arduino":

Mam więc takie Arduino jak i jest ono z RTOSem.

Link do komentarza
Share on other sites

es2, nie przedstawiaj swoich rozwiązań jako jedynych możliwych. Oczywiście że masz rację pisząc że tak da się rozwiązać problem, ale to nie jedyna opcja.

A gotowa paczka z FreeRTOS-em dla Arduino jest tutaj: https://create.arduino.cc/projecthub/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc

Nawet sprawdzałem - działa. Nie twierdzę, że to idealne rozwiązanie, ale inne niz opisujesz, jest jeszcze wiele innych opcji. Więc fajnie że napisałeś program, miło że się nim chwalisz, tylko nie pisz że to jedyne rozwiązanie.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Gość es2
tylko nie pisz że to jedyne rozwiązanie.

RTOS nie używa przerwań?

Ile tasków może być w FreeRTOS dla AVR? Jak pamiętam 10. U mnie 20..30 taksów to żaden problem.

[ Dodano: 16-04-2018, 11:38 ]

A gotowa paczka z FreeRTOS-em dla Arduino jest tutaj: https://create.arduino.cc/projecthub/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc

Nawet sprawdzałem - działa

Ale na popularnym UNO to chyba poszaleć się nie da. 90% tematów jakie widzę o Arduino dotyczy Mega328.

Nie trzeba się pchać w pamięciożerny RTOS aby cieszyć się wielozadaniowością. Jak potrzebuje prawdziwej wielozadaniowości to użyje OrangePi ZERO w cenie niewiele wyższej niż klon ArduinoMega2560. Arduino 8kb ram, Orange 256/512k. Arduino 256k flash, Orange używa w tej roli pamięci ram (w czasie pracy, nie biorę pod uwagę nośnika w postaci karty SD do 32GB).

Link do komentarza
Share on other sites

RTOS używa, ale program nie jest wykonywany w kontekście przerwania. Istnieją też systemy bez wywłaszczenia (jak Win3.1) - wtedy przerwania nie są konieczne. Można uzywać call-backów, jak chociażby w JS.

Chodzi tylko o to, że można na różne sposoby rozwiązać ten sam problem. Koniec i kropka.

Link do komentarza
Share on other sites

Nie twierdzę, że Twoje rozwiązanie jest złe - bardzo możliwe że jest nawet najlepsze do opisywanego problemu. Tylko zaprotestowałem przeciw przedstawianiu go jako jedyne poprawne. Nie chodziło mi o nic innego.

Link do komentarza
Share on other sites

Gość es2
Nie twierdzę, że Twoje rozwiązanie jest złe - bardzo możliwe że jest nawet najlepsze do opisywanego problemu. Tylko zaprotestowałem przeciw przedstawianiu go jako jedyne poprawne. Nie chodziło mi o nic innego.

A gdzie napisałem, że jedyną możliwością jest maszyna stanów i przerwania?

Proszę pokazać alternatywę, bez używania przerwań (np RTOS) na równoczesne dekodowanie DMX i wysyłanie danych do 512led WS2812 na AVR mega. Uściśliłem Mega aby nie było nieporozumień (najpopularniejesze jest UNO z Mega) bo na Xmega czy ARM można użyć DMA.

Link do komentarza
Share on other sites

Jak nie można czegoś zrobić na przerwaniach, to trzeba użyć timerów i maszyny stanów.

Wystarczyłoby zmienić na można i po g*wnoburzy.

A co do pisania gotowych rozwiązań to staram się ostatnio nie odzywać na forum, i tak mamy tutaj nadmiar pseudo-ekspertów.

Link do komentarza
Share on other sites

Gość es2
Jak nie można czegoś zrobić na przerwaniach, to trzeba użyć timerów i maszyny stanów.

Wystarczyłoby zmienić na można i po g*wnoburzy.

A co do pisania gotowych rozwiązań to staram się ostatnio nie odzywać na forum, i tak mamy tutaj nadmiar pseudo-ekspertów.

A kto wywołał nie potrzebą dyskusję czepiając się słówek?

Zmieniłem na można.

Link do komentarza
Share on other sites

Więc zamknijmy ten g*wątek 🙂 Ja od początku chciałem tylko sprostować że jest wiele możliwości, jak to mawiają Brytole "There a dozen ways to skin a cat", w przypadku prostych programów i małych mikrokontrolerów to co zaproponowałeś jest jak najbardziej ok.

Ale gdybyś nie wierzył, że można na małym mikrokontrolerze zaimplementować mikro-system, nawet bez wywłaszczenia to podaję dowód przez przykład: http://ascor.pl/ap14.html Przerwania są oczywiście używane do krytycznych czasowo lub ze względów bezpieczeństwa fragmentów, ale już pozostałe wątki jak interfejs użytkownika, miganie diodami itp są wykonywane zupełnie poza przerwaniami w kilku pseudo-równoległych wątkach.

Link do komentarza
Share on other sites

Panowie, ponieważ ja się czuję takim pseudo-ekspertem (dlatego nie wyściubiam nosa poza dział Arduino) to nieśmiało zaproponuję, by po prostu zjeść tego słonia po kawałku:

czyli jak moderator zobaczy kod z delay-em to od razu perma-bana takiemu użytkownikowi, a sam wątek do kosza.

Problemu nie będzie widać, bo zamieciony pod dywan. Zawsze to jakieś rozwiązanie (tak sobie wyobrażam).

Nie rozumiem, przy takich multitematycznych forach, próby "nawracania" użytkowników na jakieś naszym zdaniem lepsze (i zresztą często lepsze) rozwiązania.

Nie wyobrażam sobie przeskakiwania w połowie projektu z Arduino na np. AVR w "czystym" C (czysty w przypadku C i mikrokontrolerów trochę mnie bawi - więc wybaczcie cudzysłów).

Rada typu "w arduino rozwiązanie twojego problemu nie będzie takie eleganckie jak w "czystym(hehe)" C, więc kup sobie programator, przeczytaj kolejną książkę (tu kolejne dylematy) i do roboty".

Arduino jest swego rodzaju uproszczeniem (hardware jest ukryty pod toną softu), bo takie miało być (jest to też jego największą zaletą i jednocześnie najgorszą wadą).

Link do komentarza
Share on other sites

Gość es2
Więc zamknijmy ten g*wątek

Nikogo nie zmuszam do czytania g... wątku a tym bardziej pisania w nim. Jeśli kogoś drażnią SexShopy to niech do nich nie wchodzi, kasyna - to samo. Mnie drażnią kościoły więc je omijam. Nie wchodzę do nich i nie próbuje zawrócić nawróconych.

PS

Niestety na forach sa tacy, co "torpedują" każdą próbę pomocy. Nic dziwnego, że później na forach pustki.

Link do komentarza
Share on other sites

A mnie np. drażni gdy ktoś Wie Wszystko , a głosząc prawdy objawione pokazuje wszem i wobec, iż w rzeczywistości wie niewiele (tak, do kolegi wątkotwórcy piję,). I co, mam wypadać z forbota bo mi się jeden pacjent nie podoba?

Przede wszystkim przestańcie mylić wielozadaniowość (multitasking) z wielowątkowością (multithreading).

Potem pogadamy o przerwaniach i takich tam innych niuansach.

BTW. W wielozadaniowym systemie użycie delay jest jak najvardziej prawidłowe - tyle że ten delay działa nieco inaczej. Przykładem niech będzie delay na esp8266 😉

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.