Pierwsze kroki z Raspberry Pi: jak dodać RTC?

7) hwclock – czyli praca ze sprzętowym zegarem RTC

Zanim przystąpimy do bardzo skrótowego przedstawienia narzędzia hwclock, warto przypomnieć, że w systemie Linux posługujemy się dwoma rodzajami czasu – czasem systemowym oraz czasem sprzętowym. Czas sprzętowy to czas, który „liczy” niezależne od całego systemu operacyjnego (jest niezależny od wszystkich aplikacji), a jego wartość, dzięki podtrzymaniu bateryjnemu jest nieulotna po wyłączeniu komputera. Czas sprzętowy jest liczony przez dedykowany układ umieszczony na płycie głównej komputera, lub tak jak w naszym przypadku, przez zewnętrzny układ zegara RTC. Drugim rodzajem czasu jest czas systemowy, czyli zegar „zarządzany” przez system operacyjny (to on odpowiada za jego aktualizację). To właśnie z czasu systemowego korzystają wszystkie aplikacje oraz system plików. Skoro mamy dostępny zegar sprzętowy, po co więc wprowadzamy dodatkowy „twór programowy” w postaci zegara systemowego? Odpowiedź jest dość prosta – czas dostępu. Każdy odczyt zegara sprzętowego wymaga odpowiedniego wykonania szeregu operacji na magistrali, przez jaką dany układ został dołączony (I2C, SPI, itd.). Powoduje to wydłużenie czasu dostępu, co jest dość nieefektywne, i z tego też względu wprowadzono czas systemowy. Podsumowując – zadaniem zegara sprzętowego jest poprawne ustawienie zegara systemowego przy starcie systemu (co własnoręcznie skonfigurowaliśmy na etapie kompilacji jądra, ustawiając opcję „Set system time from RTC on startup and resume”).

Podstawowe operacje związane z czasem systemowym możemy wykonać za pomocą polecenia date:

    • odczyt czasu systemowego:
    • ustawienie czasu systemowego (zmiana ta nie wpływa na wartość czasu sprzętowego):
Więcej informacji na temat komendy date uzyskamy wydając polecenie:
Za wszystkie operacje związane z czasem sprzętowym odpowiada komenda hwclock:

      • odczyt czasu sprzętowego:
      • zapis czasu sprzętowego:
      • ustawienie czasu sprzętowego na podstawie aktualnego czasu systemowego:
      • ustawienie czasu systemowego na podstawie aktualnego czasu sprzętowego:
Więcej informacji na temat polecneia hwclock, dostępnych opcji oraz samych zagadnień związanych
z czasem sprzętowym uzyskamy wydając polecenie:
 

8) Podsumowanie

Jak można zauważyć po lekturze niniejszego artykułu, implementacja sprzętowo-programowa zegara RTC w minikomputerze Raspberry Pi jest operacją dość prostą. Po prawidłowym wykonaniu wszystkich operacji, użytkownik zapewnia prawidłowe ustawienie czasu systemowego w warunkach braku dostępu do sieci. Dodatkowo korzystając z zestawu gotowych rozwiązań programowych w postaci poleceń date, ntpd oraz hwclock, uzyskuje on możliwość przygotowania dostosowanych do własnych wymagań sposobów synchronizacji i zapewnienia dokładności zegara. Jednym z popularniejszych rozwiązań jest trwałe wyłączenie serwisu ntpd, ustawienie zegara systemowego na podstawie zegara sprzętowego i okresowe synchronizowanie zegara RTC z systemami NTP, jeżeli na urządzeniu dostępne jest połączenie sieciowe. Aby zestawić taki prosty system synchronizacji wystarczy jedynie:

      • wyłączyć daemon ntpd:
      • zapewnić ustawianie czasu systemowego na podstawie zegara RTC – poprzez odpowiednią konfigurację jądra systemu („Set system time from RTC on startup and resume”):
      • okresowo (w warunkach dostępności sieci) zapewniać synchronizację z serwerem NTP, np. manualnie lub poprzez dodanie poniższego wpisu do cron.weekly:
Warto również zwrócić uwagę, żę dzięki wykorzystaniu gotowych modułów jądra systemu Linux i dostarczeniu abstrakcyjnego urządzenia w postaci /dev/rtc, użytkownik jest zwolniony z konieczności analizowania noty katalgowej układu DS1307 i rozmieszczenia jego poszczególnych rejestrów. Należy również dodać, że podsystem ten z punktu widzenia użytkownika jest niezależny od typu zastosowanego układu zegara RTC i obsługa różnych układów (jak np. DS1307 czy PCF8583) jest zupełnie identyczna.

O autorze