sexta-feira, outubro 03, 2008

Microcontroladores - Parte 17

Neste penúltimo post da série, vou passar os meus conselhos finais.

Use os Recursos do C

Uma das características da linguagem C é possuir vários recursos que são implementados em tempo de compilação, não impactando a execução. Estes recursos permitem programas mais claros e com menos erros.

Infelizmente, alguns (muitos ?) desenvolvedores de sistemas embarcados resolvem "otimizar" o código deixando de usar estes recursos.

Alguns recursos importantes são:
  • defines: na mais delicado que fazer uma alteração simples que envolva "números mágicos" que foram colocados diretamente no código (e que podem se esconder na forma de expressões resolvidas na cabeça do programador, impossibilitando um find-replace).
  • compilação condicional: dadas as limitações de memória dos microcontroladores, muitas vezes não é possível selecionar trechos a executar durante a execução (isto vale principalmente para trechos de auxílio à depuração). A compilação condicional fornece uma forma muito mais segura de remover um trecho de código (e recolocá-lo depois) do que o uso de comentários. A compilação condicional também facilita ter módulos fontes comuns a vários projetos (ao invés do copy-paste-altera que gera vários fontes parecidos porém diferentes, dificultando o aproveitamento de aperfeiçoamentos e correções).
  • struct/union: o uso de struct e union permite documentar melhor estruturas e formatos do que o uso de índices sobre um vetor de bytes e ajudam a evitar erros grosseiros.
  • bitfields: não são tão comuns quanto structs, mas tem a mesma finalidade.
  • enum: quando se trata de valores relacionados, o enum é muito mais legível que uma sequência de defines.
  • typedef: permite criar algo muito parecido com tipos personalidados e facilita criar fontes que serão usados em ambientes diferentes (através da criação de tipos "genéricos" como INT8, INT16 e INT32 que são resolvidos no tipo apropriado em cada ambiente).
Comente Bem o Código

Comentários não pesam no runtime, portanto não tem nenhuma contra-indicação para sistemas embarcados. Pelo contrário, a programação de microcontroladores é normalmente cheia de sutilezas que exigem comentários mais elaborados. Considere também o uso de uma ferramenta que gera documentação a partir dos comentários, como o Doxygen.

Procure o Equilíbrio

Em alguns casos, boas práticas de programação poderão entrar em conflito com a necessidade de otimização. Nestes casos (que são bem menos comuns do que pode parecer à primeira vista), é importante parar, pensar e procurar o ponto certo de equilíbrio.

Um erro comum é abandonar sumariamente as boas práticas visando um "otimização" desnecessária e que às vezes nem se concretiza. Na outra ponta, alguns iniciantes na programação de microcontroladores às vezes pensam que estão fazendo software para desktop e introduzem overheads inaceitáveis para o mundo embarcado.

Conheça Hardware

A programação de microcontroladores está a um degrau do hardware. Algumas coisas ficam muito difíceis de ser compreendidas por quem não tem noções básicas de hardware e eletrônica. Além disso, o programador de firmware tem uma interação muito forte com o projetista do hardware; este diálogo será mais fácil se um tiver uma idéia do mundo do outro.

Pense na Depuração

A correção de problemas constuma ser bem mais trabalhosa nos sistemas embarcados. É vital se pensar, desde o começo do projeto, nos recursos que estarão disponíveis para a depuração tanto durante o desenvolvimento como depois que o firmware for para o campo.

Nenhum comentário: