Bagaimana Pi melacak interval waktu?

8

Seperti yang saya mengerti, RTC diperlukan untuk melacak waktu. Namun, Raspberry Pi tidak memilikinya dan menggunakan server NTP untuk menyinkronkan waktunya.

Semua itu baik-baik saja, tetapi bagaimana Pi tahu bahwa satu milidetik atau satu detik telah berlalu. Bagaimana Pi menyadari berlalunya waktu?

AppleGrew
sumber
RTC benar-benar ada (dengan baterai) untuk saat Pi (atau prosesor apa pun) dimatikan.
Octopus
Pi memiliki jam internal yang diatur oleh NTP setiap kali ada di Internet, seperti yang Anda katakan. Ini adalah perangkat lunak yang melacaknya dan berlalunya waktu berikutnya, bukan RTC absolut. Perintah standar Linux dapat mengambil informasi itu kapan pun Anda butuhkan. Jadi, untuk menjawab pertanyaan Anda, yang ia "tahu" adalah waktu ketika itu ditetapkan paling baru kemudian berapa banyak kutu sejak itu. Berikut ini adalah artikel yang menarik tentang masalah ini. : blog.remibergsma.com/2013/05/12/...
SDsolar

Jawaban:

16

Operasi RTC

Kekurangan RaspberryPi adalah RTC yang didukung baterai (Real Time Clock). Perangkat itu dapat bekerja secara independen dari komputer utama dan melacak waktu yang berlalu meskipun saat dimatikan (inilah sebabnya ia memiliki baterai sendiri). Ini dapat bekerja dengan cara yang sangat sederhana - ia memiliki osilator frekuensi yang diketahui terhubung dan pada setiap pulsa osilator, ia akan menambah timer / penghitung internal. Karena frekuensi diketahui, mudah untuk menghitung waktu yang berlalu berdasarkan penghitung. Perangkat juga akan memiliki baterai sehingga dapat terus bekerja bahkan ketika daya eksternal mati.

Beberapa perangkat RTC mungkin lebih canggih. Mereka dapat, misalnya, membuat interupsi dalam frekuensi yang dapat diprogram atau dalam mode alarm (diatur ke waktu tertentu di masa depan atau ke waktu tertentu setiap hari, dll). Ini tidak relevan untuk menjaga waktu sistem dan bersifat opsional.

Bagaimana RTC digunakan

Komputer dapat menanyakan RTC jam berapa sekarang (atau lebih tepatnya - berapa nilai penghitungnya) pada waktu boot dan menetapkan tanggal / waktu internal berdasarkan nilai ini. Mulai sekarang, bagaimanapun, komputer tidak akan meminta RTC untuk waktu setiap detik / milidetik / mikrodetik. Sebagai gantinya, ia akan menjalankan jamnya sendiri (disebut waktu sistem), biasanya menggunakan timer / penghitungnya sendiri. Sama seperti di RTC, timer / penghitung clock dengan frekuensi yang dikenal sehingga mudah untuk menghitung waktu berlalu.

Anda dapat memaksa sistem Anda untuk menyinkronkan jamnya dengan perangkat RTC (di kedua arah) tetapi itu tidak akan terjadi sampai diminta. Beberapa sistem dikonfigurasikan untuk menyimpan waktu sistem dalam RTC ketika mematikan atau setelah sinkronisasi NTP, misalnya.

Kekurangan RTC

RaspberryPi, seperti banyak komputer papan tunggal murah, tidak memiliki perangkat RTC eksternal. Ini berarti tidak dapat meminta waktu saat ini saat boot. Tetapi seperti yang telah disebutkan - ini bukan masalah jika kita bisa mendapatkan tanggal / waktu dari sumber lain (seperti NTP). Satu-satunya kelemahan adalah bahwa tidak seperti RTC, Anda tidak dapat meminta NTP pada boot awal (karena Anda pertama kali membutuhkan koneksi jaringan).

Jadi untuk langsung menjawab pertanyaan Anda - tidak peduli apakah RaspberryPi (atau komputer lain) memiliki RTC atau tidak, itu akan melacak waktu menggunakan timer / alat penghitung internal yang tersedia di hampir setiap sistem komputer dan diharuskan menjalankan hampir semua jenis komputer sistem operasi.

Waktu di Linux

Aplikasi userspace di Linux dapat menentukan apa yang disebut calendar time(yang merupakan waktu di dunia nyata) menggunakan gettimeofday()fungsi yang kemudian memanggil panggilan clock_gettime()sistem. Apa yang terjadi sekarang sedikit rumit karena banyak fitur canggih yang dimiliki kernel Linux (seperti namespaces dll). Tetapi dasarnya adalah bahwa kernel mempertahankan waktunya berdasarkan jiffies. Ini sebenarnya hanya variabel di dalam kernel (biasanya lebar 64bit) yang menghitung jumlah kutu sejak sistem dimulai.

