coś w rodzaju prostych wątków na

Witam!

Pewne urządzenie pomiarowe wymaga realizacji wielu różnych pomiarów w różnych odstępach czasowych. Odstępy nie są niestety z sobą zsynchronizowane (np. jeden pomiar co 3 jednoski czasu inny co 5 a inny co 751). Ponadto niektóre z pomiarów wymagają konstrukcji typu: wyślij-poczekaj-odbierz.

No i jest to dość kłopotliwe do implementacji. Widze dwa rozwiązania:

  1. "Linijka czasowa" i możliwośc wywoływania określonych procedur w określonych momentach. Np. dana procedura może zapisać do linijki czasowej polecenie "wywołaj mnie za 15 sekund".

  1. Wątki. To jest trudne i dość spory narzut na przekładanie co chwile rejestrów na stosie. Jednak dosc eleganckie i przyjemne w użyciu jeśli się już to ma ;)

Zanim wybiorę metodę implementacji zadam typowe pytanie: co lepsze. Zakładam, że linijkę czasową sam sobie naskrobie, natomiast w przypadku wątków musiałbym korzystać z gotowca (i to do wykorzystania komercyjnego ...). A może ma ktoś jakiś przyjemny pomysł implementacji podobnego systemu ?

W zasadzie całośc jest mało krytyczna czasowo, ważne jest aby statystycznie dany proces w określonym czasie był wywołany założoną ilośc razy. Róznica w czasie wywołania rzędu paru procent nic nie zmienia.

Reply to
Sebastian Bialy
Loading thread data ...

Sebastian Bialy snipped-for-privacy@poczta.onet.pl> napisał(a):

..

..

Nie napisałeś jaki proc masz na myśli ale na ATMega32 chodzą sobie 4 niezależne procesy i przełączanie procesów sprowadza się do zmiany wskaźnika stosu.

Pzdr. Piotrek Sz.

Reply to
Piotrek Sz.

zapisuj w jakiejś strukturze pary "czas-wskaźnik do procedury". W pętli przeglądaj teś strukturę i porównuj "czasy" z bieżącym czasem i (jeśli już czas) wywołuj procedury. Na końcu procedury wywołaj dopisanie kolejnej pary do struktury.

ten opis powyżej to chyba właśnie to

nic nie napisałeś o procesorze, który to wykonuje. I '51 i P4 Extreme mogą obsługiwać zadania pomiarowe, a możliwości jednak nieco różne :-)

jeśli żadna procedura nie wykonuje się na tyle długo, aby wprowadzane przez nią opóźnienie mogło mieć znaczenie, to moja propozycja powinna być OK.

Reply to
Jarek Andrzejewski

Za mało - interesuje mnie koło 8-10 wątków równoległych.

Reply to
Sebastian Bialy

Dlaczego komercyjnie? Napisalem sobie cos takiego sam (przelaczanie watkow na przerwaniu od timera) i na dodatek watki same sobie okreslaja ilosc potrzebnych dla nich jednostek czasu. Co prawda nie na AVR tylko na Toshibe TLCS900, ale idea pewnie taka sama bedzie.

Reply to
jerry1111

Hmmm... Napisanie własnoręcznie wątków powoduje że apetyt rośnie w miarę jedzenia ... Po pierwsze proste przełaczanie wątków jest ok, ale u mnie wątki będą czekać (sleep(xxx)) i należało by to jakoś sprytnie rozwiązać, żeby w tym czasie dać innym wiecej czasu - aż sie prosi o zarządzanie wątkami. Po drugie: trzeba jakoś sensownie zreazliwać operacje atomowe - wszak pamięć współdzielona. Najłatwiej było by blokować przerwania, ale jakieś to nieeleganckie. No i ta duża ilośc rejestrów do przechowania na stosie, a sam stos malutki :(

W ogólności być może pobawie się wątkami, ale na dzień dzisiejszy składniam się ku linijce czasowej. Ma to swoje wady, ale szybciej zrobie niż wątki (ponadto jakoś wole pisać w gcc i muszę sie dokłądnie wgryzać w dokumentacje, żeby niczego nie popsuć przy przełaczaniu wątków).

Reply to
Sebastian Bialy

On Sat, 16 Oct 2004 18:07:31 +0000 (UTC), "Piotrek Sz." snipped-for-privacy@WYTNIJ.gazeta.pl> wrote: [.....]

No i co, zawartość rejestrów nie jest odtwarzana??? Bieżący wątek używa takiego stanu jaki zostawił poprzednio wykonywany wątek? :-)

Regards, /J.D.

Reply to
Jan Dubiec

On Sat, 16 Oct 2004 19:07:51 +0200, Sebastian Bialy snipped-for-privacy@poczta.onet.pl> wrote: [.....]

E tam, przełączanie kontekstu to jest chyba najprostsze zagadnienie związane z wielowątkowością. Znacznie trudniejszym problemem jest decyzja kiedy należy to zrobić i który wątek ma być wykonywany jako następny.

Słowa kluczowe do poszukiwań: Nut/OS, FreeRTOS, XMK. Z produktów komercyjnych: uC/OS-II, Nucleus, pSOS i jeszcze kilkanaście a może i dziesiąt innych.

regards, /J.D.

Reply to
Jan Dubiec

Użytkownik "Sebastian Bialy" snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:cks63c$652$ snipped-for-privacy@atlantis.news.tpi.pl

Obejrzeć źródła Keil-owskiego RTX-tiny (na '51-kę) i napisać coś na wzór i podobieństwo? RTX-tiny zawiera przełączanie wątków "w kółko Macieju" (round-robin), wywłaszczanie z wykorzystaniem przerwań od timera, usypianie wątku na zadany czas i prostą sygnalizację międzywątkową. Wątków może być max.16. Duża wersja RTX-a to przerost formy nad treścią, ale AFAIR "tiny" nie zżera przesadnie dużo zasobów a przy tym działa. Przeniesienie na ATMegę to trochę pracy do włożenia, ale pewnie mniejszej niż w drugą stronę ;)

Reply to
Marek Dzwonnik

Zobacz to:

formatting link
jest to, czego Ci potrzeba, i to nawet pod gcc.

Pozdr AK

Reply to
Arek Karas

Myślę że optymalna implementacja dla takiego zadania będzie polegała na ustawieniu timera na przerwaniach który odmierza czas i wedle gustu piszącego albo inkrementuje wspólny licznik czasu dla wszystkich zadań albo dekrementuje odzzielne liczniki dla każdego zadania aż do osiągnięcia zera.

Do tego jedna pętla, która sprawdza stan licznika lub liczników i wywołuje odpowiednie procedury.

Jeżeli jednak zdecydujesz się na bardziej eleganckie i skomplikowane rozwiązanie wykorzystujące wielowątkowość to gorąco polecam darmowe oprogramowanie "nutos" dostępne na stronie

formatting link
. Dokumentację czyta się w pół godziny i można zacząć pisać.

Piotr

formatting link
- produkcja i projektowanie systemów sterowania

------------------------------------------------------------------------- Modemy g.shdsl Focus 4.6mbps:

formatting link
Progressive Jackpot dla kasyn:
formatting link

Reply to
Piotr Stawicki

A duza ta jednostka czasu i "poczekaj" powyzej ?

Bo zazwyczaj da sie to zalatwic przez cykliczne wywolanie procedur, a procedura sama zliczy czy powinna cos zrobic czy nie tym razem, ewentualnie czy nie jest to faza "poczekaj" ..

No to tym bardziej podejscie typu powyzej ..

J.

Reply to
J.F.

Zakładam, że "poczekaj" jest znacznie dłuższe niż wykonanie jednej jednostki czasowej. Własnie chodzi o to, żeby "wątek" (w tym przypadku to naciągana nazwa) nie oczekiwał aktywnie. Można to łatwo zrobić na linijce czasowej.

Coś właśnie w tym guście. Niestety jest mały problem - obawiam się, że na wszystkie struktury zabraknie RAMu :(

Reply to
Sebastian Bialy

No i czego wiecej Ci trzeba? Jesli to maly AVR, to nigdzie nie zmiescisz stosu dla wielu watkow, a w przypadku, jak to nazywasz, linijki czasowej, nie masz problemu z powtornym wykorzystaniem pamieci, przeplotami, synchronizacja "miedzywatkowa" itd. Przeciez nawet nowoczesne systemy operacyjne implementuja badanie czasu wyczerpania oczekiwania na semafor wlasnie w ten sposob (tylko "linijka" jest ciut bardziej skomplikowana, bo przy np. kilku tysiacach obiektow oczekujacych proste badanie wartosci licznikow byloby cokolwiek kosztowne...).

Nie jest trudne, ale to nawet nie jest armata na muche -- to jest bron termojadrowa. :-)

To, co sie zmiesci. :-) A stosy watkow sie nie zmieszcza, jesli dopuszczasz ich jakies sensowne glebokosci.

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Blokowac wywlaszczanie, a nie przerwania. Sa dwie flagi, W(ywlaszczanie_dopuszczalne) oraz O(czekujace_wywlaszczanie). Procedura obslugi przerwania sprawdza, czy jest ustawione W. Jesli tak, to przelacza kontekst. W przeciwnym przypadku ustawia O. Gdy sie zwalnia dostep do sekcji krytycznej, to sprawdza sie O -- jesli jest ustawione, to sie przelacza "opozniony" kontekst. Przelaczanie kontekstu tylko przy wylaczonych przerwaniach. Cooperative multithreading, po prostu. :-)

No widzi babcia? ;->

Pozdrawiam Piotr Wyderski

Reply to
Piotr Wyderski

Wejdz na strone kompilatora CodeVision. Oni chyba sprzedaja tez prosty system czasu rzeczywistego na AVR-y.

peters

Reply to
peters

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.