Operazione RTC
Ciò che manca a RaspberryPi è un RTC (Real Time Clock) alimentato a batteria. È un dispositivo che può funzionare indipendentemente dal computer principale e tenere traccia di un tempo che passa anche quando è spento (ecco perché ha la sua batteria). Può funzionare in modo molto semplice: ha un oscillatore di frequenza noto collegato e su ogni impulso dell'oscillatore, incrementerà il suo timer / contatore interno. Poiché la frequenza è nota, è facile calcolare il tempo trascorso in base al contatore. Il dispositivo avrà anche una batteria in modo che possa continuare a funzionare anche quando l'alimentazione esterna è disattivata.
Alcuni dispositivi RTC potrebbero essere più sofisticati. Possono, ad esempio, creare un interrupt in frequenza programmabile o in modalità sveglia (impostato su una determinata ora in futuro o su una certa ora ogni giorno ecc.). Non è rilevante per mantenere l'ora di sistema ed è facoltativo.
Come viene utilizzato RTC
Un computer può chiedere a RTC che ora è (o più precisamente - qual è il suo valore del contatore) all'avvio e impostare la sua data / ora interna in base a questo valore. D'ora in poi, tuttavia, un computer non chiederà a RTC l'ora ogni secondo / milisecondo / microsecondo. Invece, eseguirà il proprio clock (chiamato ora di sistema), di solito usando i propri timer / contatori. Proprio come in RTC, il timer / contatore è sincronizzato con una frequenza nota, quindi è facile calcolare il tempo trascorso.
È possibile forzare il sistema a sincronizzare l'orologio con il dispositivo RTC (in entrambe le direzioni) ma non accadrà fino a quando non verrà richiesto. Alcuni sistemi sono configurati per memorizzare l'ora del sistema in RTC, ad esempio quando si spegne o dopo la sincronizzazione NTP.
Mancanza di RTC
RaspberryPi, come molti computer economici a scheda singola, non ha un dispositivo RTC esterno. Ciò significa che non può chiedere l'ora corrente all'avvio. Ma come già accennato, questo non è un problema se possiamo ottenere la data / ora da un'altra fonte (come NTP). L'unico svantaggio è che a differenza di RTC, non è possibile chiedere NTP all'avvio anticipato (poiché è necessario prima la connessione di rete).
Quindi, per rispondere direttamente alla tua domanda, indipendentemente dal fatto che RaspberryPi (o qualsiasi altro computer) abbia RTC o meno, terrà traccia del tempo utilizzando il dispositivo timer / contatore interno che è disponibile in quasi tutti i sistemi di computer e deve funzionare quasi ogni tipo del sistema operativo.
Tempo in Linux
Le applicazioni dello spazio utente in Linux possono determinare il cosiddetto calendar time
(che è un tempo nel mondo reale) usando la gettimeofday()
funzione che quindi chiama la clock_gettime()
chiamata di sistema. Quello che succede ora è un po 'complicato a causa di molte funzionalità avanzate che il kernel di Linux ha (come spazi dei nomi, ecc.). Ma la base è che il kernel mantiene il suo tempo basato su jiffies
. In realtà è solo una variabile all'interno del kernel (generalmente larga 64 bit) che conta il numero di tick dall'avvio del sistema.
Le zecche sono generate dal timer hardware tramite interrupts
. jiffies
il valore viene incrementato su ciascuno di questi interrupt. Il timer hardware è configurato per produrre tali interruzioni a intervalli regolari. L'intervallo è configurato all'avvio in base al valore del HZ
parametro di configurazione del kernel.
In un dato momento, il kernel sa quanti tick sono stati generati dall'avvio ( jiffies
variabile), sa quanti tick sono generati ogni secondo ( HZ
opzione di configurazione) in modo da poter calcolare facilmente quanto tempo è trascorso dall'ultimo avvio.
Quindi, per riassumere - il kernel chiede RTC
circa calendar time
(chiamato anche wall clock
) sul caricamento del sistema in modo che sappia quello che era il tempo effettivo in cui il sistema ha iniziato. Quindi aggiunge jiffies/HZ
valore a questo ogni volta che un'applicazione di userspace chiede a che ora sta usando la clock_gettime
chiamata di sistema.
Timer hardware / dispositivo contatore
Il timer / contatore hardware è un dispositivo molto semplice. Ha un registro contatori che conta i suoi tick di clock. I tick di clock sono generalmente creati da alcuni esterni oscillator
(un circuito elettronico che produce segnali ripetitivi) e sono di frequenza nota (di solito vanno da un paio di kHz a centinaia di MHz). Ciò significa che possiamo facilmente calcolare il tempo trascorso dividendo il valore del contatore per la frequenza dell'oscillatore.
Il dispositivo timer può essere programmato per eseguire varie operazioni: può contare su e giù, confrontare il registro dei contatori con un valore. Ad esempio, può creare un segnale esterno e iniziare il conteggio dall'inizio quando il registro dei contatori ha un valore. In questo modo è possibile configurare il dispositivo timer per creare tale segnale esterno a intervalli costanti con una frequenza molto inferiore rispetto all'oscillatore. Questo segnale può quindi essere utilizzato come evento di interruzione per una CPU.
Si noti che l'oscillatore potrebbe essere utilizzato direttamente al posto del dispositivo timer. Ciò che differenzia il dispositivo timer / contatore dall'oscillatore è che può essere programmato. Quindi puoi pensare al dispositivo timer / contatore come a un oscillatore molto più sofisticato.