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

[C++] Wielozadaniowość bez użycia wątków

nsmarcin 05 Maj 2010 19:46 1258 3
  • #1 05 Maj 2010 19:46
    nsmarcin
    Poziom 12  

    Witam,
    Mam za zadanie napisać program na ARM7, który będzie sterował dwoma diodami jednocześnie tzn, mam podane w dwóch tabelach czasy, w każdej dla poszczególnej diody. Tabele wyglądają tak:

    Code:
    tab_d1[]={czas świecenia_d1, czas wyłączenia_d1, czas świecenia2_d1, czas wyłączenia2_d1,…}
    
    tab_d2[]={czas świecenia_d2, czas wyłączenia_d2, czas świecenia2_d2, czas wyłączenia2_d2,…}


    I tak np. konkretnie:
    Code:
    tab_d1[]={5,3,1,2};
    
    tab_d2[]={2,1,3,4};


    Zgodnie z tym przykładem ma to wyglądać tak, że pierwsza dioda ma świecić przez 5 sekund, następnie nie świecić przez 3 sekundy, znowu świecić przez 1 sekundę i zgasnąć na 2 sekundy. Druga dioda ma świecić przez 2 sekundy, zgasnąć na 1 sekundę, włączyć się na 3 sekundy i wyłączyć na 4 sekundy.
    Wszystkie te operacje mają być niezależne od siebie tzn., że jeśli jedna dioda świeci to druga też może świecić albo nie, w zależności od tego ile aktualnie upłynęło czasu.
    Mam nadzieje, że w miarę jasno to opisałem.
    Nie mam ogromnej wprawy w programowaniu, ale znam podstawy, oczywiście największy problem jest z tym, jak zrobić, żeby te dwie operacji wykonywały się równocześnie (oczywiście procesor nie obsługuje wątków) a raczej pseudo równocześnie, ale żeby wrażenie zewnętrzne było właśnie takie, że jest to wykonywane niezależnie od siebie. Będę bardzo wdzięczny za każdą pomoc.

    0 3
  • #2 05 Maj 2010 21:30
    Dr.Vee
    VIP Zasłużony dla elektroda

    Najprostszy koncepcyjnie sposób polega na utworzeniu timera "single shot" dla każdej diody osobno. Po upływie zadanego czasu timer wywołuje funkcję z parametrem void*/metodę klasy, która śledzi stan obiektu i ustawia kolejny timeout. Wtedy pozostaje tylko zaimplementowanie kolejki timerów, czyli który powinien wykonać powiązaną funkcję/metodę w zadanym czasie.

    Przykładowo (kod w C99):

    Code:
    struct led {
    
        unsigned ledId;
        bool isOn;
        size_t currentIndex;
        size_t tableSize;
        unsigned* timeoutTable;
    };

    // typ funkcji wywoływanej przez timer
    typedef void (*timerCallback)(void*);

    // struktura przechowująca dane timera
    struct timer {
        unsigned timeout;
        timerCallback callback;
        void* callbackArg;
    };

    // funkcja rejestrowana w timerze
    static void ledTimeout(void* arg)
    {
        struct led* = arg;
        toggleLed(led);
        // zarejestruj funkcję od nowa, z nowym timeoutem.
        timerSchedule(led->timeoutTable[led->currentIndex], ledTimeout, led);
        led->currentIndex += 1;
        led->currentIndex %= led->tableSize;
    };

    Pozdrawiam,
    Dr.Vee

    0
  • #3 05 Maj 2010 21:45
    nsmarcin
    Poziom 12  

    Wszystko ładnie tylko to trochę zbyt skomplikowane, to powinno się dać zrobić na najprostszych funkcjach (for, if,...). Ten czas to oczywiście nie musi być idealnie w sekundach to może być nawet tak, że 1sekunda to jeden takt procesora. Myślałem o tym, żeby wstawić jeden wspólny zegar (np. zmienną, która w każdym kroku zwiększa się o jeden) i od wartości w tabeli odejmować wartość zegara i jeśli jest =0 to wtedy zmieniać na przeciwny stan i znowu liczyć. Tylko nie wiem jak to zgrać z dwoma tabelami naraz, tak, żeby jak skończy liczyć dla zerowego elementu drugiej diody i zacznie liczyć dla pierwszego elementu tej diody, to, żeby liczył jeszcze dla zerowego elementu pierwszej diody( odwołuję się tutaj do przykładu, który podałem wyżej, gdzie pierwsza dioda świeci 5sek a druga 2sek i jak druga już zgaśnie tzn zegar będzie liczył czas wyłączenia dla tej drugiej diody to jednocześnie ma liczyć dalej czas świecenia dla pierwszej diody).

    0
  • #4 05 Maj 2010 22:07
    Dr.Vee
    VIP Zasłużony dla elektroda

    Zrób porządnie, to się czegoś przynajmniej nauczysz.
    Zrób na "for" "if" i 10 zmiennych to być może zaliczysz ćwiczenia (na 3-), ale programowanie to żadne - dodanie kolejnych 5 diod będzie problemem nie do przezwyciężenia...

    Dr.Vee

    0
  Szukaj w 5mln produktów