Operação RTC
O que falta ao RaspberryPi é um RTC (Relógio em Tempo Real), com bateria. É um dispositivo que pode funcionar independentemente do computador principal e acompanhar o tempo que passa mesmo quando está desligado (é por isso que ele tem sua própria bateria). Pode funcionar de maneira muito simples - possui um oscilador de frequência conhecido conectado e, a cada pulso do oscilador, incrementa seu contador / timer interno. Como a frequência é conhecida, é fácil calcular o tempo passado com base no contador. O dispositivo também terá uma bateria para poder continuar trabalhando mesmo quando a energia externa estiver desligada.
Alguns dispositivos RTC podem ser mais sofisticados. Eles podem, por exemplo, criar uma interrupção na frequência programável ou no modo de alarme (definido para uma determinada hora no futuro ou para uma determinada hora todos os dias, etc.). Não é relevante para manter a hora do sistema e é opcional.
Como o RTC é usado
Um computador pode perguntar ao RTC que horas são (ou mais precisamente - qual é o seu valor de contador) no momento da inicialização e definir sua data / hora interna com base nesse valor. A partir de agora, no entanto, um computador não solicitará tempo ao RTC a cada segundo / milissegundo / microssegundo. Em vez disso, ele executará seu próprio relógio (chamado hora do sistema), geralmente usando seus próprios temporizadores / contadores. Assim como no RTC, o cronômetro / contador tem uma freqüência conhecida, por isso é fácil calcular o tempo passado.
Você pode forçar seu sistema a sincronizar seu relógio com o dispositivo RTC (em ambas as direções), mas isso não acontecerá até ser solicitado. Alguns sistemas são configurados para armazenar a hora do sistema no RTC ao desligar ou após a sincronização NTP, por exemplo.
Falta de RTC
O RaspberryPi, como muitos computadores baratos de placa única, não possui dispositivo RTC externo. Isso significa que ele não pode solicitar a hora atual na inicialização. Mas como já mencionado - isso não é um problema se pudermos obter data / hora de outra fonte (como NTP). A única desvantagem é que, diferentemente do RTC, você não pode perguntar ao NTP na inicialização antecipada (já que você precisa de uma conexão de rede).
Portanto, para responder diretamente à sua pergunta - não importa se o RaspberryPi (ou qualquer outro computador) possua RTC ou não, ele acompanhará o tempo usando o temporizador / contador interno, disponível em quase todos os sistemas de computador e necessário para executar praticamente qualquer tipo do sistema operacional.
Tempo no Linux
Os aplicativos de espaço do usuário no Linux podem determinar os chamados calendar time
(que são uma época no mundo real) usando a gettimeofday()
função que então chama a clock_gettime()
chamada de sistema. O que acontece agora é um pouco complicado devido a muitos recursos avançados que o kernel do Linux possui (como namespaces etc.). Mas o básico é que o kernel mantém seu tempo com base jiffies
. Na verdade, é apenas uma variável dentro do kernel (geralmente com 64 bits de largura) que conta o número de ticks desde o início do sistema.
Os tiques são gerados pelo temporizador de hardware por meio de interrupts
. jiffies
o valor é incrementado em cada interrupção. O temporizador de hardware está configurado para produzir essas interrupções em intervalos regulares. O intervalo é configurado no momento da inicialização, de acordo com o valor do HZ
parâmetro de configuração do kernel.
A qualquer momento, o kernel sabe quantos ticks foram gerados a partir da inicialização ( jiffies
variável), sabe quantos ticks são gerados a cada segundo ( HZ
opção de configuração) para que possa calcular facilmente quanto tempo passou desde a última inicialização.
Então, para resumir - o kernel pergunta RTC
sobre calendar time
(também chamado wall clock
) na inicialização, para que ele saiba qual foi a hora real em que o sistema foi iniciado. Em seguida, agrega jiffies/HZ
valor a isso sempre que um aplicativo de espaço de usuário pergunta a que horas está usando a clock_gettime
chamada do sistema.
Temporizador / contador de hardware
O temporizador / contador de hardware é um dispositivo muito simples. Ele possui um contador de contagem que conta o tempo do relógio. Os tiques do relógio são geralmente criados por alguns externos oscillator
(um circuito eletrônico que produz sinal repetitivo) e têm frequência conhecida (geralmente variando de alguns kHz a centenas de MHz). Isso significa que podemos calcular facilmente quanto tempo passou dividindo o valor do contador pela frequência do oscilador.
O dispositivo de timer pode ser programado para fazer várias coisas - pode contar para cima e para baixo, comparar o registro do contador com algum valor. Por exemplo, ele pode criar um sinal externo e começar a contar desde o início quando o contador estiver com algum valor. Dessa forma, você pode configurar o dispositivo de timer para criar esse sinal externo em intervalos constantes, com uma frequência muito menor que o oscilador. Este sinal pode ser usado como um evento de interrupção para uma CPU.
Observe que o oscilador pode ser usado diretamente em vez do dispositivo de timer. O que diferencia o dispositivo temporizador / contador do oscilador é que ele pode ser programado. Assim, você pode pensar no dispositivo de timer / contador como um oscilador muito mais sofisticado.