RTC, Gerçek Zamanlı Saat anlamına gelir. Bu, bir pil veya alternatif bir güç kaynağı tarafından desteklenen küçük bir donanım saati parçasıdır. Bu güç kaynağı, çok uzun süre enerji verilmeyen sistemlerdeki kapasitörler olabilir. Bu donanım parçası gerçek zamanı depolar ve sistem açılmasa bile zamandan tasarruf sağlanır. Sistem açıldığında RTC’den saat okunur ve sistem saati günün gerçek saati ile başlatılır. RTC’yi ayrıntılı olarak ele alacağız.
Tanım
Sistem saati işletim sistemi tarafından yönetilir ve sistemin tik takları veya kalp atışlarıdır. İşletim sistemi, yürütme sırasında sistem saatini takip eder. Sistem saati birincil saattir ve yalnızca işletim sistemi çalışırken çalışır; sistem kapatıldığında durur. Diğer bir saat ise bağımsız bir saat olan ve genellikle yedek pil veya güç kaynağı tarafından çalıştırılan RTC saatidir. Sistem açık olmasa bile çalışmaya devam eder. Sistem açıldığında, sistem saati başlangıç saatini önyükleme sırasında RTC saatinden alır. Sistem günün gerçek zamanlı durumunu bu şekilde korur. Sistem açık olmasa bile zaman devam eder.
Sadece RTC saatini tartışalım. RTC saati SOC’ye yerleştirilebilir veya I2C veri yolu üzerinden CPU ile arayüzlenen küçük montaj çipi olabilir. Birçok I2C RTC saat cihazı mevcuttur.
Kullanıcının sistemde RTC’yi etkinleştirmek isteyip istemediğini araştıralım. Sistemde yeni RTC çipini etkinleştirmek için RTC modülüne yönelik bir Linux sürücüsü gereklidir. Bu sürücüler RTC üreticileri tarafından sağlanacaktır. Aklıma gelen tek RTC modülü örneği Maxim Integrated’den DS1339’dur. Diyelim ki sistem tasarımcınız bu çipi sisteminize ekledi. Şu anda Linux’unuz RTC cihazından haberdar olmayacaktır. Ancak i2c araçları sistemde mevcutsa, “i2cdetect -y 1” komutunu çalıştırdığınızda muhtemelen yeni i2c yardımcı cihazını görebilirsiniz. Bu aygıt, 1 numaralı i2c veri yolu üzerindeki tüm bağımlı aygıtları listeleyecektir. Daha sonra Linux’ta RTC sürücüsünün etkinleştirilmesi gelir. DS1339 için RTC sürücüsü zaten mevcuttur. rtc-ds1307.c, RTC DS1339’un Linux sürücüsüdür ve çekirdek kaynağının dizininde (drivers/rtc) incelenebilir. Linux’ta bu RTC aygıtının sürücüsünü etkinleştirmek için çekirdek yapılandırmasının (CONFIG_RTC_DRV_DS1307) etkinleştirilmesi gerekir.
Çekirdek yapılandırmasına ek olarak, aygıt ağacında da I2C aygıtının bir örneğini oluşturacak değişiklikler yapılmalıdır. Bu örnek, önceki adımda tanımlanan uyumlu dizeye göre incelenecektir.
Cihaz, sürücüyü uyumlu diziye göre araştıracaktır. Sürücü ve cihaz başarılı bir şekilde bağlandıktan sonra, kullanıcı alanının RTC’ye erişmesi için cihaz düğümü oluşturulacaktır. /dev/rtc0 kullanıcı alanı erişimi için cihaz arayüzü olacaktır.
RTC’ye kullanıcı alanından erişmek için “hwclock” yardımcı programı kullanılabilir.
Hwclock yardımını kontrol edersek aşağıdaki seçenekleri göreceğiz:
BusyBox v1.20.2 (2023-08-02 18:07:30 IST) multi-call binary.
Usage: hwclock [-r|–show][-s|–hctosys][-w|–systohc][-t|–systz][-l|–localtime][-u|–utc][-f|–rtc FILE]
-r –> Donanımın saat zamanını görüntülemek için
-s –> Donanım saatinden zaman ayırın ve sistem saatine koyun
-w –> Sistem saatinden zaman ayırın ve donanım saatine koyun
-t –> Çekirdek saat dilimini koy
-u –> Donanım saati UTC’ye yerleştirildiğinden bunu alın
-l –> Donanım saati yerel zamana yerleştirildiği için bunu kabul edin
-f –> DOSYA Belirtilen cihazı kullan (örn. /dev/rtc2)
Bunlar bu komutun sunduğu minimum seçeneklerdir.
Genel olarak kullanıldıkları için bu seçeneklerden yalnızca bazılarını tartışacağız.
-r:
Bu seçenek RTC saatinin çıkışını görüntülemek için kullanılır.
Benimle birlikte sistemden gelen çıktı aşağıdadır:
[$ ]$ hwclock -r
Tue Aug 1518:26:3620230.000000 seconds
[$]$
-w:
Bu seçenek RTC saatindeki zamanı ayarlamak/güncellemek için kullanılır. Bir sonraki okuma işlemi, zaman güncellemesi başarılıysa bize güncellenen zamanı verecektir. Ayrıca -w seçeneği herhangi bir hata üretmeyecektir. -w seçeneğinin sessiz bir şekilde yürütülmesi, zaman ayarının başarılı olduğu anlamına gelir. Burada dikkat edilmesi gereken nokta -w seçeneğinin sistem saatini RTC saatine kopyalayacağıdır. Yani RTC saatini güncellemek istiyorsak öncelikle sistem saat saatini güncellememiz gerekir. Bu, date komutuyla yapılabilir ve daha sonra RTC saatini güncellemek için hwclock -w komutuyla yürütülebilir. Bu şekilde RTC saati güncellenecektir.
Sistemin zamanına bir göz atalım. Verileri ve hwclock komutunu yürütün. Sistemimde her iki komutu da aynı anda görüyorum.
[$]$ date
Tue Aug 1518:33:16 UTC 2023
[$]$ hwclock -r
Tue Aug 1518:33:1720230.000000 seconds
[$]$
-S:Aşağıdaki gibi date komutu ile sistem saatini değiştirmeyi deneyelim. Saat ve Veriler 7 Kasım 2023 olarak değiştirildi.
[$]$ date-s2023:08:10
Tue Nov 7 07:08:10 UTC 2023
[$]$ date
Tue Nov 7 07:08:22 UTC 2023
[$]$
Şimdi her iki saatin (RTC ve sistem saati) çıkışını kontrol edelim.
[$]$ date
Tue Nov 7 07:09:51 UTC 2023
[$]$ hwclock -r
Tue Aug 1518:37:4220230.000000 seconds
[$]$
Sistem saati değiştirilerek 7 Kasım 2023 olarak ayarlandı, RTC saati ise daha önceki çıkışlarda gördüğümüz gibi hala eski saatte çalışıyor.
Şimdi sadece “hwclock -w” komutunu çalıştırırsak RTC saat zamanımız sistem saatinden güncellenecektir. Bunu sistemimizde doğrulayalım.
[$]$ hwclock -r
Tue Aug 1518:40:1120230.000000 seconds
[$]$ date
Tue Nov 7 07:12:25 UTC 2023
[$]$ hwclock -w
[$]$ hwclock -r
Tue Nov 7 07:12:3420230.000000 seconds
[$]$
[$]$ date
Tue Nov 7 07:12:43 UTC 2023
[$]$
Yukarıdaki örnekte de gördüğümüz gibi -w seçeneğini kullandığımızda sistem saati ile RTC saati aynı oluyor. RTC saati, sistem saatiyle aynı değerlerle güncellendi.
Yukarıdaki tüm tartışmalarla birlikte, sistem saatini donanım saatine (RTC) göre bağımsız olarak değiştirebileceğimizi anlıyoruz. Her iki saat de farklı zamanlarda çalıştığında bunları nasıl senkronize edebiliriz? Sistem saatini RTC’ye kopyalayabileceğimiz durumu daha önce görmüştük. Peki RTC zamanını sistem saatine nasıl ayarlayacağız? Bu amaçla hwclock komutu şu seçeneği sunar: -s veya –hctosys. hwlock komutu -s/–hctosys seçeneğiyle çalıştırıldığında donanım saatinden (RTC) gelen süre sistem saatine kopyalanır.
Yazının orjinalini buradan okuyabilirsiniz.