O conceito de tempo no contexto do RTOS foi introduzido em um dos
artigos anteriores , juntamente com a idéia de funções relacionadas ao tempo disponíveis no RTOS.

Artigos anteriores da série: Tick timer
Todas as funções relacionadas ao tempo são controladas por um relógio de hardware. Este é um oscilador simples que gera solicitações de interrupção em intervalos regulares. Para que os números do relógio façam sentido para os aplicativos, é necessário saber a frequência do gerador.
Manipulação de interrupção do temporizador
As interrupções geradas pelo timer de hardware devem ser reparadas de maneira específica no manipulador de interrupções (Interrupt Service Routine, ISR), que implementa todas as funções RTOS relacionadas ao tempo. Os detalhes do manipulador de interrupção do timer no Nucleus SE serão discutidos em um dos seguintes artigos.
Funções relacionadas ao tempo
O núcleo RTOS e o núcleo SE contêm vários mecanismos relacionados ao tempo:
- Clock do sistema (Tick clock) : um contador simples que é incrementado usando um manipulador de interrupção do timer. O Nucleus RTOS e o Nucleus SE possuem um contador de 32 bits e as tarefas possuem mecanismos para ler e escrever seu valor. No Nucleus SE, um relógio é opcional.
- Temporizadores de aplicativos : o Nucleus RTOS e o Nucleus SE suportam objetos de timer. Seu uso e implementação no Nucleus SE serão discutidos em mais detalhes no próximo artigo.
- Agendamento de intervalo de tempo: no Nucleus RTOS, tarefas com a mesma prioridade são executadas usando o algoritmo Round-robin, mas você também pode usar o intervalo de tempo. No Nucleus SE, um agendador de divisão de tempo é opcional; isso foi discutido em detalhes em artigos anteriores (uma visão geral do agendador TS (intervalo de tempo) e TS no Nucleus SE ).
- Suspender uma tarefa (suspensão da tarefa) : uma tarefa pode pausar-se ("adormecer") por um período fixo de tempo. Esse mecanismo já foi descrito em detalhes anteriormente .
- Tempo limite das chamadas da API : no Nucleus RTOS e no Nucleus SE, algumas chamadas de API permitem pausar uma tarefa enquanto aguarda a disponibilidade de um recurso. A pausa pode ser indefinida ou, no caso do Nucleus RTOS, um período de tempo limite opcional (período de espera) pode ser indicado. O Nucleus SE não suporta tempos limite de chamada da API.
Precisão
E agora vale a pena falar brevemente sobre a precisão do timer do sistema.
A precisão das funções de tempo depende diretamente da frequência do gerador de relógio. Por exemplo, se pulsos chegarem a cada 10 milissegundos e a tarefa de aplicação precisar de um atraso de 100 milissegundos, obviamente precisará de 10 pulsos. No entanto, não se sabe quando o impulso anterior foi recebido: poderia ter acontecido há apenas 10 milissegundos atrás. Portanto, um atraso de 100 milissegundos pode levar até 110 milissegundos.
Uma maneira óbvia de resolver esse problema é aumentar a frequência do gerador. Se os pulsos seguirem a intervalos de 1 milissegundo, um atraso de 100 milissegundos nunca levará mais de cento e um milissegundos. A desvantagem dessa solução é que o manipulador de interrupção do timer levará 10 vezes mais tempo do processador, o que será excessivo. O projetista do sistema deve encontrar um equilíbrio entre a precisão necessária do timer e a potência disponível do processador.
Configuração da hora do sistema
Como na maioria dos objetos do Nucleus SE, as configurações de hora do sistema são
geralmente controladas pelas diretivas
#define no arquivo
nuse_config.h . O parâmetro principal é
NUSE_SYSTEM_TIME_SUPPORT , que ativa o mecanismo de suporte de horário do sistema. Você não precisa especificar o número de objetos: a hora do sistema está ativada ou não.
A escolha de um valor diferente de zero é o principal ativador da hora do sistema. Este parâmetro é usado ao definir estruturas de dados, que serão discutidas em detalhes posteriormente neste artigo. Além disso, um valor diferente de zero ativa as configurações da API.
Ativação de API
Cada função de API (chamada de utilitário) no Nucleus SE possui uma diretiva #define de ativação no arquivo nuse_config.h. Para a hora do sistema, esses símbolos são:
NUSE_CLOCK_SETNUSE_CLOCK_RETRIEVEPor padrão, eles são definidos como
FALSE , portanto, todas as chamadas de serviço são desativadas, bloqueando a inclusão do código que as implementa. Para configurar a hora do sistema no aplicativo, é necessário selecionar as chamadas de serviço da API necessárias e defini-las como
TRUE .
A seguir, um trecho de código do arquivo nuse_config.h padrão.
#define NUSE_SYSTEM_TIME_SUPPORT FALSE /* */ #define NUSE_CLOCK_SET FALSE /* */ #define NUSE_CLOCK_RETRIEVE FALSE /* */
Se você tentar usar a chamada de serviço da API do horário do sistema quando o ativador do horário do sistema estiver desligado, ocorrerá um erro de compilação. Se o seu código usar uma chamada de API que não foi ativada, ocorrerá um erro de layout porque o código de implementação não foi incluído no aplicativo.
Chamadas do System Time Utility
O Nucleus RTOS suporta duas chamadas de utilidade relacionadas à hora do sistema e fornece a seguinte funcionalidade:
- Configurando o valor da hora do sistema. O núcleo SE é implementado na função NUSE_Clock_Set () .
- Obtendo o valor da hora do sistema. O núcleo SE é implementado na função NUSE_Clock_Retrieve () .
Considere a implementação de cada uma dessas chamadas em mais detalhes.
Chamadas de serviço para definir e obter a hora do sistema
Com a hora do sistema, você só pode executar operações de configuração para um determinado valor e obtenção do valor atual. O Nucleus RTOS e o Nucleus SE fornecem duas chamadas API básicas para implementar essas operações.
A interpretação do valor da hora do sistema depende da aplicação, pois é essencialmente um contador do número de "ciclos de relógio" que ocorreram desde a última redefinição do contador. Para usar essas informações, a frequência do gerador deve ser conhecida.
Ajuste de tempo
Qualquer tarefa pode definir a hora do sistema chamando esta função da API.
Chamada para definir a hora do sistema no Nucleus RTOSProtótipo de chamada de serviço:
VOID NU_Set_Clock (UNSIGNED new_value);Parâmetros:
new_value - valor a ser atribuído à hora do sistema
Valor de retorno: nenhum.
Ligue para definir a hora do sistema no Nucleus SEEssa chamada de API suporta a funcionalidade principal da API do Nucleus RTOS.
Protótipo de chamada de serviço:
void NUSE_Clock_Set (U32 new_value);Parâmetros:
new_value - valor a ser atribuído à hora do sistema
Valor de retorno: nenhum
Implementação da definição de horário no Núcleo SEO código é muito simples. O valor fornecido é gravado em
NUSE_Tick_Clock dentro da seção crítica.
Obtendo hora do sistema
Uma tarefa pode obter o valor da hora do sistema usando esta função da API.
Ligue para obter a hora do sistema no Nucleus RTOSProtótipo de chamada de serviço:
NU_Retrieve_Clock NÃO ASSINADO (VOID);Parâmetros: Nenhum
Valor de retorno: valor atual da hora do sistema
Ligando para obter a hora do sistema no Nucleus SEProtótipo de chamada de serviço:
U32 NUSE_Clock_Retrieve (nulo);Parâmetros: Nenhum
Valor de retorno: valor atual da hora do sistema
Implementação da aquisição de tempo no Núcleo SEO código é muito simples. A função retorna o valor
NUSE_Tick_Clock obtido na seção crítica.
Estruturas de dados
A hora do sistema usa uma estrutura de dados (localizada na RAM), que é uma palavra de 32 bits.
Eu recomendo fortemente que o código do aplicativo não use acesso direto a essa estrutura de dados, mas acesse-o através das funções de API fornecidas. Isso evitará a incompatibilidade com versões futuras do Nucleus SE e efeitos colaterais indesejados, além de simplificar a portabilidade de aplicativos para o Nucleus RTOS. Detalhes das estruturas de dados são fornecidos abaixo para simplificar o entendimento do código de chamada de serviço e da depuração.
Dados RAM
Estrutura de dados:
NUSE_Tick_Clock - uma variável do tipo
U32 , que armazena o contador do relógio da hora do sistema.
Essa estrutura de dados é inicializada em zero pela função
NUSE_Init_Task () quando o Nucleus SE é iniciado. Um dos artigos a seguir conterá uma descrição completa dos procedimentos de inicialização do Nucleus SE.
Dados ROM
Não há estruturas de dados associadas à hora do sistema na ROM.
A quantidade de memória para a hora do sistema
Como todos os outros objetos do Nucleus SE, a quantidade de memória necessária para o tempo do sistema é previsível.
A quantidade de memória na ROM é 0.
A quantidade de memória na RAM (em bytes) é sempre 4.
Chamadas de API não realizadas
Todas as chamadas de serviço da API do Nucleus RTOS em tempo de sistema têm um equivalente no Nucleus SE.
Compatível com Nucleus PLUS
Como com todos os outros objetos do Nucleus SE, meu objetivo era garantir que o código do aplicativo seja o mais compatível possível com o Nucleus RTOS. A hora do sistema não é exceção e, do ponto de vista do usuário, é implementada da mesma maneira que no Nucleus RTOS. As chamadas da API do Nucleus RTOS podem ser portadas diretamente para o Nucleus SE.
No artigo a seguir, consideraremos os temporizadores de software.