Skocz do zawartości
wojtekizk

Wielozadaniowość w Arduino - biblioteka Timers

Pomocna odpowiedź

15 minut temu, wojtekizk napisał:

Na przykład w jednym wątku zapuszczam jakieś czasochłonne działanie (grzałkę) a w innym sprawdzam np temperaturę i jak jest OK to wyłączam grzałkę.

Pokaż kawałek kodu dotyczący tego konkretnego przykładu, bo chyba za bardzo uprościłeś (albo po prostu fatalnie dobrałeś przykład). Ja doskonale wiem o co chodzi, ale inni mogą to zrozumieć opacznie.

Udostępnij ten post


Link to post
Share on other sites
Cytat

void zadanie1() { // tutaj odczytuję temperaturę roztworu }

void zadanie2() { //jeśli temperatura za mała, to włącz grzałkę }

void zadanie3() {// jeśli za duża, to wyłącz grzałkę }

w setupie:

Cytat

akcja.attach(1,5000,zadanie1);

akcja.attach(2,1000,zadanie2);

akcja.attach(3,1200,zadanie3);

co 5 sek. sprawdzam temperaturę, a ew. akcja ON/OFF co np. 1000 i 1200 ms.

ciała wszystkich funkcji - dowolna interpretacja obsługi czujnika, a potem to już zwykłe if 🙂 

Naturalnie można to wszystko zrobić w jednej linii ... ale ma być to przykład wykorzystania Timers 🙂:

Cytat

(TEMPC < 45) ? digitalWrite(11,HIGH): digitalWrite(11,LOW);  

... gdzie TEMPC to zmienna globalna typu int, a PIN 11 ( pinMode(11,OUTPUT); ), podpięty do np. przekaźnika sterującego grzałką , (operator ?  - dla chętnych 🙂 )

Uff... chyba wyczerpałem temat... i jest do zamknięcia wątku.

Pozdrawiam

 

Udostępnij ten post


Link to post
Share on other sites

A możesz jednak pokazać kod? Zdaje mi się, że chciałeś przybliżyć forumowiczom bibliotekę Timers... więc może doprowadź to do końca?

Na razie nie jest to koniec wątku. Nie pokazałeś żadnej długo wykonującej się funkcji. Nie pokazałeś przykładu, tylko jakieś smętne komentarze.  Albo pokażesz kod, albo uznam (i pewnie nie tylko ja), że po prostu próbujesz się chwalić czymś, czego sam do końca nie rozumiesz. Chcesz pozostawić takie wrażenie?

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Chyba zaczynamy się bardziej czepiać terminologii jaka tu występuje. Bo to co nazywane jest w bibliotece wątkami to funkcje, w języku bardziej obiektowym byłyby to klasy anonimowe albo interfejsy. Ale o wątkach jako działaniu równoległym to nie ma tu mowy.

Niemniej biblioteka jest przydatna, wczoraj miałem okazję jej użyć i sprawdza się świetnie. Choć trafiłem na problem, na który zwróciłem uwagę, że jak coś przyblokuje wykonywanie to wszystko inne wisi - tam akurat był timeout związany z komunikacją LoRa, który wieszał wszystko na 3 sekundy. Ale tak to super!

22 minuty temu, ethanak napisał:

A możesz jednak pokazać kod?

    void process(void)
    {
      unsigned long actual_time = millis();
      
      for (int i=0; i<TIMER_ITEMS; i++)
      {
        long long delta_time = actual_time - _elements[i].begin_time;
        
        if (delta_time < 0)
        {
          delta_time += 0xffffffff;
          delta_time += 1;
        }
        if (_elements[i].interval > 0 && delta_time >= _elements[i].interval)
        {
          onTime(i);
          _elements[i].func();
          _elements[i].begin_time = actual_time;
        }
      }
    }

Tu fragment który wrzuca się do loopa - przelatuje po wszystkich elementach wektora i wywołuje przypisane do nich funkcje.

 

Udostępnij ten post


Link to post
Share on other sites

Cały mój pierwszy post to przecież przykład, dość obszerny i szczegółowy.... jeszcze więcej i na gotowo jest tutaj:

https://majsterkowo.pl/forum/viewtopic.php?f=38&t=1974

Co mam jeszcze napisać? Jakiś konkretny przykład na zaliczenie dla kilku leniwych studentów?

Nie warto, w swoim życiu miałem już studentów, niby coś tam potrafią niby coś wiedzą... a jak dokładnie zapytać, to okazuje się że C++ to dla nich rozmiar stanika jest 🙂

Od czasu do czasu zaglądam tu i tam, bo pomimo wieku chcę nadal być na bieżąco z nowinkami. Cóż zaczynałem w 1980 r. i wtedy na uczelni królował ALGOL-60, w domu kupiony w Pewexie ZX-Spectrum i wszechobecny Basic. Ech fajne czasy.... Commodore, Amiga , potem pierwszy 386 z koprocesorem 🙂

Jakie chce pozostawić wrażenie? Nie zależy mi, sam to oceń, przynajmniej się staram... 

ps. mam wrażenie, że kolega zbyt poważnie podchodzi do tematu... dla mnie to jest hobby, zabawa i ciekawość świata... nic więcej

Pozdrawiam

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, wojtekizk napisał:

Jakiś konkretny przykład na zaliczenie dla kilku leniwych studentów?

Dobre 😄

Biblioteka jak najbardziej przydatna, do tego nie ma wątpliwości. Może trafiła się pewna nieścisłość w terminologii, ale tak fajnie że ją udostępniłeś. Mi się przydała, komuś pewnie też.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Czy Ty w ogóle rozumiesz co się do Ciebie pisze?

Proszę wyraźnie o przykład tej czasochłonnej grzałki i w jaki sposób czasochłonne funkcje są realizowane poprzez wsadzenie ich do loop (bo dokładnie to można z Twoich postów wywnioskować).

10 minut temu, wojtekizk napisał:

w swoim życiu miałem już studentów, niby coś tam potrafią niby coś wiedzą... a jak dokładnie zapytać, to okazuje się że C++ to dla nich rozmiar stanika jest

Jaki wykładowca tacy studenci. Jeśli tak im tłumaczyłeś jak w tym wątku to się nie dziwię.

A czy hobby czy nie hobby... zawsze warto coś robić porządnie. Dla mnie roboty czy mikrokontrolery to też hobby - co nie znaczy, że mogę coś robić po łebkach (a już szczególnie tłumaczyć ludziom działanie jakiejś biblioteki).

10 minut temu, wojtekizk napisał:

Cóż zaczynałem w 1980 r. i wtedy na uczelni królował ALGOL-60, w domu kupiony w Pewexie ZX-Spectrum

Coś Ci się chyba pokićkało. Nie wiem o jakiej uczelni piszesz, ale ALGOL-60 odszedł już wtedy w odstawkę na rzecz FORTRAN-u, a ZX Spectrum premierę miał w 1982.

PS. Młody, po fajki latasz 🙂

 

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

ATR Bydgoszcz, był ALGOL, w ZETO była Odra 1206, poczytaj, poczytaj... to są fakty a nie mity kolego.
ZXspectrum był kupiony w Peweksie w 86 🙂

Dobra... sam zacząłeś...jak jesteś kolego taki mądry i robisz z siebie GURU to może sam zacząłbyś uczyć, co? 

Zanim zaczniesz utyskiwać na wykładowców to zobacz jaki materiał na przyszłego magistra do nas trafia? Ludzie nawet podstaw matematyki nie maja, a ja mam ich uczyć algorytmów?

Jak mam im mówić o kluczach kryptograficznych RSA, skoro gość nie wie nic o liczbach pierwszych a faktoryzacja liczb to jakieś pojęcie z kosmosu. 

Napisałeś że programujesz w C, Python i C++ , może więc Ty się pochwalisz czymś "porządnym", bo jak na razie widzę, że porządnie to się Tobie pokićkało kolego.

Tłumaczę tak jak potrafię , przykłady są mniej lub bardziej wyszukane, takie aby każdy mógł zrozumieć... nie uczę o konstruktorach i klasach zaprzyjaźnionych już na drugim wykładzie z C++. 

Uważasz, że nie zgłębiam dość dokładnie, że źle tłumaczę, że sam nie rozumiem? Zgoda.

To weź kolego mnie popraw, weź napisz i szczegółowo wyjaśnij dowolny temat... a ja zacznę doszukiwać się luk, i wytykać, że bee, że nie jest porządnie. 

Zresztą po co te przepychanki, jeśli tym postem pomogłem chociaż jednej osobie coś zrozumieć,  skierować na inne tory, wskazać inne rozwiązanie... to już jestem szczęśliwy.

Twoje zdanie i opinia to Twoja sprawa, Tobie nie pomogłem i chyba Tobie się nie da 🙂 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Ślędzę wątek od samego początku i coś w tych "wątkach" mi nie gra tak jak nie gra @ethanak . @wojtekizk napisałeś kilka postów wcześniej, że nie ma żadnego problemu z blokującymi funkcjami - podałeś przykład DS18B20 - że wystarczy je wrzucić do pętli razem z pracującym tam obiektem Timers i wszytsko się ładnie wykona w zadanych interwałach niezależenie od tego czy odczyt z czujnika będzie trwał np. 750ms a my np. chcemy z f = 1kHz sterować silnikiem. No i właśnie o to  zapewne chodzi @ethanak że w obecnej formie klasa Timers nie zapewni nam pożądanego efektu. Bo niema tutaj - w takiej formie jak to przedstawiasz - mowy o tych prawdziwych wątkach, tylko nieblokującym sprawdzaniu timeout'ów. 

Edytowano przez Matthew11

Udostępnij ten post


Link to post
Share on other sites
10 minut temu, wojtekizk napisał:

ATR Bydgoszcz, był ALGOL, w ZETO była Odra 1206, poczytaj, poczytaj... to są fakty a nie mity kolego.

U nas na PB był FORTRAN, Algol jako ciekawostka i język już nieużywany wyłącznie dla chętnych. ODRA-1325 na Polibudzie, w ZETO (tam pracowałem, ale wtedy jeszcze nie na komputerach) dwie sztuki 1305 i jakiś RIAD (nie pamiętam jaki, oddział RIAD-a był na drugim końcu miasta). Mówię oczywiście o roku 1980.

15 minut temu, wojtekizk napisał:

Napisałeś że programujesz w C, Python i C++ , może więc Ty się pochwalisz czymś "porządnym"

A dlaczego mam się chwalić? Po pierwsze 99% kodów nie mogę publikować (praca), po drugie od chwalenia się to są inni, po trzecie zerknij na http://milena.polip.com albo na launchpada.

16 minut temu, wojtekizk napisał:

Uważasz, że nie zgłębiam dość dokładnie, że źle tłumaczę, że sam nie rozumiem? Zgoda.

To weź kolego mnie popraw, weź napisz i szczegółowo wyjaśnij dowolny temat... a ja zacznę doszukiwać się luk, i wytykać, że bee, że nie jest porządnie. 

Tobie się znowu coś pomyliło. Ja nie chcę się kłócić ani udowadniać kto jest mądrzejszy , ale z drugiej strony nie chcę poprawiać po kimś kto sam powinien doprowadzić swoje tłumaczenie do końca. Tym bardziej że sam nauczycielem nie jestem i się absolutnie na nauczyciela nie nadaję... Ale jeśli już tłumaczysz to tłumacz do końca, a kody może zamieszczaj tutaj albo na githubie, a nie na zapomnianym blogu, który nie wiadomo czy przetrwa do końca roku.

Jak na razie to tylko się czepiasz... a ja czekam aż pokażesz przykłady o których wspominałeś (najchętniej ten z długo wykonującą się funkcja od grzałki).

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

[nieaktualne]

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

Pomijając samą dyskusję pozwólcie że nieco skrytykuję samą "bibliotekę". Skoro tyle o niej napisano, to może warto byłoby ją nieco udoskonalić.

Po pierwsze absolutnie bez sensu jest używanie 64-bitowej arytmetyki - dla 8 bitowego mikrokontrolera to mnóstwo pracy, a wystarczyłoby 32, albo i mniej bitów. Osoba mająca tak duże doświadczenie w ograniczonych sprzętowo platformach chyba powinna o tym widzieć.

Kolejna i poważniejsza sprawa to samo obliczanie czasów - nazwa interval sugeruje że co tyle mają się wywoływać odpowiednie funkcje. Niestety nieco naiwna implementacja sprawia. że każde "przetrzymanie" procesora przez pozostałe wątki zwiększa opóźnienie. Polecam poczytać czym różnią się funkcje  vTaskDelay i vTaskDelayUntil używane przez FreeRTOS-a, może wtedy coś się rozjaśni.

Udostępnij ten post


Link to post
Share on other sites
4 minuty temu, Elvis napisał:

pozwólcie że nieco skrytykuję samą "bibliotekę".

Ryzykant czy samobójca?

Udostępnij ten post


Link to post
Share on other sites

Pozwólcie, że się wtrącę. W tym wątku idealnie widać różnicę między podejściem Elvisa i Ethanaka o której już kiedyś pisałem. Ethanak mówi, "hej coś jest źle, bardzo źle, zgadnij co to i popraw lub się wytłumacz" , a Elvis, " to konkretnie masz źle, popraw albo się wytłumacz". 

Ja osobiście wyciągnąłem wiele nauki od obydwu kolegów , ale grubą skórę trza mieć :-D, tym bardziej, że w końcu kiedyś musimy skończyć tą moją stronę www, co Ethanak? 

Także Wojtek ziomalu, (kiedy Kryry nawiedzisz?), gruba skóra i pióra jak u kaczki to podstawa... 🙂

Sorry za offtopic;) 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Ponieważ wątek jest ostatnio nadspodziewanie popularny, chciałem tylko zwrócić uwagę na niską jakość wspomnianej biblioteki. Wiele bibliotek dla Arduino cierpi na podobną przypadłość, ale nie można poprawiać całego świata na raz - w każdym razem zanim ktoś użyje gotowca z internetu proponowałbym poświęcić chwilę na analizę kodu i zastanowienie czy to na pewno jest program, z którego warto skorzystać, albo chociaż czy jest on wystarczająco dobry do danego zastosowania.

Swoją drogą analiza błędów oraz poprawianie tego co autor biblioteki miał na myśli mogłoby być dość pouczające.

  • Lubię! 1

Udostępnij ten post


Link to post
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!

Gość
Dołącz do dyskusji! Kliknij, aby zacząć 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...