Como o Pi controla o intervalo de tempo?

8

Pelo que entendi, o RTC é necessário para acompanhar o tempo. No entanto, o Raspberry Pi não possui isso e usa servidores NTP para sincronizar seu tempo.

Tudo bem, mas como Pi sabe que um milissegundo ou um segundo se passou. Como Pi está ciente da passagem do tempo?

AppleGrew
fonte
O RTC está realmente lá (com uma bateria) para quando o Pi (ou qualquer processador) estiver desligado.
Octopus
O Pi possui um relógio interno que é definido pelo NTP sempre que está na Internet, como você disse. É um software que o acompanha e a subsequente passagem do tempo, não um RTC absoluto. Os comandos padrão do Linux podem recuperar essas informações sempre que você precisar. Portanto, para responder à sua pergunta, tudo o que "sabe" é o momento em que foi definido mais recentemente e quantos ticks desde então. Aqui está um artigo interessante sobre o assunto. : blog.remibergsma.com/2013/05/12/…
SDsolar

Respostas:

16

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. jiffieso 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 HZparâmetro de configuração do kernel.

A qualquer momento, o kernel sabe quantos ticks foram gerados a partir da inicialização ( jiffiesvariável), sabe quantos ticks são gerados a cada segundo ( HZopção de configuração) para que possa calcular facilmente quanto tempo passou desde a última inicialização.

Então, para resumir - o kernel pergunta RTCsobre 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/HZvalor a isso sempre que um aplicativo de espaço de usuário pergunta a que horas está usando a clock_gettimechamada 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.

Krzysztof Adamski
fonte
Teria sido mais útil se mais detalhes tivessem sido fornecidos sobre o timer interno.
AppleGrew 15/05
@AppleGrew: Em quais detalhes você está interessado?
Krzysztof Adamski 15/05
Você pode nomear os temporizadores que você mencionou? Para que eu possa ler mais sobre eles. Quando eu pesquiso no "temporizador interno da CPU", não parece ter nada de relevante. Não tenho certeza do que exatamente espero aprender com isso, mas sinto que ainda me falta alguma clareza.
AppleGrew 16/05
@ Appleprew: eu adicionei mais algumas informações básicas à minha pergunta. Espero que isto ajude.
Krzysztof Adamski 16/05
BTW, você pode querer corrigir o erro de digitação - 'suck' no terceiro parágrafo da seção 'Time in Linux'.
AppleGrew 17/05
1

O relógio da CPU é derivado de um cristal. Normalmente, você pode esperar de 10 a 20 partes por milhão para a precisão do relógio (cerca de 5 a 10 minutos por ano)

John La Rooy
fonte
0

De qualquer forma, para responder à pergunta de uma maneira muito mais fácil, juntamente com as instruções para adicionar um RTC ao seu PI, vou inserir um link abaixo. Dependendo se você deseja apenas um método confiável, além de usar a maneira inet / ntp para determinar o tempo ou precisar de um método muito preciso, eu recomendaria usar o RTC "Chronodot". Caso contrário, o RTC do breakout board funcionaria bem e é muito fácil começar a trabalhar. Tudo o que você precisa é configurar o I2C para que o PI se comunique com o RTC. Informações / materiais do link

Niz
fonte