Toda a verdade sobre o RTOS. Artigo # 7 Núcleo SE: Introdução



No restante da série "A verdade sobre o RTOS", examinaremos em detalhes como o RTOS é implementado e implantado. Para fazer isso, consideraremos um RTOS específico: Nucleus SE. Mesmo se você não usar esse núcleo específico ou outros kernels relacionados a ele, entender como ele funciona fornecerá uma boa base para trabalhar com qualquer RTOS.

Para entender por que o Nucleus SE foi projetado dessa maneira, é importante destacar as principais tarefas e objetivos que eu segui no início deste projeto.

Artigos anteriores da série:
Artigo 6. Outros serviços RTOS
Artigo 5. Interação e sincronização de tarefas
Artigo 4. Tarefas, alternância de contexto e interrupções
Artigo # 3 Tarefas e planejamento
Artigo 2. RTOS: estrutura e modo em tempo real
Artigo 1. RTOS: introdução.


Simplicidade

O código do kernel deve ser simples, direto, bem comentado e documentado. O Núcleo SE destina-se principalmente ao uso educacional.

Tamanho

Esse deve ser um kernel pequeno e bem escalonável (já que a memória, principalmente a memória operacional (RAM), pode estar em falta).

Funcionalidade

O kernel deve ter um alto nível de funcionalidade que suporte serviços RTOS padrão.

Suporte de 8/16 bits

Ele deve suportar arquiteturas de 8 e 16 bits: na medida do possível, use dados do tamanho de um byte; estruturas de dados não devem exigir métodos exóticos de endereçamento; dados persistentes não devem ser copiados para a RAM desnecessariamente.

O futuro

Deve haver um caminho de desenvolvimento do Nucleus SE para o Nucleus RTOS. Os usuários devem poder transferir código facilmente entre núcleos. Mais importante, seu conhecimento também deve ser transferido. A API Nucleus SE efetivamente implementa um subconjunto da API Nucleus RTOS.

Custo

O modelo de negócios deve ser atraente para todos os usuários em potencial: desenvolvedores de dispositivos de 8/16 bits, aqueles que primeiro usam o RTOS e aqueles que estão apenas estudando a própria tecnologia. Assim, o Nucleus SE está disponível gratuitamente, totalmente gratuito para fins comerciais e educacionais; o código pode ser usado e modificado.

Núcleo de público-alvo SE

O resultado dessa abordagem é um kernel que pode ser útil para três tipos de desenvolvedores:

  • Programadores de dispositivos de 8/16 bits que exigem um simples kernel ou agendador de tarefas. Isso é especialmente atraente se os desenvolvedores estiverem interessados ​​em adquirir certas habilidades para usar o RTOS ou quando desenvolverem um sistema que use outros dispositivos de 32 bits nos quais o Nucleus RTOS possa ser uma boa opção.
  • Desenvolvedores de aplicativos incorporados que usam dispositivos de 32 bits em que a complexidade do software não vale o custo de um RTOS comercial tradicional. O uso do Nucleus SE pode ser útil e permitirá o desenvolvimento (até o Nucleus RTOS) se a complexidade do aplicativo aumentar.
  • Os alunos no processo de aprendizado podem usar o Nucleus SE como base para aprender o RTOS. As habilidades adquiridas serão úteis mais tarde, quando começarem a trabalhar.

Decisões e trade-offs de design

Para alcançar os objetivos acima, várias decisões de projeto cuidadosamente pensadas tiveram que ser tomadas. Os detalhes serão descritos mais adiante quando considerarmos funções específicas, mas aqui está um breve resumo dos pontos principais.

Configuração estática

O Nucleus SE é um RTOS estático, o que significa que todas as decisões de configuração são tomadas no tempo de construção, não dinamicamente no tempo de execução. Isso tem muitas vantagens, incluindo a simplificação da estrutura de dados e a redução do tamanho do código, portanto, não há necessidade de chamar as funções de criação e exclusão da API. Para a maioria dos aplicativos, a criação dinâmica de objetos não é necessária.

Número de objetos

O número de objetos de cada tipo é limitado em um aplicativo baseado no Nucleus SE. Pode ter de uma a dezesseis tarefas e de zero a dezesseis tipos diferentes de objetos do kernel. Isso simplifica o endereçamento de objetos (veja abaixo). Essa restrição não é difícil para aplicativos pequenos para os quais o kernel é destinado.

Endereçando objetos

Os objetos são endereçados usando um "índice", que pode variar de zero a quinze. Comparado ao uso usual de ponteiros, isso pode ser mais eficiente em processadores menores e permitir menos memória: o índice requer apenas 4 bits de memória; O endereço é 16-32 bits.

Planejador

