assembly kod

Szoke Szilard-Zsigmond szilu at bartok.ro
Sun Oct 19 23:43:32 CEST 2003


From: "Kovy" <janos at kovy.hu>
> Most PC-re kellene egy apró kódrészlet, melyet C++ fájlba illesztenék.

> A beillesztés megy, a kódrészlet nem. A probléma az, hogyan
> tudok idõzíteni microsecundum értékeket, hogy real time
> kezelhessem a párhuzamos porton érkezõ órajeleket.
>
> Mivel windows98 alatt az impulzusok egy része hiányos,
> szükség lenne egy letiltáskezelõ részletre is. Tehát amikor
> jönnek a pulzusok, ezerrel rajta legyen a progi és számolja
> pontosan a pulzusszélesség hosszát v. idejét. Csak ennyi lenne.

Hello.

Osztom Balla Zoltan velemenyet, szerintem is igencsak huzos lesz a dolog
oprendszervaltas nelkul. Sot, talan meg azzal is.
Eddig csak "pontos" idozitesu jelgeneralassal probalkoztam a PC
parhuzamos portjan (SPP es EPP modokban), beolvasott jel "pontos"
idotartammeresevel nem, de nagyjabol egykutya. DOS alatti C es Pascal
valos modu programocskakkal van tapasztalatom, a Windows API-jahoz nem
fordultam hardverszagu ugyekben, meg viccbol sem (ha esetleg valakinek
pozitiv tapasztalata lenne, irja meg pls.). Mellesleg nehany heten belul
mar Linux alol kellene kiismernem a kulso hardver ohajait... Remelem az
megbizhatobb lesz.

Eddigi tapasztalat:

1. a Windows, bar ugy tunik, hogy a DOS ablakban eloterben futo
programok megkapjak a processzorido legnagyobb reszet, elegge
szaggatottan futnak. Vagyis mondjuk masodpercenkent haromszor teljesen
leallnak, amig a win el nem vegzi a dolgat, azutan ismet futnak. A
szunet olyan 0.1-0.2 masodperc koruli, ha kozben a win "semmit nem
csinal". Ha valami esetleg tortenik kozben az LPTre kotott kutyuvel, azt
ugye a DOSos programod nem fogja idoben eszrevenni. Vagy pl. ha
"RC-servo"-nak akarsz parancsolni, mint en, az parkinsonos lesz.

2. Valamikor MSAccess97-ben Windows98 alatt keszitettem egy olyan
felhasznaloi feluletet, amelyik egy adatbazisban keresgel a beiras alatt
levo szoveg alapjan, minden egyes bepotyogott billentyu utan ujrakeres
es frissiti a "matching record"-okat (valahogy ugy, mint a Winamp "Jump
to file"-ja). Nos, az Access valodi windowsos program, megis a szapora
billentyuleutesekre a program reakciojabol lehetett latni, hogy azert o
is megtorpanasokkal fut (nem, nem a kereses sebessegen mulott a reakcio
kesedelme, hanem a win eppen felfuggesztette volt a futast ~0.1-0.2
mp-re - legalabbis igy tunt). Szoval azt tippelem,
hogy win-es proggival sem fog sikerulni a mikroszekundumra pontos meres.

3. Esetleg meg lehetne probalni VXD-t irni, ehhez viszont szoljon hozza
mas, en nem ertek hozza.

4. A DOS sokkal kiszamithatobb, mint a Win98. Elso korben szerintem sima
DOS alol erdemes probalkozni - ha lehetseges. Nehanyszor volt ugy, hogy
egy-ket lefuttatas utan a win nem engedte hozzaferni a portokhoz a
programomat. Olyankor be kellett csukni a DOS boxot, es ujat nyitni,
aztan nagy valoszinuseggel megint ment. Nagy ritkan csak a Reset
segitett. Pedig igazan igyekeztem nem csinalni kenyes dolgokat a
portokkal :)  ...

5. Attol fuggetlenul, hogy a programod megszakitasvezrelt (vagyis a
kulso esemeny general megszakitast az /ACK labon) vagy nem (egyfolytaban
fut a fociklusod es olvassa a portokat) meggyulhet a bajod a PC
oramegszakitasa(i)val. Ugyanis ha a programod ugy szamol, hogy megnezi,
hanyszor tudott egy ciklust vegrehajtani, akkor ugye evidens, hogy ha
bejon egy oramegszakitas (nem beszelve a merevlemez vagy a floppy
kiszolgalasarol) a szamolas kozepette, kevesebbet fogsz szamolni a
valodinal. Letiltani a megszakitasokat nem ildomos, ha hosszu
intervallumot szamolsz.

6. Megsem annyira remenytelen a dolog, ugyanis ha a TSC-t hasznalod fel
idomeresre (valoszinusitem, hogy Pentium vagy jobb procin fog futni),
mar sokkal jobb eselyekkel indulsz. Nemi korultekintessel es a
megszakitasok tiltasaval nekem sikerult ~1.5uSec pontossaggal jeleket
generalni (ket egyszeru robothoz kellett  :) , a licista taborozoinknak
sikerult nehany nap alatt osszehozniuk oket HW+SW, ugyhogy nem tul
komplikalt ). Viszont ennel pontosabbra nem nagyon lehet menni a PC
parhuzamos portjaval, mert az belulrol az ISA buszra van kotve. Pl. az
illeszto egy portjara a teljes irasi vagy olvasasi ciklus (IN, OUT
utasitasok) 0.8-2uSec-ot tart, alaplaptol fuggoen, de fuggetlenul a
proci sebessegetol! Es ezt mar akarhogy trukkozol, nem tudod megkerulni,
barmilyen oprendszerrel es ugyes programmal...
Ja, a TSC csak valos modban (DOS, emm386 _nelkul_) elerheto a
felhasznaloi programok szamara, vedett modban nem tudod olvasni, a Win
pl. protection fault-al allitja le a programot. Linux alol nem tudom, mi
a helyzet.

Kovetkeztetes: ha PC-vel akarsz mikroszekundum pontosaggal idot merni, a
kov. lehetosegeket latom:
A. "dedikalt" PC (DOS, megszakitasok kikapcsolva, TSC olvasassal)
B. normal hasznalat alatt allo PC, "multitasking" (pl.Win98), soros
porton log egy mikrokontroller, aki mer :)
C. normal hasznalat alatt allo PC, "multitasking" (pl.Win98), parhuzamos
porton log egy n-bites (n=8,16,24...) szamlalo amit kvarc leosztott
orajelelor hajtasz meg, a kulso esemeny pedig a szamlalo
inditasa/megallitasan kivul egyuttal megszakitast is general a PC fele.

Valaszthatsz kozuluk.  :)     De hatha valaki javasol jobbat.
Kommentaraitokat es ellenvelemenyeiteket varom.

Udv
    Szilard






More information about the Elektro mailing list