Posts com Tag ‘encapsulamento’

Caro(a) Colega,

a minha experiência profissional é baseada no desenvolvimento de software básico (firmware) para microprocessadores, microcontroladores de 8 ou 16 bits e DSPs (Digital Signal Processors). Qual o sistema operacional que costumo utilizar? Nenhum desses tradicionais. Na verdade, em geral desenvolvo os sistemas para os meus projetos. Para os tipos de processadores citados dificilmente tem algum sistema operacional que seja enxuto e eficiente.  Afinal, processadores de 8 ou 16  bits são relativamente lentos, possuem pouca memória interna, mas têm grandes vantagens, dependendo da aplicação em que são utilizados: são simples, baratos, diminutos no seu tamanho físico e extremamente eficientes para pequenas aplicações. Tem algumas versões de microcontroladores PIC, por exemplo,  com encapsulamento de 8 pinos.

Retornando ao assunto do sistema operacional, no meu caso, de certa forma, um loop infinito é um sistema operacional de alta eficiência se associado a outros recursos dos processadores, tais como temporizações e interrupções por hardware. É uma maneira de se unir as vantagens citadas dos microcontroladores e conseguir um desempenho em tempo real adequado para algumas aplicações.

Quando se fala de software de tempo real, deve-se lembrar que isso não implica na necessidade de se realizar as tarefas no menor tempo possível, mas sim em que a velocidade de processamento, monitoramento e controle do seu projeto deve ser suficientemente veloz  e compatível com a velocidade de resposta do sistema para o qual ele foi projetado. Existem processos, principalmente os térmicos,  que levam horas ou até dias para progredirem ou mudarem de estado. Neste caso, não é necessário que o processador execute todo o seu programa em frações de segundos. Poderia até levar horas para isso, pois não afetaria o desempenho do sistema como um todo e ainda assim seria um sistema de tempo real.

Para poder ilustrar o que foi dito até aqui com um resultado prático e real do uso dessas boas práticas, vou apresentar rapidamente algumas características de um projeto que desenvolvi. Trata-se de um equipamento que faz uma varredura periódica em até 32 detectores de vazamento de combustíveis e cuja principal função é a proteção ambiental na medida em que previne a contaminação do solo de postos de combustíveis.

Algumas características do equipamento:

  • Permite a  reconfiguração sempre que necessário;
  • É capaz de detectar curto-circuitos ou rompimento dos cabos dos sensores;
  • Sinaliza a varredura por meio de LEDs;
  • Sinaliza falhas por meio de códigos apresentados em displays de 7 segmentos;
  • Gera um registro em memória não volátil a cada evento anormal, gravando a data e hora dessa ocorrência e a data/hora de quando o a ocorrência foi solucionada;
  • Quando solicitado, gera um relatório formatado para uma  impressora;
  • Gerencia um teclado;
  • Gerencia um relógio de tempo real;
  • Conecta-se em rede a um computador ou à internet para permitir um monitoramento remoto.

Tudo isso  e algumas coisinhas a mais, sendo executado num microcontrolador de 8 bits da família MCS-51, com clock de 4 MHz, 12 kBytes de memória EEPROM, 256 Bytes de RAM e  que custa em torno de R$ 20,00 no varejo.

O software foi todo escrito em C. Seu código fonte tem em torno de 8.000 linhas de programa.  É incrível? Mágica? Nem tanto…

Vale ressaltar que até hoje, 10 anos depois da primeira versão, tive que realizar apenas uma pequena correção no software e alterações decorrentes do upgrade do microprocessador para versões mais atualizadas.

Mas voltemos ao tema. Essas práticas funcionam muito bem se aplicadas a microcontroladores.  Pode ser que não sirva para você, se acaso você trabalha com um software de alto nível, Visual C por exemplo. Desenvolvo meus projetos de software na forma estruturada, aplicando práticas de encapsulamento de entradas e saídas, essas típicas de software orientado a objetos.

O que é um software estruturado?

Para quem não conhece, discorrendo resumidamente sobre o assunto, um software estruturado é organizado em blocos, o fluxo é muito bem definido e tem regras rígidas  para a recursão. Em princípio cada bloco tem uma entrada e uma saída e não se utiliza o recurso do “GOTO” em hipótese alguma, pois ele destrói e corrompe qualquer organização que se tenha realizado no software. A linguagem C, por exemplo, é na sua essência uma linguagem computacional com características de software estruturado. Difícil, não é? A seguir vou explicar e fundamentar porque se deve dar preferência à programação estruturada no caso de microcontroladores e alguns DSPs.

Representação gráfica de um programa estruturado.

Fonte: DEVMEDIA

Porque não usar programação orientada a objeto?

O principal motivo para não usar programação orientada a objeto é o tamanho do código gerado. Outro motivo é o fato de se  perder um pouco o controle de como o código é gerado e de como a memória é utilizada. Isso complica muito quando é necessário otimizar o código principalmente quando a velocidade de processamento é crítica. Quando se utiliza a linguagem C, depois de algum tempo você aprende a escrever seu código de forma a favorecer a sua otimização. Na hora do aperto, dá até para inserir inline pequenos trechos de código em Assembly (Não é recomendado, mas às vezes não há alternativa…).  Isso te dá o controle quase total sobre o que vai ser gerado no final, o quanto de memória vai ser utilizado, como vai ser utilizada essa memória, etc.

Reconheço as qualidades do software orientado a objetos, tais como a portabilidade, velocidade de desenvolvimento de código e, facilidade de manutenção , até porque aproveitei o encapsulamento de dados, típico de programação orientada a objetos,  para melhorar o software estruturado. Apenas afirmo que para o uso em microprocessadores de 8 e 16 bits, frequentemente não é a melhor alternativa. Acredito também, que com o avanço das tecnologias dos compiladores de linguagens orientadas a objeto, pode ser apenas uma questão de tempo para que esses compiladores se tornem mais eficientes e produzam resultados melhores que os compiladores de linguagens estruturadas.

O que é encapsulamento de entradas e saídas?

É um método  de organização do software que determina regras rígidas para o acesso aos parâmetros ou recursos de um determinado periférico. O acesso tem que ser realizado sempre por meio de um mesmo conjunto de rotinas. Por exemplo: suponhamos que você tenha previsto a utilização de um canal de comunicação serial no seu projeto e que haja a necessidade de se utilizar uma rotina para transmitir dados e outra para receber dados. Se o canal de comunicação for organizado de forma encapsulada, qualquer acesso ao canal serial deverá obrigatoriamente se dar por meio dessas mesmas rotinas de qualquer ponto do seu programa. Assemelha-se muito ao conceito de objeto e métodos associados, conforme definido na programação orientada a objetos, não é mesmo? A diferença é que esse objeto e os métodos associados não são genéricos, mas feitos sob medida para essa aplicação. Por isso que ela tem todas as vantagens decorrentes dessa forma de organização aliada às vantagens de ser específica: enxuta, veloz entre outras.

Vale ressaltar que a aplicação desse método a um programa estruturado deve ser realizada por iniciativa e disciplina do desenvolvedor, uma vez que os compiladores de linguagens estruturadas não oferecem ferramentas ou facilidades para fazê-lo.

Qual a vantagem dessa forma de organização?

Uma vez depuradas as rotinas que administram o seu periférico, você não precisa mais se preocupar com elas ou com o funcionamento dele. Se acaso for detectada alguma falha nesse conjunto, você corrige essas rotinas e todo o seu programa volta a funcionar corretamente.

Para ilustrar o que foi dito até aqui, no final desse artigo, disponibilizei o código de duas rotinas que escrevi para acessar uma E2PROM serial. Essas rotinas têm outros elementos recomendados de boas práticas, que discutiremos nos próximos artigos.

Talvez o jovem profissional, já habituado a utilizar ferramentas de produção de software orientadas a objeto ou de alto nível, não perceba a diferença. Isso porque as ferramentas orientadas a objeto já encapsulam os dados naturalmente. É que é muito comum o programador de software básico ou firmware, por pressa ou preguiça, não organizar o programa desse jeito e acessar diretamente o seu periférico de diversos pontos do seu programa.  É uma grande tentação fazer isso e confesso, que se o programa é pequeno, talvez até seja uma solução rápida. Quando funciona bem, que maravilha!!!!! Mas quando dá “pau” …. É um inferno!!! Fica quase impossível encontrar o problema no código e evitar que a correção do problema eventualmente mal planejada se propague de forma negativa e gere  outros defeitos imprevistos em outras partes do código.

Nos próximos artigos são abordadas algumas sugestões de como proceder para dar nomes a rotinas, variáveis e constantes de forma a aumentar a sua eficiência na produção e manutenção do seu software. Vou comentar um pouco sobre a notação húngara. Parece grego?

Também é apresentada uma ferramenta de produtividade pouco conhecida, que porém, para mim, foi um divisor de águas. Não sei como eu conseguia programar antes de utilizar essa ferramenta. Minha velocidade de produção multiplicou-se.

Confira:

Abraço!

Henrique

consulte sempre um engenheiro eletrônico

 

Licença Creative Commons
Esta obra, “Boas práticas para o desenvolvimento de software – Algumas ideias de como organizar o seu software – I“, de Henrique Frank W. Puhlmann, foi licenciada sob uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 3.0 Não Adaptada.

=================================================================================================

Rotina para escrever na E2PROM:

Rotina em C para escrita na E2PROM

Rotina em C para escrita na E2PROM – Parte 1

Rotina em C para escrita na E2PROM - segunda parte

Rotina em C para escrita na E2PROM – Parte 2

=============================================================================

Rotina para Leitura da E2PROM

Rotina em C para leitura de uma E2PROM - parte 1

Rotina em C para leitura de uma E2PROM – parte 1
Rotina em C para leitura de uma E2PROM - parte 2

Rotina em C para leitura de uma E2PROM – Parte 2

Rotina em C para leitura de uma E2PROM - parte 3

Rotina em C para leitura de uma E2PROM – Parte 3

Componentes-660x328

 .

Introdução

Nos artigos técnicos da série Projetos de Desenvolvimento Antes de Começar enfatizamos a necessidade e a importância de se realizar uma boa especificação inicial dos requisitos do nosso projeto e um esforço para se aprofundar no conhecimento relativo à matéria específica que envolve esse projeto. Os artigos dessa série estão relacionados no final deste texto. No artigo Projetos de Desenvolvimento – Primeiros passos foi apresentada uma metodologia para desenhar o projeto em blocos, detalhando as conexões e interfaces do projeto. Esse desenho serve de referência para o restante do desenvolvimento.

Quando se chega no ponto em que devemos especificar os componentes do nosso projeto, é interessante, além de atender às especificações técnicas, tentar atender também a alguns requisitos e critérios não técnicos para a seleção. Nem sempre é fácil encontrar o que necessitamos e, quando encontramos, devemos tentar considerar esses critérios não técnicos para que esse componente não se transforme num grande problema ao invés de uma boa solução.

 

Alguns critérios para a seleção de componentes

 Neste artigo serão destacados os critérios focados no pequeno e médio negócio, cuja produção do projeto será realizada num volume pequeno. Se a empresa em questão for de grande porte, esses critérios podem ser outros. Algumas empresas, por exemplo, incentivam que seus projetistas utilizem preferencialmente componentes que constam de uma lista de componentes homologados. De qualquer maneira é sempre bom estabelecer claramente esses critérios antes de selecionar os componentes para evitar surpresas desagradáveis. Alguns possíveis critérios para a seleção de componentes são:

  • Fornecedor: De preferência escolher componentes fabricados por empresas tradicionais (por exemplo: Texas Instruments, National Semiconductors – atual Texas -, Analog Devices, Fairchild, Freescale etc), que sejam distribuídos no Brasil e facilmente encontrados. Isso aumenta a chance de você encontrar mais de um fornecedor para esses componentes, o que garante uma perspectiva de vida mais longa para o seu projeto;
  • Encapsulamento: Encapsulamentos do tipo BGA (Ball Grid Array) ou similares podem causar muitos transtornos por causa da dificuldade de se montar um protótipo com eles ou de se realizar a troca desses componentes quando for necessária uma manutenção. Para pequenos projetos, pode-se ainda considerar o encapsulamento DIP (Dual Inline Package) como alternativa viável, especialmente para a nossa realidade;
  • Fornecedores Alternativos: Se houver fabricantes alternativos para o mesmo componente, pode-se garantir uma maior expectativa de vida  para o seu projeto, pois as empresas freqüentemente param de fabricá-los;
    • Verificar antes de eleger um componente, se o principal fabricante anunciou o encerramento de fabricação do mesmo. Eles fazem isso com alguma antecedência;
  • Quantidades mínimas: Evitar de especificar componentes que são fornecidos exclusivamente em embalagens com grandes quantidades (por exemplo 2000 ou 4000 unidades), a não ser que o seu projeto seja produzido em grande escala. A melhor estratégia na maioria dos casos é a de ter a possibilidade de fornecimento no varejo ou em pequenas quantidades;
  • Preço – O preço do componente pode muitas vezes ser proibitivo.

No artigo técnico O melhor microcontrolador para seu projeto publicado originalmente no site Embarcados, são apresentados alguns critérios específicos para selecionar microcontroladores. Vale a pena conferir.

Recursos para auxiliar a sua busca

Para encontrar componentes especiais, ou realizar uma busca por função, eu recomendo inicialmente o uso do site DIGCHIPNa opção Browse by function é apresentada uma lista dos componentes e seus fabricantes, inclusive vários datasheets. Pode-se observar essa página na Figura 1.

.

DIGCHIP_01_s

Figura 1: Página da busca de componentes eletrônicos por função.

.

Para mostrar um exemplo de busca, suponhamos que você deseje encontrar osciladores a cristal do tipo TCXO (Temperature Compensated Crystal Oscillators). Selecionando na página mostrada na Figura 1 a opção Timing Circuits, é apresentada a página mostrada na Figura 2.