Kutu dihasilkan oleh pengatur waktu perangkat keras dengan interrupts. jiffiesnilai bertambah pada setiap interupsi tersebut. Pengatur waktu perangkat keras dikonfigurasikan untuk menghasilkan interupsi seperti itu secara berkala. Interval dikonfigurasikan pada saat boot sesuai dengan nilai HZparameter konfigurasi kernel.

Pada waktu tertentu, kernel tahu berapa banyak tick yang dihasilkan dari boot ( jiffiesvariabel), ia tahu berapa banyak tick yang dihasilkan setiap detik ( HZopsi konfigurasi) sehingga dapat dengan mudah menghitung berapa banyak waktu yang dilewati dari boot terakhir.

Jadi untuk meringkas - kernel bertanya RTCtentang calendar time(juga disebut wall clock) pada saat boot sehingga ia tahu apa waktu sebenarnya ketika sistem dimulai. Itu kemudian menambahkan jiffies/HZnilai untuk ini setiap kali aplikasi userspace bertanya berapa kali menggunakan clock_gettimepanggilan sistem.

Perangkat penghitung waktu / perangkat keras

Timer / penghitung perangkat keras adalah perangkat yang sangat sederhana. Ia memiliki register penghitung yang menghitung detak jamnya. Kutu jam biasanya dibuat oleh beberapa eksternal oscillator(sirkuit elektronik yang menghasilkan sinyal berulang) dan memiliki frekuensi yang diketahui (biasanya berkisar dari beberapa kHz hingga ratusan MHz). Ini berarti bahwa kita dapat dengan mudah menghitung berapa banyak waktu berlalu dengan membagi nilai penghitung dengan frekuensi osilator.

Perangkat pengatur waktu dapat diprogram untuk melakukan berbagai hal - dapat menghitung ke atas dan ke bawah, membandingkan penghitung register dengan beberapa nilai. Misalnya dapat membuat sinyal eksternal dan mulai menghitung dari awal ketika register register bernilai tertentu. Dengan cara ini Anda dapat mengkonfigurasi perangkat timer untuk membuat sinyal eksternal pada interval konstan yang jauh lebih rendah daripada frekuensi osilator. Sinyal ini kemudian dapat digunakan sebagai acara interupsi untuk CPU.

Perhatikan bahwa osilator dapat digunakan secara langsung sebagai ganti perangkat penghitung waktu. Yang membedakan alat penghitung waktu / penghitung dari osilator adalah ia dapat diprogram. Jadi Anda dapat menganggap timer / alat penghitung sebagai osilator yang jauh lebih canggih.

Krzysztof Adamski
sumber
Akan lebih membantu jika lebih banyak detail disediakan tentang timer internal.
AppleGrew
@AppleGrew: Detail apa yang Anda minati?
Krzysztof Adamski
Bisakah Anda menyebutkan timer yang Anda sebutkan? Sehingga saya bisa membaca lebih banyak tentang mereka. Ketika saya google "timer CPU internal", sepertinya tidak mendapatkan apa pun yang relevan. Saya tidak yakin apa sebenarnya yang saya harap dapat saya pelajari dari hal itu, tetapi saya merasa masih kurang jelas.
AppleGrew
@AppleGrew: Saya telah menambahkan beberapa informasi latar belakang untuk pertanyaan saya. Semoga ini membantu.
Krzysztof Adamski
BTW Anda mungkin ingin memperbaiki kesalahan ketik - 'isap' di bagian ke-3 dari bagian 'Waktu di Linux'.
AppleGrew
1

Jam CPU berasal dari kristal. Biasanya Anda dapat mengharapkan 10-20 bagian per juta untuk akurasi jam (sekitar 5-10 menit per tahun)

John La Rooy
sumber
0

Pokoknya untuk menjawab pertanyaan dengan cara yang jauh lebih mudah bersama dengan instruksi untuk menambahkan RTC ke PI Anda, saya akan memasukkan tautan di bawah ini. Tergantung pada apakah Anda hanya ingin metode yang dapat diandalkan selain menggunakan inet / ntp cara untuk memberitahu waktu atau memerlukan metode yang sangat tepat saya akan merekomendasikan pergi dengan RTC "Chronodot". Kalau tidak, papan breakout RTC akan bekerja dengan baik dan sangat mudah untuk bekerja semua yang Anda perlu setup adalah I2C untuk memiliki PI berkomunikasi dengan RTC. Info Tautan / materi

Niz
sumber