Programação de Periféricos Mapeados em Memória: Interface de Acesso ao Hardware

Confira alternativas para tornar um módulo portável. O objetivo é estabelecer uma interface com funções bem definidas que abstrai o acesso ao hardware.
Este post faz parte da série Programação de Periféricos Mapeados em Memória. Leia também os outros posts da série:

No último artigo foram descritos os procedimentos para criar módulos em linguagem C para encapsular as operações de acesso ao hardware. Mesmo com módulos simples, a aplicação fica estruturada, sendo cada módulo responsável por uma função específica.

A discussão levantada no final do último artigo foi em relação à portabilidade. Uma vez que a aplicação está dividida em módulos, por mais que a interface do módulo seja suficiente para abstrair as operações realizadas, ainda assim, existe a dependência do microcontrolador.

Neste artigo serão demonstrados alguns procedimentos que podem ser utilizados para tornar um módulo portável. O objetivo é estabelecer uma interface com funções bem definidas que abstrai o acesso ao hardware. A diferença em relação ao que foi demonstrado está justamente na definição da interface, que será estruturada de tal forma que a aplicação principal não necessitará conhecer detalhes dos recursos de hardware e periféricos que são utilizados no microcontrolador. Para tal, é indispensável conhecer as Técnicas de Mapeamento de Memória em Linguagem C.

Configurações do módulo

Primeiro passo

Para abstração do hardware é necessário criar os atributos de configuração do módulo. É importante ressaltar que essas características são dependentes do microcontrolador. No entanto, se você analisar as configurações de periféricos de diferentes microcontroladores certamente encontrará configurações em comum. Por exemplo, os terminais podem ser configurados na função de entrada ou saída digital. Funções específicas são adicionadas como extensão do módulo.

O trecho de código a seguir define as propriedades de um terminal do microcontrolador. A inclusão do arquivo dio_cfg_target expande as funções de configuração. Para tal, retomaremos o exemplo do último artigo que realizada a configuração do pino PB1 do microcontrolador ATtiny85 como saída digital.

A implementação da função Dio_GetConfig será apresentada em breve. No momento é importante saber que tal função retorna a configuração dos pinos utilizados na aplicação.

Segundo Passo

Com os atributos definidos, o próximo passo é desenvolver a interface de acesso ao módulo, definindo as funções para utilização do recurso (periférico ou conjunto de periféricos).

Terceiro Passo

Os dois módulos apresentados são independentes do microcontrolador utilizado. Somente a implementação dessas funções é dependente.

As configurações específicas do módulo são mostradas abaixo.

Quarto Passo

Na implementação do arquivo de configuração do módulo é criada uma tabela de configuração dos pinos utilizados. Essa tabela é utilizada na função de inicialização do módulo.

Quinto Passo

A última etapa corresponde à implementação das funções definidas na interface do módulo. Antes disso, cabe rever o conceito de Mapeamento de memória usando vetor de ponteiros.

Mapeamento de memória usando vetor de ponteiros

É uma técnica utilizada para agrupar um conjunto de registradores, relacionando-os a partir de um nome comum. Além de referenciá-los da mesma maneira, tais registradores também são agrupados por função. De modo geral, um vetor de ponteiros é criado para armazenar o endereço de cada registrador do módulo.

Por exemplo, todos os registradores de saída (no ATtiny85, PORTB) podem ser agrupados em um vetor. Uma vez que os registradores estão agrupados por funções, o código pode ser estruturado para criar módulos.

Por exemplo, no trecho de código abaixo os registradores foram agrupados em duas categorias, direção e valor de saída.

A função de inicialização configura todos os elementos definidos na tabela com base no registradores declarados dentro do módulo.

A função de inicialização utiliza a própria interface para configurar os pinos.

Somente esta parte de código acessa o hardware. Isto é, as funções definem uma interface de acesso para um conjunto de recursos, já os recursos são configurados conforme o dispositivo.

A utilização dessa biblioteca é mostrada a seguir.

Conclusão

Existem diversas técnicas que podem ser empregadas para fazer o mapeamento de memória. De modo geral, essas técnicas diferem nos seguintes aspectos [1]: densidade do código, tempo de execução, eficiência, portabilidade e grau de configuração.

A técnica apresentada neste artigo tem alguns impactos: diminui a densidade do código (aumenta o número de instruções) e acresce o tempo de execução [1]. No entanto, a portabilidade e grau de configuração dos periféricos aumentam substancialmente [1].

A aplicação destas técnicas dependerá do dispositivo utilizado, pois em alguns casos a quantidade de memória disponível é baixa. Assim, deve-se considerar esses fatores, balanceando portabilidade do código, facilidade de configuração (abstração do hardware) e dos recursos disponíveis.

Nesse exemplo, o módulo permitiu criar uma instância de cada pino, mas isso tem impacto na memória utilizada. É importante também citar que o módulo não fica limitado somente a essas funções. Operações para acessar o port completo e permitir operações mais rápidas (fast gpio) podem ser estendidas.

Por fim, as interfaces de acesso ao hardware podem ser utilizadas para implementação de drivers. Devido à interface fornecida pelo módulo, o driver pode ser criado e mantido para várias aplicações. Já a aplicação pode ser executada em microcontroladores diferentes, tendo que alterar somente a parte de acesso ao hardware.

Saiba mais

Criando uma biblioteca de acesso aos IOs da KL05

Técnicas de Mapeamento de Memória em Linguagem C

Princípio da Responsabilidade Única em Firmwares

Referências

[1] BENINGO, J. Reusable Firmware Development: A Practical Approach to APIs, HALs, and Drivers.

Crédito da Imagem Destacada.

Outros artigos da série

<< Programação de Periféricos Mapeados em Memória: Módulos

Fascinado por computação, especialmente na interface entre hardware e software, me engajei na área de sistemas embarcados. Atuo com desenvolvimento de sistemas embarcados e sou docente da Faculdade de Engenharia de Sorocaba.

Para mais informações: https://about.me/fdelunogarcia

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Imagens de Ultrassom: Princípios e Aplicações

DATA: 26/10 ÀS 19:30 H