.

DIGCHIP_02_s

Figura 2: Página da busca de componentes eletrônicos temporizadores.

.

Nessa página, mostrada na Figura 2, selecionando a opção TCXO, você obtém a resposta mostrada na Figura 3.

.

DIGCHIP_03

Figura 3: Resultado da busca por circuitos do tipo TCXO.

.

Os resultados mostrados na Figura 3 enfocam mais as especificações dos componentes. É possível encontrar os mesmos resultados com enfoque nos fabricantes, se for realizada no mesmo site uma busca paramétrica.

Há outras formas para se fazer esse tipo de busca por função. Pode-se recorrer às páginas dos grandes distribuidores de componentes eletrônicos e utilizar-se desse recurso quando disponibilizado nessas páginas. Na Figura 4 é mostrada a página do distribuidor NEWARK. Outros que você pode utilizar: FARNELL, RS COMPONENTS, DIGI-KEY etc.

.

Newark

 Figura 4: Detalhe da busca por função na página da NEWARK

 .

Outra forma de busca é a pesquisa direta nos sites dos fabricantes. O profissional de eletrônica mais experiente conhece os fabricantes mais tradicionais e também a sua principal vocação quanto ao tipo de componente. Por exemplo, a Vishay tem uma variedade enorme de componentes passivos. Microcontroladores? Tem os da Microchip, Texas, NXP, Atmel etc. Nesses sites também pode-se realizar a busca por função.

Como encontrar os fornecedores?

Uma vez selecionados os componentes que se pretende utilizar, torna-se necessário encontrar os fornecedores para esses componentes e consequentemente verificar seus preços e disponibilidade. Uma forma simples de se fazer isso é consultar diretamente os distribuidores listados no site do fabricante, onde com frequência são listados distribuidores brasileiros, ou então realizar uma busca simples na internet. Outra forma é a utilização de algumas ferramentas de busca globais. Veja alguns exemplos para você experimentar:

Essas ferramentas de busca não contemplam os distribuidores brasileiros. Porém muitos distribuidores internacionais têm representação ou filial no Brasil. Vale consultá-los também.

Como encontrar componentes alternativos ou equivalentes?  

Existem várias maneiras para se encontrar componentes alternativos ou equivalentes. Garimpar direto nos sites dos fabricantes ou de fabricantes de componentes semelhantes utilizando ferramentas de busca de referência cruzada (cross-reference) ou de substituição (replacement) que geralmente são disponibilizadas para o usuário, é uma delas.  Há também algumas ferramentas na internet que ajudam nessa identificação. Por exemplo:

Vale lembrar que a equivalência nem sempre é total. Podem haver pequenas diferenças nas especificações técnicas, encapsulamento, distribuição dos sinais nos pinos do CI etc. É necessário analisar os componentes equivalentes caso a caso e verificar se a compatibilidade é satisfatória.

.

Resumo

O importante é estabelecer os critérios não técnicos para a seleção de componentes para o seu projeto de forma que esses possam ser aplicados após você encontrar os componentes que atendam aos requisitos técnicos. A observação de todos esses requisitos ajuda na escolha da melhor solução de compromisso. Dificilmente você vai encontrar um componente que atenda a todos os seus critérios de seleção.

Neste artigo o foco foi a elaboração de critérios para a seleção dos principais componentes eletrônicos do seu projeto. Foram apresentados alguns recursos que te ajudam a encontrar esses componentes, Na sequência,  A arte de especificar e encontrar componentes – Parte II, serão apresentados recursos para se encontrar outros componentes e materiais não necessariamente eletrônicos.

Para aprender mais

Na série de artigos técnicos Projetos de Desenvolvimento: Antes de começar  foi enfatizada a necessidade e a importância de se realizar uma boa especificação inicial dos requisitos do nosso projeto e um esforço para se aprofundar no conhecimento relativo à matéria específica que envolve esse projeto. Para isso abordamos os seguintes temas:

Projetos de Desenvolvimento: Antes de começar
  • Pesquise Patentes! – A vantagem de se pesquisar os sistemas de patentes para adquirir conhecimento nos assuntos específicos e conhecer as soluções dadas pelos concorrentes;
  • Consulte as Normas Técnicas! – Os cuidados que se deve ter, se para o projeto houver a exigência de atender aos requisitos necessários de normas técnicas específicas;
  •  Estude mais um pouco! – Outras fontes para se adquirir o conhecimento necessário e extrair as informações que são necessárias.

Licença Creative Commons Esta obra, “A arte de especificar e encontrar componentes – Parte I“, de Henrique Frank W. Puhlmann, foi licenciada sob uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 3.0 Não Adaptada.