Posted By: dzemen () on 'CZprogram'
Title: Re: Jak se dostat pod 55ms?
Date: Thu Feb 21 08:12:45 2002
Vim, ze mezitim se to vyresilo jinak, ale jenom pro poradek, jak se da dostat
vicemene presne na milisekundy - postup z crt.pas:
1) Zjisti aktualni hodnotu citace casovace na adrese 0000:046C (4 byty)
2) cekej na zmenu hodnoty citace casovace v cyklu, po zmene pokracuj dale
3) vynuluj hodnotu promenne cycles_for_one_ms
4) cekej na zmenu hodnoty citace casovace, v kazdem cyklu pricti
jednicku k cycles_for_one_ms
5) vydel cycles?for?one?ms 55, dostaneme hodnotu pro 1 ms
No, a pak je to jednoduche. Pokud chci cekat treba 12 ms, provadim
cyklus z bodu 4) tak dloho, dokavad je pocitadlo mensi nez
12*cycles_for_one_ms. Pricemz hodnota citace casovace uz me v tomto pripade
samozrejme nezajima.
Mimochodem: Tenhle postup v assembleru pouzival 16-bitovy registr (CX) pro
deleni pocitadla (ktere je ale longint) hodnotou 55 , proto se objevil
znamy Pentium-II bug - hodnota cycles_for_one_ms na konci kroku 4) byla totiz
tak velika, ze po vydeleni 55 se nevesla do vysledkoveho 16-bitoveho registru
a to procesor interpretuje jako deleni nulou (INT 00h).
Pokud je to jen trochu mozne, doporucuji pouzivat instrukci RDTSC (alespon
myslim, ze se tak jmenuje) - ale ta je az od Pentii a nevim jak AMD
a Cyrix (ten ji nemel, nevim jestli uz ma), nebo
QueryPerformanceCounter (Win).
Dzemen.
P.S.: Tenhle postup samozrejme nepocita s rezii samotnych instrukci pro
nastaveni promenne cycles_for_one_ms, ale to je vicemene zanedbatelne
pokud se bavime o presnosti na milisekundy.