[#1] Odczyt zegara systemowego C
Ło panie! Niech ktoś powie, że da się to zrobić w 2-ch liniach kodu... dobra - w 10 ciu...
Rozumiem, ze uzywajac zwyklego timer.h tego nie zrobimy? Wiec jak szybko z marszu dostac czas systemowy ?
[#2] Re: Odczyt zegara systemowego C

@arturB, post #1

#include <proto/dos.h>
#include <dos/dos.h>

struct DateStamp ds;

DateStamp(&ds);

  • ds.ds_Days - ilość dni od 1 stycznia 1978
  • ds.ds_Minute - ilość minut od ostatniej północy
  • ds.ds_Tick - ilość ticków od ostatniej pełnej minuty (1 tick = 1/50 sekundy)
[#3] Re: Odczyt zegara systemowego C

@Krashan, post #2

Alternatywnie z użyciem timer.device (GetSysTime) i utility.library (Amiga2Date) (uzyskuje się bardziej przyjazne dane - rok, miesiąc, dzień, dzień tygodnia, godzina, minuta i sekunda):

Jeżeli kompilator nie otwiera bibliotek automatycznie, trzeba samemu otworzyć.

Tutaj pełny przykład.

struct ClockData clockdata;
struct timeval tv;

GetSysTime(&tv);

printf("GetSysTime():\t%d %d\n", tv.tv_secs, tv.tv_micro);

Amiga2Date(tv.tv_secs, &clockdata);

printf("Amiga2Date():  sec %d min %d hour %d\n", clockdata.sec, clockdata.min, clockdata.hour);
printf("               mday %d month %d year %d wday %d\n", clockdata.mday, 
clockdata.month, clockdata.year, clockdata.wday);

Przy czym niektóre kompilatory implementują time.h.
[#4] Re: Odczyt zegara systemowego C

@Krashan, post #2

To ja jeszcze dopytam na przyszłość przy okazji: jakiej funkcji użyć,
jeśli chcemy mierzyć czas danej klatki w milisekundach, fpsy po prostu?
Czy 1 milisekunda to najmniejsza możliwa wartość czy jakieś dziesiętne cześci też wchodzą w grę?
[#5] Re: Odczyt zegara systemowego C

@mateusz_s, post #4

Z tego co widze to jest - micro czyli jedna milionowa ? Czy operacje matematyczne na takich liczbach wymagaja otwarcia jakichs innych bibliotek? Dostaje szalone cyfry. Powiem szczerze zamotane troche.
[#6] Re: Odczyt zegara systemowego C

@mateusz_s, post #4

W C to nie wiem, ale w asemblerze to mozesz uzyc procedury Jima Drew ktora jest w watku o c2p na EAB. Bardzo dokladnie mierzy czas jak ktos chce maksowac szybkosc jakiejs procedury. Szczegolnie przydatna dla procesorow 68020+ i procedury z odczytami i zapisami danych do pamieci (szczegolnie chip). Bo tego recznie nie wyliczysz, ze wzgledu na cache procesora, czy mozliwosc rownoleglego zapisu do chip ramu i wykonywania innych instrukcji CPU w tym samym czasie. W kazdym razie jest w stanie zmierzyc szybkosc pojedynczej instrukcji i czas jej wykonania, na zasadzie odjecia od siebie dwoch (z instrukcja i bez instrukcji) otrzymanych czasow. Chyba petla sie wykonuje 1000 albo 100 razy, ale juz nie pamietam dokladnie.
[#7] Re: Odczyt zegara systemowego C

@mateusz_s, post #4

Możesz skorzystać z rejestrów chipsetu które zwracają aktualną pozycję wiązki rysującej - nawet jak używasz RTG to videoo chipsetu wciąż działa i możesz liczyć czas na bazie delty zwracanych pozycji.
Możesz też odczytywać timery CIA, zwłaszcza TOD.
[#8] Re: Odczyt zegara systemowego C

@teh_KaiN, post #7

Ja polecam liczyć precyzyjne odstępy czasu za pomocą ReadEClock() z timer.device.

@ArturB
Czy operacje matematyczne na takich liczbach wymagaja otwarcia jakichs innych bibliotek? Dostaje szalone cyfry. Powiem szczerze zamotane troche.

Podstawowe operacje arytmetyczne na liczbach całkowitych nie wymagają w C bibliotek.

Ba, nawet podstawowe operacje arytmetyczne na liczbach zmiennoprzecinkowych też ich nie wymagają - jeżeli kompilator obsługuje typ float.

Może pokaż swój kod, to może uda się coś doradzić.

Jeżeli skorzystasz z mojego sposobu, dostaniesz konkretne wartości liczbowe przedstawiające datę i godzinę.

Jeżeli skorzystasz ze sposobu Krashana, to dodatkowo wywołaj funkcję DateToStr() by otrzymać zrozumiały dla człowieka ciąg tekstowy.

Działa to też w drugą stronę: funkcja StrToDate().
[#9] Re: Odczyt zegara systemowego C

@Hexmage960, post #8

Wykorzystałem link z Twojej podpowiedzi. Lekko zmodyfikowalem zeby pobierac dwa czasy i wyliczyc fps-y. Na moje potrzeby okazało się wystarczające. Dopiero zacząłem z C - wczesniej java. Czy na OS4 tez jest podobnie? Czy da się skompilowac taki kod na nową Ami bez bólu głowy?
[#10] Re: Odczyt zegara systemowego C

@mateusz_s, post #4

To ja jeszcze dopytam na przyszłość przy okazji: jakiej funkcji użyć,
jeśli chcemy mierzyć czas danej klatki w milisekundach, fpsy po prostu?
Czy 1 milisekunda to najmniejsza możliwa wartość czy jakieś dziesiętne cześci też wchodzą w grę?
Na klasycznych Amigach najdokładniejszy zegar, jaki można do tego wykorzystać, to tak zwany zegar E, o częstotliwości 709379 Hz (PAL) lub 715909 Hz (NTSC). Zbocza tego zegara są zliczane przez 16-bitowy timer A układu CIA-B i są dostępne pod adresami $BFD500 (wyższy bajt) i $BFD400 (niższy bajt). Najszybciej jest czytać bezpośrednio, ale trzeba pamiętać, że ten licznik ma tylko 16 bitów, więc przepełnia się co jakieś 0,09 sekundy. System operacyjny ma ustawione przerwanie na przepełnienie tego timera i tworzy z niego 64-bitowy licznik (startujący od zera przy boocie systemu). Można go odczytać za pomocą wspomnianej przez Hexmage960 funkcji ReadEClock(). Funkcję wywołujemy podając jej wskaźnik na adres struktury EClockVal, która składa się po prostu z 2 32-bitowych pól tworzących łącznie 64-bitową liczbę. Funkcja wypełnia strukturę aktualną wartością licznika, a jako swój wynik zwraca częstotliwość EClocka w Hz, więc można przeliczyć na sekundy.

Mniej dokładny jest 24-bitowy timer TOD z tego samego układu CIA-B, ponieważ zlicza impulsy odchylania poziomego sygnału video. Czyli dla trybu PAL jest to 15625 Hz. Kłopot w tym, że co tryb graficzny to inna częstotliwość HSYNC, więc trzeba ją najpierw poznać. W dodatku, jeżeli Amiga ma jakąś kartę graficzną, to i tak chipset generuje jakiś tryb i to właśnie jego częstotliwość HSYNC jest zliczana (wejście timera jest podłączone do Alice/Agnusa). W razie czego ten sygnał jest na pinie 11 wyjścia RGB, można sobie podłączyć miernik częstotliwości/oscyloskop i zmierzyć. Bajty zegara TOD można odczytać spod adresów $BDF800, $BFD900 i $BFDA00 (starszy, środkowy, młodszy). Trzeba je czytać właśnie w tej kolejności. Odczyt najstarszego bajtu powoduje zatrzaśnięcie chwilowej wartości wszystkich trzech bajtów w rejestrze wyjściowym (zegar tymczasem liczy dalej), dzięki czemu unika się błędów, gdy przepełni się któryś bajt w czasie odczytywania. Odczyt najmłodszego bajtu zwalnia ten zatrzask.
[#11] Re: Odczyt zegara systemowego C

@Krashan, post #10

Grzesiu skad masz taka wiedze ? Na polibudzie tego nie ucza :)
[#12] Re: Odczyt zegara systemowego C

@Krashan, post #10

Dęki. No to pozamiatane. Już o nic nie spytam. Nigdy. Dobranoc, emerytura...
A na powaznie to trzeba znac troche hw zeby tak niskopoziomowe testy robic. Ja się ciesze że się kod kompiluje i działa
[#13] Re: Odczyt zegara systemowego C

@Krashan, post #10

Bede robil pod rtg, chce po prostu wiedzieć ile czasu schodzi w pętli
Albo liczyć fpsy.. najprostszy zegar by mi wystarczyl ;)
[#14] Re: Odczyt zegara systemowego C

@Krashan, post #2

A jak najszybciej przerzucić datę z jednego RTC do drugiego, który znajduje się pod innym adresem? W CDTV kiedyś wrzuciłem drugi RTC pod adres clockportu i zrobiłem mały programik do kopiowania czasu między nimi, ale on robi to na zasadzie kopiowania rejestrów z jednego do drugiego, a jak to zrobić systemowo (istnieje też możliwość wyboru, który RTC znajduje się obecnie pod $DC0001 poprzez zmianę bitu w CPLD)?
[#15] Re: Odczyt zegara systemowego C

@WyciorX, post #14

A jak najszybciej przerzucić datę z jednego RTC do drugiego, który znajduje się pod innym adresem?
System Amigi obsługuje zegar RTC tylko pod adresem standardowym. Jeżeli jednak dorobiłeś układ, który programowo pozwala na podstawienie jednego lub drugiego RTC pod standardowy adres to:
  • Otwierasz battclock.resource.
  • Wywołujesz ReadBattClock() i zapamiętujesz wynik.
  • Szybko podstawiasz drugi zegar pod standardowy adres.
  • Wywołujesz WriteBattClock() z wcześniej podaną wartością.
[#16] Re: Odczyt zegara systemowego C

@mateusz_s, post #13

Bede robil pod rtg, chce po prostu wiedzieć ile czasu schodzi w pętli
Albo liczyć fpsy.. najprostszy zegar by mi wystarczyl ;)
To ja bym poszedł w ReadEClock(). Żeby sobie uprościć liczenie różnicy czasów, można po prostu zdefiniować zmienną całkowitą 64-bitową i wskaźnik na nią zrzutować na *EClockVal i podać jako parametr. Potem odejmujesz od siebie czasy sprzed pętli i po pętli i masz ile zajęła EClocków. Po podzieleniu przez częstotliwość EClocka masz w sekundach.

Tak robiłem profilując swój kod. Pod MorphOS-em jest jeszcze funkcja ReadCPUClock(), która działa tak samo, tylko że CPUClock jest znacznie szybszy (na różnych maszynach zazwyczaj 25 albo 33 MHz), więc pomiar dokładniejszy. Nie wiem, czy w OS4 też to występuje.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem