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

No artigo anterior foram apresentados os conceitos básicos sobre periféricos e mapas de memória. É importante lembrar e enfatizar que o conjunto de periféricos e a disposição do mapa de memória são específicos para cada microcontrolador.

 

Uma vez que os conceitos básicos foram explicados, este artigo abordará a construção de módulos para controlar periféricos. O objetivo é apresentar o procedimento para criar um conjunto de funções para controlar determinado periférico.

 

Muitas aplicações que desenvolvemos por vezes executam o mesmo procedimento. Mas será possível utilizar em uma plataforma um código que foi desenvolvido para outra? Iniciaremos essa discussão criando um código sem pensar em portabilidade, considerando somente sua aplicação para um microcontrolador específico. No próximo artigo serão apresentados métodos para aumentar a portabilidade da aplicação.

 

Antes de criar módulos para configuração de cada periférico é importante conhecer alguns recursos da linguagem C. Alguns conceitos básicos foram apresentados no artigo sobre programação modular. Mesmo assim, cabe lembrar alguns conceitos importantes.

 

 

Linguagem C e programação modular

 

O projeto de um programa em C segue a abordagem Top-Down, sendo caracterizado por estrutura-lo a partir da rotina de nível mais alto até as rotinas de nível mais baixo. Em outras palavras, o programa começa com uma descrição geral e caminha em direção da particularização [1].

 

Diante disso, o projeto estruturado corresponde a uma decomposição funcional de uma aplicação em um conjunto de módulos bem definidos. Esses módulos cooperam para desempenhar a funcionalidade definida pela aplicação.

 

Programação Estruturada: Um método de escrever um programa que utiliza (1) análise Top-Down para solução de problemas, (2) modularização para estruturar e organizar o programa, e (3) estruturação do código em módulos individuais [2].

 

Para tal, a linguagem C tem como característica a compartimentalização do código e dos dados, isto é, a capacidade de seccionar e encapsular partes do programa. O principal componente da linguagem que possui tal característica é a função.

 

A função permite modularizar um programa, pois possibilita codificar, separadamente, uma determinada tarefa [1]. Além disso, tal procedimento traz algumas vantagens, como a reutilização de código, compilação individual de código, e a estrutura do código fica mais clara.

 

 

Módulos em linguagem C

 

Um módulo na linguagem C é criado utilizando arquivos de cabeçalho e de implementação.

 

Arquivo de cabeçalho: Os arquivos ‘.h’ são utilizados para especificar assinatura de funções, definições de constantes, tipos de dados criados pelo usuário etc. De modo geral, os arquivos de cabeçalho têm como função definir a interface de um módulo.

 

Arquivo de implementação: Os arquivos ‘.c’ implementam as funções definidas na interface. De modo geral, esses arquivos são compostos por diversas funções e estruturas de dados utilizadas internamente.

 

Para criar aplicações seguras que não entrem em conflito com outros módulos, os conceitos apresentados sobre modificadores de armazenamento e o pré-processador podem ser aplicados. Exemplo disso é a utilização de header guards, outro é a utilização de modificadores static e extern.

 

O conceito de header guards pode ser visto aqui. Basicamente, a aplicação de header guards é realizada para evitar que o código presente no arquivo de cabeçalho seja copiado para o fonte que fez sua inclusão. Já os modificadores podem ser empregados para limitar o escopo de funções e variáveis que são utilizadas somente dentro do módulo, tornando "público" somente o que é necessário.

 

 

Criando uma biblioteca

 

O desenvolvimento de um módulo para controlar os terminais do microcontrolador já foi apresentado neste artigo: Criando uma biblioteca de acesso aos IOs da KL0. Nesse artigo, a biblioteca apresenta a seguinte interface.

 

 

No artigo anterior foram citados exemplos com as funções digitalWrite() e pinMode() para configuração do pino que aciona o LED da Franzininho. Retomaremos esse exemplo a seguir, considerando os pinos do ATtiny85 ilustrados na figura abaixo.

 

Encapsulamento e Pinos do microcontrolador ATtiny85
Figura 1: Encapsulamento e Pinos do microcontrolador ATtiny85 [3].

 

A implementação dessas funções é mostrada a seguir. Lembre-se que o terminal usado era o PB1 (pino 6).

 

 

É claro que as operações demonstradas podem ser otimizadas. Pois, somente o PORTB é acessível neste encapsulamento. Todavia, esse exemplo é importante pois evidencia o uso de funções para encapsular o acesso de qualquer periférico. Para realizar a configuração, basta executar um procedimento disponibilizado pela biblioteca.

 

 

Saiba Mais

 

Como visto, esse módulo foi criado especialmente para o ATtiny85. Portanto, o código é dependente dos registradores e também da numeração dos terminais. Mesmo assim, a aplicação já apresenta a divisão de responsabilidade e possibilita a reutilização de código. Seguindo o tema em discussão, o próximo artigo será apresentado alguns métodos para aumentar a portabilidade da aplicação.

 

Enquanto isso, vale conferir alguns artigos publicados no Embarcados:

Criando uma biblioteca de acesso aos IOs da KL05

Bibliotecas de Software para FRDM-KL25Z

Biblioteca de Soft Timers Criando suas próprias bibliotecas para Arduino.

 

 

Referências

 

[1] Livro: C, completo e total – 3ª edição revista e atualizada. Herbert Schildt.

[2] John Dalbey – Structured Programming

[3] - ATtiny85

Crédito da Imagem Destacada.

Outros artigos da série

<< Programação de Periféricos Mapeados em Memória: IntroduçãoProgramação de Periféricos Mapeados em Memória: Interface de Acesso ao Hardware >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fernando Deluno Garcia
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

Deixe um comentário

avatar
 
  Notificações  
Notificar