O agendador pertencia à área da arquitetura do kernel que foi simplificada. Em vez de fornecer um mecanismo flexível com políticas de agendamento diferentes, quatro tipos de agendadores separados estão disponíveis no kernel; o planejador específico para o aplicativo é selecionado durante a configuração.

Funcionalidade limitada

Alguns recursos disponíveis no Nucleus RTOS não são implementados no Nucleus SE. Em alguns casos, isso é feito para simplificar. Em outros casos, uma leve perda de funcionalidade em uma área facilita a implementação da outra. Essas incompatibilidades são destacadas nos artigos relevantes da série.

Uso de memória

Como o Nucleus SE deve suportar aplicativos de memória limitados, atenção especial foi dada ao uso de memória. Era para usar a ROM e RAM "clássicas": a ROM era usada para código e dados persistentes; RAM - para armazenar variáveis, uma pilha, etc. Embora um destino específico possa ter um esquema diferente, o código Nucleus SE é bastante flexível; As definições (#defines) de ROM e RAM são usadas para prefixar todas as estruturas de variáveis ​​e dados para indicar sua localização. Isso pode ser alcançado usando ferramentas.

O principal requisito era evitar a cópia desnecessária de dados da ROM para a RAM, pois a RAM pode não ser suficiente. O mecanismo pelo qual isso é alcançado é descrito na seção Estruturas de dados do próximo artigo.

Implementação de API

A API do Nucleus SE é implementada da maneira tradicional: a função da linguagem C implementa todas as chamadas da API. Essas chamadas são agrupadas logicamente. Embora as chamadas de API no Nucleus SE não sejam exatamente as mesmas que no Nucleus RTOS, a funcionalidade geral é simulada e o mapeamento entre as APIs é fácil. Detalhes da API Nucleus RTOS serão incluídos.

Seções críticas

O código para muitas chamadas de função da API inclui seqüências de instruções que manipulam dados do kernel. Geralmente, os dados podem estar em um estado inválido durante a execução dessas instruções, portanto, é necessário tomar cuidado para evitar interrupções. Ou, pode ser proibido executar código de outra tarefa ou interromper o manipulador se puder acessar esses dados (atualmente inválidos). Tais seqüências de instruções são chamadas seções críticas.

Um par de macros é definido chamado NUSE_CS_Enter () e NUSE_CS_Exit (). Todo o código de funções da API Nucleus SE os utiliza para abranger a seção crítica, assim:

NUSE_CS_Enter ();
<código não interruptível>
NUSE_CS_Exit ();

Normalmente, essas macros serão expandidas em instruções de desativação de instruções de interrupção e instruções de ativação de interrupção, respectivamente. Isso precisará ser verificado se o Nucleus SE for implementado em uma arquitetura de processador diferente. Mais informações sobre como portar o Nucleus SE serão descritas no próximo artigo.

Escalabilidade

Como todos os RTOS modernos, o Nucleus SE é escalável. Para garantir que apenas os componentes RTOS usados ​​sejam incluídos, todas as funções da API são apresentadas na forma de uma biblioteca. Assim, durante a vinculação, as funções referenciadas são extraídas e incluídas na imagem final do aplicativo. O Nucleus RTOS usa essa abordagem para o kernel e todos os outros componentes do SO. O Núcleo SE usa uma técnica diferente.

Em vez de depender da biblioteca na caixa de ferramentas selecionada, todos os arquivos de origem na distribuição do Nucleus SE contêm diretivas de compilação condicionais. Para configurar o Nucleus SE para o programa, o desenvolvedor precisa instalar vários caracteres #define (mais sobre isso no próximo artigo). Isso determina quais funções da API são compiladas e, portanto, incluídas no programa.

O Nucleus SE aprimora essa abordagem oferecendo um objeto que chamo de "extrema escalabilidade". Vários aspectos da funcionalidade do kernel podem ser ativados e desativados, ou configurados de outras maneiras usando caracteres #define semelhantes. Assim, o desenvolvedor tem um controle de ponto sobre o uso da memória.

Qual API?

O Nucleus SE possui sua própria API, que será descrita em detalhes em artigos futuros. Para muitos usuários, basta incluir essas chamadas nas funções da API no código.

Alguns usuários podem preferir usar uma API diferente: padrão ou uma que eles estejam familiarizados. A API do Nucleus SE é bastante flexível e permite criar um wrapper que transforma uma interface em outra API.

Um dos principais objetivos do desenvolvimento do Nucleus SE é um alto grau de compatibilidade no nível do usuário com o Nucleus RTOS. Embora as APIs sejam diferentes, elas foram projetadas para serem fáceis de combinar. Um wrapper estará disponível para facilitar o uso da API Nucleus RTOS no Nucleus SE.

No próximo artigo, continuaremos analisando o Nucleus SE e focando na estrutura interna e na implantação do RTOS.

Source: https://habr.com/ru/post/pt418601/


All Articles