RTV forum PL | NewsGroups PL

Jak efektywnie zarządzać różnymi pomiarami czasowymi na AVR z użyciem wątków lub linijki czasowej?

coś w rodzaju prostych wątków na AVR

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak efektywnie zarządzać różnymi pomiarami czasowymi na AVR z użyciem wątków lub linijki czasowej?

Sebastian Bialy
Guest

Sat Oct 16, 2004 4:07 pm   



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".

2. 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.

--
Sebastian Bialy - heby@poczta.onet.pl

Jarek Andrzejewski
Guest

Sat Oct 16, 2004 5:10 pm   



On Sat, 16 Oct 2004 19:07:51 +0200, Sebastian Bialy
<heby@poczta.onet.pl> wrote:

Quote:
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.

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.

Quote:
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".

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

Quote:
2. 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 Wink

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 :-)

Quote:
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.

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.
--
pozdrawiam,
Jarek Andrzejewski

Sebastian Bialy
Guest

Sat Oct 16, 2004 5:10 pm   



Piotrek Sz. wrote:
Quote:
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.

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

--
Sebastian Bialy - heby@poczta.onet.pl

Piotrek Sz.
Guest

Sat Oct 16, 2004 7:07 pm   



Sebastian Bialy <heby@poczta.onet.pl> napisał(a):

Quote:
Witam!

...
2. 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 ;)

...


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.


--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

jerry1111
Guest

Sat Oct 16, 2004 8:30 pm   



On Sat, 16 Oct 2004 19:07:51 +0200, Sebastian Bialy
<heby@poczta.onet.pl> wrote:

Quote:
wątków musiałbym korzystać z gotowca (i to do wykorzystania komercyjnego
...). A może ma ktoś jakiś przyjemny pomysł implementacji podobnego
systemu ?

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.


--
Jerry

Sebastian Bialy
Guest

Sat Oct 16, 2004 9:07 pm   



jerry1111 wrote:
Quote:
wątków musiałbym korzystać z gotowca (i to do wykorzystania komercyjnego
...). A może ma ktoś jakiś przyjemny pomysł implementacji podobnego
systemu ?

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.

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).


--
Sebastian Bialy - heby@poczta.onet.pl

Jan Dubiec
Guest

Sat Oct 16, 2004 9:18 pm   



On Sat, 16 Oct 2004 18:07:31 +0000 (UTC), "Piotrek Sz." <zumek@WYTNIJ.gazeta.pl> wrote:
[.....]
Quote:
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.
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.
--
Jan Dubiec, jdx#slackware.pl, mobile: +48 506 790442

Głęboka wiara wymaga płytkiego rozumu i nikłej wiedzy.

Jan Dubiec
Guest

Sat Oct 16, 2004 9:39 pm   



On Sat, 16 Oct 2004 19:07:51 +0200, Sebastian Bialy <heby@poczta.onet.pl> wrote:
[.....]
Quote:
2. Wątki. To jest trudne i dość spory narzut na przekładanie co chwile
rejestrów na stosie.
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.

Quote:
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 ?
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.
--
Jan Dubiec, jdx#slackware.pl, mobile: +48 506 790442

Głęboka wiara wymaga płytkiego rozumu i nikłej wiedzy.

Marek Dzwonnik
Guest

Sat Oct 16, 2004 10:03 pm   



Użytkownik "Sebastian Bialy" <heby@poczta.onet.pl> napisał w wiadomości
news:cks63c$652$1@atlantis.news.tpi.pl

Quote:
W ogólności być może pobawie się wątkami, ale na dzień dzisiejszy
składniam się ku linijce czasowej.

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ę ;)


--
Marek Dzwonnik, GG: #2061027 - zwykle jako 'niewidoczny'
(Uwaga Gadu-Gadulcowicze: Nie odpowiadam na anonimy.)

Arek Karas
Guest

Sun Oct 17, 2004 10:29 am   



Quote:
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 Sad

Zobacz to: http://www.avrfreaks.net/Tools/showtools.php?ToolID=353
To jest to, czego Ci potrzeba, i to nawet pod gcc.

Pozdr
AK

Piotr Stawicki
Guest

Sun Oct 17, 2004 5:55 pm   



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 www.ethernut.de .
Dokumentację czyta się w pół godziny i można zacząć pisać.

Piotr

www.elitel.pl - produkcja i projektowanie systemów sterowania
-------------------------------------------------------------------------
Modemy g.shdsl Focus 4.6mbps:
http://www.elitel.pl/produkty1.php
Systemy Progressive Jackpot dla kasyn:
http://www.elitel.pl/produkty2.php

J.F.
Guest

Sun Oct 17, 2004 6:46 pm   



On Sat, 16 Oct 2004 19:07:51 +0200, Sebastian Bialy wrote:
Quote:
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.

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" ..

Quote:
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.

No to tym bardziej podejscie typu powyzej ..

J.

Piotr Wyderski
Guest

Sun Oct 17, 2004 9:54 pm   



Sebastian Bialy wrote:

Quote:
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".

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...).

Quote:
2. Wątki. To jest trudne

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

Quote:
Zanim wybiorę metodę implementacji zadam typowe pytanie: co lepsze.

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

Pozdrawiam
Piotr Wyderski

Piotr Wyderski
Guest

Sun Oct 17, 2004 10:05 pm   



Sebastian Bialy wrote:

Quote:
Najłatwiej było by blokować przerwania, ale jakieś to nieeleganckie.

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. :-)

Quote:
No i ta duża ilośc
rejestrów do przechowania na stosie, a sam stos malutki Sad

No widzi babcia? ;->

Pozdrawiam
Piotr Wyderski

peters
Guest

Mon Oct 18, 2004 6:35 am   



Quote:
2. 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 Wink

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

peters

elektroda NewsGroups Forum Index - Elektronika Polska - Jak efektywnie zarządzać różnymi pomiarami czasowymi na AVR z użyciem wątków lub linijki czasowej?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map