Pisal moze ktos w asm 86 procedurke, która odmierzala krotkie odcinki czasu < 1 ms ? Oczywiście chodzi o PCty. Konkretnie chodzi o wystawianie na złaczu RS odpowiednich stanów w określonym czasie.
Krotkie odcinki czasu w PC
Nov 15, 2004
21 Replies
Kris napisał(a):
Pod DOS-a nie powinno być problemu, trzeba tylko dobrać opóźnienie dla konkretnej częstotliwości procesora.
Użytkownik Maksymilian Dutka napisał:
Witam W swoich programach "zatrudniałem" do tego celu timer systemowy 8254 zaszyty w chipsecie płyty głownej. jest to o tyle lepsze rozwiązanie, że czas nie zależy od prędkosci procesora. Metoda ta też nieźle sprawdza się w windowsach z serii 9x
Grzegorz Kurczyk napisał(a):
Ale poniżej 1ms to tak nie zajdziesz.
Pod win2k można robić pętelkę zależną od wyniku funkcji QueryPerformanceCounter. I liczyć na to że Twoje zadanie nie zostanie w brutalny sposób przerwane. Poniżej 1ms się da spokojnie.
TP.
Niestety - nawet w czasie dzialania procesu z priorytetem Real Time, niewywlaszczanego - kursor sie rusza a system na pingi odpowiada :-(
J.
NO ja się z tym zgadzam, pod windą nigdy nie da się odmierzyć dokładnie jakiegoś odcinka czasu. Niemniej jednak używam tej funkcji do mierzenia czasu jakiś czynności - transferu DMA czy coś. Rozdzielczości są tu rzędu dziesiątek mikrosekund OIDP.
TP.
Jesli to ma chodzic na golej maszynie/pod DOSem, to skorzystaj z instrukcji rdtsc, ujawniajaca biezaca wartosc licznika cykli (bedziesz musial recznie wpisac albo zmierzyc czestotliwosc procesora). Jesli zas chodzi o Windows/Linuksa, to zapomnij, nie da sie.
Pozdrawiam Piotr Wyderski
Nie zakładaj, że się nie da, jeżeli się da.
Kwestia tylko wiedzy i czasu, który trzeba na to poświęcić. Polecam rozpoczęcie zabawy z Windows 2000/XP DDK. Z nim da się zrobić prawie wszystko, włącznie ze sterownikami blokującymi proca w 100% dla siebie na prawie dowolny czas.
Użytkownik Maksymilian Dutka napisał:
A niby czemu nie ? Na upartego to i 1us się odmierzy, ale nie będzie to już zbyt dokładne (tzn trzeba troszkę pokombinować)
nie da sie poswiecic 100% a trzeba :) Problem w przypadku systemow wielozadaniowych z wywlaszczaniem - takich jak windowzy wszelakie jest nie wygenerowanie odpowiedniego czasu a skorzystanie z wynikow tego generowania. Co z tego ze uda nam sie wymusic przerwanie sprzetowe np z 8245 skoro kierowane jest ono do jadra gdzie zostanie zamienione na komunikat ktory ''utknie'' w kolejce komunikatow docelowej aplikacji.
System Windows jest systemem wielozadaniowym z tak zwanym wyw³aszczaniem - co to oznacza ? Pomimo ¿e system przetwarza x procesów to tak naprawdê realizowany w danej chwili jest jeden i tylko jeden proces. Co ¶ci¶le wyznaczony czas zegar systemowy generuje przerwania kierowane do j±dra sytemu, a j±dro zawiesza wykonanie bie¿±cego procesu bez wzglêdu na to co w danej chwili proces robi i nie ma ¿adnej mo¿liwo¶ci zablokowania tego przerwania. Technikê tê nazywamy wyw³aszczeniem procesu. Pamietajmy tez ze system faworyzuje swoje wlasne procesy oraz obsluge systemu plikow i zaden proces nie wygra z obsluga dajmy na to menagera pamieci i zwiazanego z nim dyskowego pliku wymiany - a kazda operacja dyskowa to milisekundy. Reasumujac - nie jest mozliwe napisanie normalnej windosowej aplikacji ktora by kozystala z interwalow ponizej 1ms nie robiac tego kosztem innych programow i nie powodujac predzej czy pozniej braku stabilnosci systemu. Pozostaje albo przezucenie zadania na zewnetrzne urzadzenie albo system czasu rzeczywistego ktory pozwala na odpowiednie ksztaltowanie procesow. wojtek
formatting link
A w praktyce elektronicznej wygl±da to tak, ¿e gdy obserwuje siê na oscyloskopie impulsy np. na pro¶ciutkim programatorku pamiêci widaæ wyra¼nie ich rozmycie lewo/prawo, czyli ich d³ugo¶ci czasowe nie s± powtarzalne, lecz lekko fluktuuj± +/-. Jest tak nawet w okienku DOS pod Win9x. Te same obserwacje prowadzone gdy komp by³ wystartowany z dyskietki czystym DOS-em 6.22 pokazuj±, ¿e impulsy "stoj±" w miejscu jak zbój...
Roman
Odwrotnie, kwestia wiedzy jest uswiadomienie sobie faktu, ze pisanie sterownikow blokujacych wywlaszczanie na dluzszy czas jest calkowicie sprzeczne z filozofia systemow operacyjnych z rodziny Windows NT/Linuksa.
Adamie, pisaniem sterownikow zajmowalem sie przez kilka lat, w tym i pod wyzej wymienione systemy... :-)
Pozdrawiam Piotr Wyderski
Trzeba sobie kupic peceta z dwoma procesorami :-)
Ale to sie da napisac o bardzo duzej ilosci systemow i komputerow. W zasadzie to znam tylko jeden ktory to w miare potrafil - transputery. Nawiasem mowiac - przy zegarze 2GHz przelaczenie procesow powinno sie udac w czasie ok 1us :-)
O przepraszam - czemu ? Moze miec klopoty z odbieraniem danych z RS, ale poza tym powinien dzialac w miare dobrze ..
J.
Dziekuje za wszystkie odpowiedzi.
Na pocztaku tez myslalem o wykorzystaniu 8254. Aplikacja ma dzialac pod Windows. Chyba pozostaje jakis maly atmelek podlaczany na COM i wymiana informacji z nim.
Pytanie do Adama: Jak to rozwiazałes w swoim programie ISP Programmer? Prawdę mówiąc piszę coś bardzo podobnego. Edytor do asemblera i chciałem z nim zintegrować programator ISP. Obecnie mam to zrobione tak że z poziomu edytora wywołuję program dosowy z odpowiednimi parametrami i wszystko gra ale chciałbym to zrobić jako jedną aplikację.
bo w dosie pomiedzy programem a sprzetem nic nie ma a sam dos ma charakter uslugowy wzgledem aplikacji. w windach pomiedzy aplikacja a sprzetem jest COS a aplikacja urzytkowa jest w to COS wkomponowana - staje siê cze¶ci± tego CZEGOS. To COS rzadzi sie swoimi prawami na ktore normalny programista nie ma zadnego wplywu. Zaawansoany programista moze wplyw miec - pod warunkiem ze na placu boju nie spotka sie z innym zaawansowanym programsta :) Tylko karnel moze pernamentnie utrzymywac status realtime - inne procesy i owszem moga miec rowniez status realtime - ale maja szybciutko zrobic to co maja do zrobienia i spadac na szczaw inaczej system zdycha.
Pamietajcie o jednym jeszcze - x procesow, y operacji dyskowych, z sciezek na n talezach a fizyczny sterownik HDD tylko JEDEN !
wojtek
formatting link
Nijak bo problemu nie ma. Ze względu na działające inne procesy programowanie może być (i jest w rzeczywistości) wstrzymywane - i nie wynika z tego żaden problem. Co najwyżej taktowanie na ISP będzie znacznie wolniejsze, ale dla programowanych uC nie ma to najmniejszego znaczenia, czy SCK ma 100 kHz, czy 10 Hz. Z drugiej strony, dostępy do portu równoległego i tak są bardzo wolne (minimum kilkaset us, mierzyłem to jakiś czas temu w WinXP).
BTW: Porównywałem ostatnio szybkość programowania ATmega128 przez ISP i przez JTAG - protokół niby podobny, kabelek (LPT) i soft (własny) również, ale JTAG jest znacznie szybszy. Wynika to pewnie ze sposobu przepychania danych do programowanego uC, bo czas programowania (fizycznego) jednej strony pamięci Flash jest stały niezależnie od metody.
Mam rozumiec, ze jesli bede pisał program w asmie i linijka pod linijka umieszcze rozkazy przykładowo utaw SCK i wyzeruj SCK przez odwolanie sie do portów (gdzie sck to jeden z bitów LPT) to ta zmiana nastapi po czasie minimum kilkaset us?
To po co w takim razie opcja wyboru kwarcu w twoim programie?
A z tym JTAGiem to ciekawa sprawa.
Tak to wyglada w Windows XP. Nie wiem, z jaka predkoscia wynik dzialania instrukcji 'out' propaguje sie na port w DOSie.
Bo nie moge polegac na aktualnym "widzimisie" Windozy (a moze i calego peceta - sprawdzal ktos ile trwa 'out' na LPT w czystym DOSie?). Opoznienia czasowe opieram na funkcji QueryPerformanceCounter. Wprowadze w przyszlosci mozliwosc wylaczenia dodatkowych opoznien, jezeli to mialoby przyspieszyc programowanie.
Poza tym mozesz zachciec popedzac AVRa np. z zewnetrznego generatora 100 kHz albo kwarcu 32,768 kHz - wtedy miedzy kolejnymi zboczami transmisji ISP trzeba nieco wiecej poczekac.
Nie wiem jak by to wyszlo na wspolczesnych maszynach :) jak robilem myki w czasach AT to lpt zawsze rzadzilo sie tymi samymi prawami co ISA - czyli takt 8MHz z mozliwoscia podkrecenia w chipsecie.
W miare stabilny transfer ok 1kHz mozna uzyskac synchronizujac sie w watku instrukcja sleep
repeat sleep(1); // zawiesza dzialanie watku na 1ms cos_do_portu index_i_warunek_konca until 1=0;
Oczywiscie w odrebnym watku i oczywiscie jesli nie ogladasz jednoczesnie filmu z divxa
Dla wiekszych predkosci kombinowalem kiedys z funkcja testujaca inkrementacje licznika w petli w czasie 1 sec wyznaczonej przez zegar systemowy aby wyznaczyc sredni czas trwania watku bez opoznienia - ale nie skonczylem tego wiec nie wiem jak to zadziala.
Jeszcze jedna uwaga odnosnie programu dosowego w sesji windowsa - koniecznie trzeba dla niego stworzyc pifa i wylaczyc w nim wykrywanie bezczynnosci - jesli windows stwierdza ze dosowy program nie korzysta z myszy ani z klawiatury to system traktuje go jako nic nie robiacego i odebiera mu przydzielony czas !
wojtek
formatting link
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required