LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

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:
pi@raspberrypi ~ $ date
Sat Mar  1 14:00:17 UTC 2014
    • ustawienie czasu systemowego (zmiana ta nie wpływa na wartość czasu sprzętowego):
pi@raspberrypi ~ $ sudo date -s "8 MAR 2014 14:00:00"
Sat Mar  8 14:00:00 UTC 2014

Więcej informacji na temat komendy date uzyskamy wydając polecenie:

date --help

Za wszystkie operacje związane z czasem sprzętowym odpowiada komenda hwclock:

      • odczyt czasu sprzętowego:
pi@raspberrypi ~ $ sudo hwclock -r
Sun 16 Mar 2014 21:52:41 UTC  -0.819382 seconds
      • zapis czasu sprzętowego:
pi@raspberrypi ~ $ sudo hwclock --set --date="2014-08-14 16:45:05"
      • ustawienie czasu sprzętowego na podstawie aktualnego czasu systemowego:
pi@raspberrypi ~ $ sudo hwclock -w
      • ustawienie czasu systemowego na podstawie aktualnego czasu sprzętowego:
pi@raspberrypi ~ $ sudo hwclock -s

Więcej informacji na temat polecneia hwclock, dostępnych opcji oraz samych zagadnień związanych
z czasem sprzętowym uzyskamy wydając polecenie:

man hwclock

 

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:
/etc/init.d $ sudo update-rc.d ntp disable
      • zapewnić ustawianie czasu systemowego na podstawie zegara RTC – poprzez odpowiednią konfigurację jądra systemu („Set system time from RTC on startup and resume”):
pi@raspberrypi ~ $ dmesg | grep rtc
[1.967314]rtc-ds1307 1-0068: rtc core: registered ds1307 as rtc0
[1.974820]rtc-ds1307 1-0068: 56 bytes nvram
[2.288089]rtc-ds1307 1-0068: setting system clock to 2011-08-14 23:11:28 UTC
      • okresowo (w warunkach dostępności sieci) zapewniać synchronizację z serwerem NTP, np. manualnie lub poprzez dodanie poniższego wpisu do cron.weekly:
ntpd -q ; hwclock -w

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.

Łukasz Skalski - absolwent Politechniki Gdańskiej, miłośnik FLOSS, autor książki "Linux. Podstawy i aplikacje dla systemów embedded" oraz szeregu artykułów dotyczących programowania systemów wbudowanych. Zawodowo związany z firmą Samsung. Wszystkie wolne chwile poświęca projektowaniu i programowaniu urządzeń wyposażonych w mikroprocesory 8-/16- i 32-bitowe. Szczególnym zainteresowaniem obejmuje tematykę systemu Linux w aplikacjach na urządzenia embedded.