Elektroda.pl
Elektroda.pl
X
Metal Work Pneumatic
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Co lepsze: timer jako dodatkowy "wątek" czy GOTO?

AVRowiec 03 Sty 2010 01:51 1928 13
  • #1 03 Sty 2010 01:51
    AVRowiec
    Poziom 18  

    Pytanie dziwne ale stoje przed dylematem.
    Mam program typu:

    Code:
    while (1)
    
    {
        if (flaga_A)
        {
            funkcja która przez chwile trybi
        }

        if (flaga_B)
       {
            if (flaga_C)
            { ustaw flage A i wykonaj }
         if (flaga_C1)
            { ustaw flage A i wykonaj }
         if (flaga_Cn)
            { ustaw flage A i wykonaj }

       }
    }


    Musze wykonać to co jest za flagą A (niestety nie moge zrobić osobnej procedury). Skoczyć tam za pomocą GOTO

    Code:
     if (flaga_A)
    
        {
            GOTO:
            funkcja która przez chwile trybi
        }


    Czy lepiej przenieść:

    Code:
    if (flaga_B)
    
       {
            if (flaga_C)
            { ustaw flage A i wykonaj }
         if (flaga_C1)
            { ustaw flage A i wykonaj }
         if (flaga_Cn)
            { ustaw flage A i wykonaj }

       }


    do jakiegoś timera który by się kręcił szybko i bez przerwy?


    Które rozwiązanie jest optymalniejsze? Wiem że nie wypada korzystać z GOTO ale w końcu po coś powstało.
    Z tego co wiem pod AVR wątków nie ma - tworzę je więc sztucznie.
    Jakie są Wasze opinie w tak dziwnym temacie? :)

    0 13
  • Metal Work Pneumatic
  • #2 03 Sty 2010 02:03
    atom1477
    Poziom 43  

    AVRowiec napisał:

    Code:
     if (flaga_A)
    
        {
            GOTO:
            funkcja która przez chwile trybi
        }



    Kompletnie nie rozumiem o co tutaj chodzi.
    Skąd i dokąd chcesz skakać?


    AVRowiec napisał:
    Z tego co wiem pod AVR wątków nie ma - tworzę je więc sztucznie.

    Wątek nie ma nic wspólnego z procesorem. Procesor to jedno a wątek to drugie. Jeżeli chcesz żeby wątek był - to będzie.
    Ja na przykład na AVR wątki odpalałem. 3.

    0
  • #3 03 Sty 2010 04:46
    AVRowiec
    Poziom 18  

    jak odpaliłeś? system wrzuciłeś?

    pytanie odnośnie goto jest nieaktualne. inaczej rozwiązałem problem.

    0
  • #4 03 Sty 2010 13:45
    atom1477
    Poziom 43  

    Nie. Nie było żadnego systemu. Tylko wielowątkowość.

    0
  • Metal Work Pneumatic
  • #5 03 Sty 2010 18:17
    AVRowiec
    Poziom 18  

    powiedz jak bo nie moge nic znaleźć na ten temat. kiedyś zadałem podobne pytanie i wszyscy stwierdzili że czegoś takiego jak wątki nie ma na avr.

    0
  • #7 03 Sty 2010 21:44
    AVRowiec
    Poziom 18  

    nie powiem.. ciekawe :)
    to asembler czy jakieś instrukcje bascoma?

    może ma ktoś wątli w C pod AVR?

    0
  • #8 03 Sty 2010 21:48
    atom1477
    Poziom 43  

    Tylko assembler. Co akurat ułatwia przerobienie tego na C.

    0
  • #9 03 Sty 2010 23:21
    mirekk36
    Poziom 42  

    atom1477 ---> dobre, dobre hyhy tego to jeszcze nie było:

    Program do obsługi trybu wielowątkowego w Bascomie, który jest tylko w asemblerze a dodatkowo można go dzięki temu przerobić na C. Troszkę pomieszanie z poplątaniem niestety.

    Z jednej strony chwała ci za to, że w ogóle próbujesz w jakikolwiek sposób ogarnąć opanowanie, że tak powiem pseudo-współbieżnego działania różnych procesów na procesorach AVR, fajnie, że sięgasz po asembler w takim wypadku - ale totalnie nie rozumiesz co to są w ogóle wątki i jak w ogóle mogłyby wyglądać próby implementacji pseudo-wątkowych rozwiązań na takich prockach, a tak na prawdę to jedyne co można rozsądnie wykorzystać można byłoby raczej nazwać realizacją wielu zadań w oparciu o tzw zdarzenia jeśli już a nie wątki. Tym bardziej, że na końcu tej swojej drogi ku wątkom poprzez Bascoma wróciłeś do korzeni i dawaj apiać od nowa realizujesz swoje pseudo opóźnienia poprzez niezniszczalne polecenia Wait czy Waitms.

    Jeśli twoim celem jest np aby:

    1. podłączyć 3 diody LED do procka gdzie każda z nich miga powiedzmy tak: 1-sza z częstotliwością 2Hz, 2-ga z częstotliwością 5Hz a 3-cia z częstotliwością 10Hz

    2. podłączyć 4 czujniki temperatury DS18B20 gdzie co 1 sekundę wysyłasz ładnie polecenie/rozkaz konwersji temperatury do wszystkich czujników natomiast co 2 sekundy odczytujesz sekwencyjnie temperaturę każdego z nich i wyświetlasz na LCD

    3. jednocześnie działa klawiaturka na 4 przyciskach z eliminacją drgań styków

    4. jednocześnie jedym pinem sterujesz przez tranzystor przekaźnik , który załącza i wyłącza się co 10sekund

    5. jednocześnie system można sterować poprzez odbiór kodów podczerwieni z pilota

    6. jednocześnie ładnie działa transmisja wymiany danych przez UART

    to zapewniam cię, że czy to w czystym Bascomie, czy to w czystym asemblerze czy to w czystym C - jesteś w stanie ładnie zrobić na zasadzie obsługi pseudo-zdarzeń w oparciu o tzw programowe timery. Dzięki czemu do realizacji takiego systemu czasu pseudo-rzeczywistego wykorzystasz tylko 1 Timer sprzętowy (może być 8bitowy). A wszystkie zadania a w zasadzie zdarzenia wymienione w punktach od 1 do 6 będziesz wykonywał w pętli głównej tylko uwaga ! bez użycia ŻADNEGO polecenia typu Wait czy Waitms jeśli chodzi o Bascom a w C bez żadnego polecenia w pętli głównej typu _delay_ms(xxxx)

    co więcej - kod, który podrzucasz początkującemu, który nie wie do końca o co chodzi z rozkazem GoTo w Bascomie - może jedynie wywołać torsje bo na pewno 0 zrozumienia - a nawet jak widać - mało jeszcze wytrawny programista nawet nie załapie w jakim to języku napisane nie mówiąc że z zastosowaniem tego dla różnych operacji problem ma nie tylko on ale i autor tego kodu, który pisze że operacje wykonywane w tych wątkach mają być atomowe. Nie wspominając już o nieszczęsnym powrocie do poleceń typu Wait Waitms.

    Jak zrealizować to wszystko co wymieniłem w punktach 1-6 albo i więcej zdarzeń ???? no - tego tak przez net ciężko w szczegółach wyjaśnić , w związku z tym można poszukać sobie na necie informacji o realizacji na prockach AVR "zdarzeń" w oparciu o utworzenie "timerów programowych" - albo skorzystać z choćby z jednego z moich kursów ;) .... a wszystko stanie się super jasne nawet dla początkującego amatora ale co ważniejsze - w ten sposób jasne, żeby później samemu już tak zawsze pisać każdy swój program i to nie na zasadzie powielania schematu - tylko poprzez dogłębne zrozumienie - tego zagadnienia. Niektórzy już z tego drugiego rozwiązania skorzystali i się już cieszą ale i inaczej podchodzą do pisania programu, powoli odrzucając tzw myślenie o "liniowym pisaniu programu z użyciem poleceń typu Wait czy Waitms". Jak sie okazuje można sobie poradzić całkowicie bez nich ale także bez instalowania jakiegoś systemu operacyjnego, którego zresztą ciężko byłoby odpalać na małych prockach np ATtiny2313. Za to śmiało można nawet na takich korzystać z dobrodziejstw o których ja piszę , uczę i które sam stosuję na co dzień ;)

    0
  • #10 03 Sty 2010 23:34
    atom1477
    Poziom 43  

    Nie o to mi chodziło. Tą wielowątkowość zrobiłem dla bajeru. Waitms-y użyłem żeby było prościej i żeby było widać o co chodzi.
    Programowe timery stosuję tylko nie wiedziałem że to się tak nazywa :D
    Linka do wielowątkowości podałem, bo autor tematu napisał że swój problem już rozwiązał, więc założyłem że nie będzie brnął w wielowątkowość. Zresztą gdyby zaczął to sam bym mu to odradzał.
    Co do wielowątkowości to się nie zgadzam. Jest kilka całkowicie niezależnych "programów głównych" - dla mnie to jest wielowątkowość i już. Coś mi się zdaje że to Ty nie wiesz co to jest wielowątkowość i myślisz że to musi być od razu system operacyjny i inne cuda. Podczas gdy wielowątkowość to naprawdę prosta rzecz.

    0
  • #11 03 Sty 2010 23:52
    michalko12
    Specjalista - Mikrokontrolery

    AVRowiec napisał:
    Pytanie dziwne ale stoje przed dylematem.
    Mam program typu:

    Code:
    while (1)
    
    {
        if (flaga_A)
        {
            funkcja która przez chwile trybi
        }

        if (flaga_B)
       {
            if (flaga_C)
            { ustaw flage A i wykonaj }
         if (flaga_C1)
            { ustaw flage A i wykonaj }
         if (flaga_Cn)
            { ustaw flage A i wykonaj }

       }
    }


    Musze wykonać to co jest za flagą A (niestety nie moge zrobić osobnej procedury). Skoczyć tam za pomocą GOTO

    Wiem że nie wypada korzystać z GOTO ale w końcu po coś powstało.


    Wiem, że już sobie poradziłeś, ale na przyszłość...

    Oprócz gotobreak i continue idealnie nadające sie do sterowania pętlą. Tak naprawdę to jest to ograniczone goto i używanie ich jest już "ładne"

    Code:
    while (1)
    
    {
        if (flaga_A)
        {
            funkcja która przez chwile trybi
        }

        if (flaga_B)
       {
            if (flaga_C)
            { ustaw flage A; continue; }
         if (flaga_C1)
            { ustaw flage A; continue;}
         if (flaga_Cn)
            { ustaw flage A; continue; }

       }
    }

    0
  • #12 03 Sty 2010 23:56
    mirekk36
    Poziom 42  

    atom1477 napisał:

    Co do wielowątkowości to się nie zgadzam. Jest kilka całkowicie niezależnych "programów głównych" - dla mnie to jest wielowątkowość i już. Coś mi się zdaje że to Ty nie wiesz co to jest wielowątkowość i myślisz że to musi być od razu system operacyjny i inne cuda. Podczas gdy wielowątkowość to naprawdę prosta rzecz.


    Nie chcę się tu jakoś specjalnie sprzeczać i zarzucać jakiejś niewiedzy bo w ogóle spieranie się o wielowątkowość dla takich procków to ogromne nieporozumienie i mam nadzieję, że zdajesz sobie z tego świetnie sprawę.

    I tak jak mówiłem - dla bajeru można było coś takiego popełnić a szczególnie fajnie to wygląda gdy osadzone jest na Bascomie, który nawet w takcie takich twoich pseudo wątków już nie wie co się wokół niego dzieje ;) Ja bym to opisał w ten sposób, że napisałeś coś w rodzaju hyhyhy wirusa, który opanował Bascoma i żyje własnym życiem potrafiąc ruszać każdą z macek oddzielnie.

    Wracając jednak do tego, że w taki sposób zrealizowałeś 3 niezależnie jakby działające programy to się zgodzę - dla bajeru można oczywiście nazwać to wątkami - jednak sam przyznasz - że poza tym, że oddzielnie w każdym znich pomigasz diodą czy wykonasz jakieś mało skomplikowane operacje - to do nawet pseudo-wątków jeszcze daleka droga bo brak synchronizacji tych kawałków programów choćby z przerwaniami, nie wspominając już że w ogóle już samo wykorzystywanie przerwań staje się hmmm delikatnie mówiąc dosyć kłopotliwe.

    Dlatego jak mówię docenić można taki pomysł ;) bo nie wnikając w szczegóły to widać że nieźle "poszalałeś" z asemblerem ;) i fajnie. Ja długo wyciskałem wiele z Bascoma szprycując go na różne sposoby wstawkami asemblerowymi .... no ale w końcu - także i mi programy w Bascomie pisane zaczynały przypominać "potworki" bo już powoli nie wiadomo było czy to jeszcze Bascom czy już tylko asembler ;)

    A skoro wiesz jak wykorzystywać programowe timery czyli coś z kolei na kształt "zdarzeń" z dziedziny programowania na PC - to sam wiesz, że można uzyskać taki sam efekt jak w twojej próbie wielowątkowości plus szereg innych już nie tylko bajerów ale i poważnych zastosowań - nie mówiąc o tym, że każde takie zdarzenie ma dostęp do przerwań, które sobie w tle spokojnie mogą nadal ładnie działać.

    0
  • #14 06 Sty 2010 00:53
    AVRowiec
    Poziom 18  

    dzięki. ciekawe jak sie ten ich system sprawdza.. testował to ktoś?

    0