2012-07-19 13 views
5

x86 przerwać 0x1a wydaje się dawać zegara komputera, ale może tylko dać dokładny czas, aby w ciągu 55ms (AH = 0). Czy istnieje sposób na uzyskanie mniejszych przyrostów (i być może nieco bardziej "normalnych") niż na przykład 1ms? Próbuję stworzyć własny system operacyjny dla zabawek, więc nie mogę użyć niczego, czego sam nie potrafię napisać.uzyskać czas w przyrostach 1ms

Odpowiedz

3

Ponieważ tworzysz swój własny system operacyjny, nie musisz utrzymywać okresu timera. Istnieje możliwość przeprogramowania PIT w celu częstszego wyzwalania INT 8 (IRQ 0). Zobacz here.

Na nowszych komputerach można również skorzystać z High Precision Event Timer.

+0

można również użyć zegara APIC: http://wiki.osdev.org/APIC_timer – Necrolis

6

Możesz użyć instrukcji rdtsc (odczyt znacznika czasu) na x86, aby uzyskać 64-bitowy znacznik czasu procesora w postaci edx:eax. Implementacja tej instrukcji zależy od procesora, ale zwiększa się raz na zegar lub ze stałą szybkością. Z tego powodu rozdzielczość czasowa również jest różna, ale powinna być lepsza niż 1 ms.

Istnieją pewne zastrzeżenia do korzystania rdtsc:

  1. Licznik datownik niekoniecznie jest zsynchronizowana całej rdzeni procesora. Może to być problem w procesorach wielowątkowych i wielordzeniowych.
  2. Licznik niekoniecznie rośnie ze stałą prędkością. Może to mieć wpływ na funkcje dławienia lub oszczędzania energii procesora.
  3. Hibernacja może spowodować zresetowanie licznika.

Odkąd piszesz swój własny system operacyjny, możesz nie martwić się niektórymi z tych problemów.

Powiązane problemy