Jak urychlit vzorkovaci smycku
xmates@post.cz
xmates
Středa Březen 17 11:43:33 CET 2004
Zdravim
Pridavam nekolik poznamek k diskusi okolo pripojeni
tepl. cidla k PC pres paralelni port. Predem
upozornuji, ze se dopoustim znacneho zjednoduseni,
nebot cela problematika je preci jenom ponekud
komplikovana.
1) Skutecne nejrychlejsi metodou pro sber dat budou
retezcove instrukce s prefixem rep. Je treba si
vsak uvedomit, ze s rychlejsim procesorem se bude
rozdil mezi smyckou s loop a instr. s rep stirat.
To je zpusobeno tim, ze tech par instrukci vyjma
in ve smycce s loop muze (pisi muze) na Pentiu
trvat nekolik desitek ns. Rozhodujici je v tomto
pripade doba trvani instrukce in. Tato doba je
jednak dana casovanim sbernice ISA, jednak odezvou
bridge PCI-ISA, zaneprazdnenim lokalni sbernice
atd., a kolisa okolo 1us (bezne cca. +4/-0.5 us).
U 286/386 bude smycka s loop znacne pomalejsi,
okolni instrukce jiz nejakou tu us trvaji.
2) Existuje figl, kterym se da 8bit. retezcova instrukce
pristupujici na ISA jeste urychlit. Spociva v tom,
ze se provede 16bit. instrukce, ktera ma casovani
bezne o polovinu kratsi nez 8bit. Periferie vsak
musi odpovedet signalem /IOCS16 na ISA.
Situace je asi takovato (std. nastaveni cek. stavu):
instrukce periferie akce
/IOCS16
in al,dx 1 6 taktu ISA / jeden
cyklus cteni
in al,dx 0 3(6) takty ISA nebo
take vubec nic ;-)
in ax,dx 1 periferie neni 16bit.,
provedou se dva cykly
cteni v delce 2x6
taktu ISA
in ax,dx 0 periferie je 16bit.,
provede se jeden cyklus
cteni v 3 taktech ISA
Pri shozeni wait stavu se casy samozrejme
jeste zkrati.
V pripade paralelniho portu (8bit. periferie)
je treba udelat hw zasah (nekolik IO),
takze tato metoda asi nepripada v uvahu.
3) Je celkem jasne, ze povolene preruseni
muze zpusobit prodlevu mezi vzorky. Prodleva
se vsak muze objevit i pri zakazanem preruseni
(viz 4)!
4) Samozrejme zalezi na tom, v jakem modu procesor
bezi. V real modu je situace pomerne jednoducha
a plati vyse uvedene. V chranenem modu (at uz
16b TSS nebo 32b TSS) je situace znacne komplikovana
a zalezi na provozovanem operacnim systemu, co
spustene aplikaci dovoli. V rezimu V86 (ma vlastni
TSS, napr. DOS okno pod WIN) muze byt situace
jeste komplikovanejsi.
A) Hororovy priklad toho, jak muze vypadat preruseni
v V86 (jedna z mnoha variant):
V okamziku pozadavku o preruseni se procesor
prepne z V86 do chran. rezimu (pres deskriptor
IDT). Simuluje se 8086 preruseni, prejde se do
V86 na obsluhu preruseni. Ta se provede, iret
zpusobi vyjimku, nasleduje navsteva chran. rezimu,
simulace IRET pro V86 a navrat do V86, kde se
pokracuje v prerusenem V86 procesu.
B) Situace s instrukcemi in/out muze byt podobna
(pokud jsou hlidany pres vyjimku, WIN). Pokud
neni in/out hlidano, jsou instrukce in/out
provadeny bezprostredne, coz by mel byt bezny
stav paralelniho portu pod WIN .
5) Z bodu 1..4 lze odvodit, ze:
A) Pokud to jde, pouzijte rep ins? a nasledne
sw zpracovani. Hlidani hran prerusenim
bude jak v real tak V86 modu stejne nepresne.
B) Vyvarujte se V86 modu pod multitask. systemem.
I kdyz nechate bezet pouze Vas proces (V86),
musite pocitat s tim, ze si jadro systemu
cas od casu (bezne nekolik des. ms) ukradne
kousek toho casu (pocital bych s asi 1 ms).
Tedy vzorkovat to bude stejne rychle, ale je
zde nebezpeci vypadku! V realu muzete bezet
pouze v pripade, ze se vyvarujete EMM386 (apod.)
a ve zvlastnich pripadech i HIMEMu. Pokud Vam
vsak ten 1MB v realu nestaci, s klidem muzete
EMM386 spustit a jit do V86, nebezpeci vypadku
vam nehrozi (doufam, ono prijde na to), instr.
in/out nejsou zachytavany a vzork. bude stejne
rychle jako v realu nebo V86 pod WIN.
6) Otazkou je, na co vlastne potrebujete tak rychle
vzorkovani u cidla s tak velkou setrvacnosti ?
Pokud Vam staci pouze nekolik desitek odmerenych
teplot za 1s, doporucuji nevyhledavat v namerenych
datech jednu periodu a z ni zjistovat stridu, ale
jit na to obracene:
Navzorkuje instrukci rep insb 64k vzorku, vyhle-
dejte v nich prvni a posledni nabeznou hranu.
Pokud prvni a posledni hrana nebude tataz, mate
zaruceno, ze je mezi nimy n>0 period signalu se
zanedbatelne se menici stridou. Pokud nyni v
tomto intervalu sectete pocet 1 a 0, dostanete
dosti presne prumernou stridu signalu. Zadne
preruseni, zadne zvlastni pozadavky na rychlost
vzorkovani (tady by se dalo trochu teoretizovat),
doba mereni je nejakych par desitek ms.
Musite pouze zajistit, aby behem vzorkovani nedoslo
k vetsi cas. prodleve mezi vzorky (to je prave
u WIN problem, viz 5B).
Zdravi Mates
PS: Omlouvam se za body 1 az 4, nebijte me.
Další informace o konferenci Hw-list