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