- Arquitetura de desenvolvimento de software – parte I
- Arquitetura de desenvolvimento de software – parte II
- Arquitetura de desenvolvimento de software – parte III
- Arquitetura de desenvolvimento de software – parte IV
No desenvolvimento de um sistema embarcado é importante definir uma arquitetura de desenvolvimento de software. A escolha deve ser baseada no tipo de dispositivo a ser desenvolvido. Várias características podem influenciar na escolha: a complexidade do sistema, a capacidade de processamento, a quantidade ou possibilidade de subprodutos (derivados), a necessidade de garantia de tempo real, a quantidade de periféricos, a criticidade, entre outros. Outro agravante na escolha é que, em geral, não existe solução ótima, nem uma solução geral que possa ser aplicada em todos os projetos. Segundo Richard Soley:
“Constrained by memory limitations, performance requirements, and physical and cost considerations, each embedded system design requires a middleware platform tailored precisely to its needs, unused features occupy precious memory space, while missing capabilities must be tacked on.“
Nesta série de artigos sobre Arquitetura de desenvolvimento de software serão abordados alguns modelos de arquitetura para o desenvolvimento de software embarcado, bem como os conceitos necessários para a implementação de cada um deles.
Começando pelo mais simples temos uma arquitetura denominada de “one single loop”. Este modelo é tão simples e importante para a computação em geral que o endereço da Apple fica na “1-infinite-loop” . Este modelo é caracterizado por uma estrutura de repetição, um while ou for, dentro da rotina principal, main.
As inicializações são realizadas antes do loop e as funcionalidades do sistema são colocadas dentro do loop. Para melhorar a organização é comum que as funcionalidades sejam implementadas em funções.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include "adc.h" #include "serial.h" #include "teclado.h" void main (void){ //Inicialização dos periféricos InicializaADC(); InicializaSerial(); InicializaTeclado(); //Início do loop infinito e execução das tarefas for(;;){ //ever DebounceTeclas(); if(TeclaPressionada() == '1'){ ConversaoAD(); } if(FimConversao()){ EnviaSerial(ValorAD()); } } } |
Este modelo é bastante simples e funcional, por isso foi escolhido como base da programação do Arduino onde duas funções iniciais são apresentadas: setup() e loop(). A primeira é executada antes do loop infinito e a segunda a cada iteração do mesmo.
Quando a plataforma a ser utilizada apresenta poucos recursos, principalmente no quesito de memória, a utilização de um sistema operacional pode ser inviabilizada. É comum os sistemas operacionais consumirem alguns kb de memória. O FreeRTOS, por exemplo, exige um mínimo de 5 kB. Alguns sistemas mais complexos como o VxWorks podem alcançar dezenas ou centenas de kB, inviabilizando seu uso em sistemas com apenas alguns bytes de ROM/Flash.
Apesar das vantagens aparentes, este é um modelo que deve ser usado com cautela. A velocidade de execução do loop principal é dependente das funções implementadas e qualquer alteração pode modificar este tempo. Assim é praticamente impossível utilizar a frequência de execução para realizar alguma tarefa temporal.
Outro problema é a possibilidade de travamento do sistema. Se alguma das funções entrar num loop infinito, ou em qualquer condição de deadlock, o sistema inteiro ficará paralisado.
A arquitetura one single loop pode ser utilizada com sucesso, contanto que a aplicação seja simples e não exija requisitos rigorosos com relação ao tempo de execução. Além disso, é uma abordagem interessante para realizar provas de conceito e testes iniciais em novas plataformas. Lembre-se apenas de documentar e separar as funções em arquivos diferentes, agrupadas pela similaridade ou por tipo de periférico que elas acessam. Isto facilitará a mudança do sistema para arquiteturas mais complexas quando houver a necessidade de fazê-lo.
Muito bom.
Muito bom! Continue este trabalho.
Bem interessante o artigo Rodrigo!
Excelente, bom artigo.