eXtreme Embedded Process – Uma Metodologia para Engenharia de Software Embarcado Robson Santos, Rodrigo Lobo, Valéria Cavalcanti. {robson, rodrigo, valeria}@dsc.ufcg.edu.br Programa de Pós-Graduação em Informática Departamento de Sistemas e Computação Universidade Federal de Campina Grande – UFCG Campina Grande – Paraíba – Brasil Resumo: Este artigo descreve um processo de desenvolvimento de sistemas embarcados. O nosso objetivo é colocar um conjunto de práticas que possam ser utilizadas para o desenvolvimento de tais sistemas de forma que os projetos de software e hardware sejam os mais integrados possíveis. A nossa metodologia também visa um desenvolvimento iterativo e incremental de forma a existir um replanejamento contínuo, onde são avaliados, riscos, ROI, e os próprios requisitos não funcionais com o objetivo de termos um produto final simples, funcional e adequado ao tempo de negócio no qual será colocado no mercado. Abstract: This article describes a process of development of embarked systems. Our objective is to place a group of practices that you/they can be used for the development of such systems so that the software projects and hardware they are the more integrated possible. Our methodology also seeks a development reiterated and form incremental to a continuous re-planning to exist, where they are appraised, risks, ROI, and the own requirements don't work with the objective of terms a simple, functional and appropriate final product at the time of business in which will be placed at the market. -1- SUMÁRIO 1. INTRODUÇÃO .......................................................................................................................... 3 1.1 EVOLUÇÃO DOS SISTEMAS EMBARCADOS ................................................................. 4 1.1.1 SISTEMAS OPERACIONAIS DISPONÍVEIS .............................................................. 5 1.2 APLICAÇÕES ..................................................................................................................... 5 2. TRABALHOS RELACIONADOS ............................................................................................... 6 Extreme Embedded [1] ............................................................................................................. 6 3. CONSIDERAÇÕES SOBRE DESENVOLVIMENTO DE SOFTWARE EMBARCADO ............ 8 3.1 ESCOLHA DO SISTEMA OPERACIONAL ........................................................................ 9 3.1.1 SISTEMAS EMBARCADOS e GNU/Linux ................................................................ 10 4. DESAFIOS .............................................................................................................................. 11 5. PROCESSO DE DESENVOLVIMENTO DE SOFTWARE EMBARCADO ............................. 12 5.1 ESPECIFICAÇÃO ............................................................................................................. 13 5.2 MODELAGEM ................................................................................................................... 14 5.3 PROJETO DE HARDWARE E SOFTWARE .................................................................... 14 5.4 SÍNTESE / IMPLEMENTAÇÃO ........................................................................................ 14 5.5 VALIDAÇÃO ...................................................................................................................... 14 6. PROPOSTA APRESENTADA................................................................................................. 15 6.1 VISÃO GERAL DO PROCESSO ...................................................................................... 17 6.1.1 Primeira Etapa: Reunião Inicial ................................................................................. 19 6.1.2 Segunda Etapa: Decomposição do Sistema ............................................................. 20 6.1.3 Terceira Etapa: Definição da Arquitetura .................................................................. 22 6.1.4 Quarta Etapa: Protótipo Executável ........................................................................ 255 7. CONCLUSÃO ........................................................................................................................ 266 8. REFERÊNCIAS BIBLIOGRÁFICAS ...................................................................................... 277 -2- 1. INTRODUÇÃO Nos dias atuais estamos cada vez mais dependentes dos sistemas computacionais para realizar nossas as atividades, sejam elas as mais corriqueiras, vivemos em mundo hoje em que interagimos com máquinas e/ou sistemas computacionais a todo o momento e fazemos isto já de maneira despercebida, o que nos faz pensar e refletir em quanto já estamos familiarizados com isto. Seja no Banco, no carro, em casa, falando ao celular ou simplesmente assistindo a TV, é vasto o número de sistemas informatizados que nos cercam. Dentre estes sistemas estão os Sistemas Embutidos, que vem crescendo a cada dia que passa, tornando-se cada vez mais populares e imprescindíveis para a vida moderna. Este tipo de sistema diferenciado está presente em vários equipamentos eletrônicos que utilizamos em nosso dia a dia: Celulares, CD Players, Microondas, PDAs. São vários os exemplos de equipamentos que portam um sistema embutido. Além destes mais simples, outros exemplos bem mais complexos e importantes, por assim dizer, são dotados de sistemas embutidos, por exemplo, ao voarmos de avião estamos sendo guiados por quase todo o tempo por sistemas embutidos que controlam toda a funcionalidade da aeronave. Já se percebe assim a importância e a dificuldade de se conceber um sistema com essas características que carrega consigo toda essa “responsabilidade”. Existem duas características obvias dos Sistemas Embutidos: a primeira delas é que eles são sistemas de tempo real, mais especificamente isto quer dizer que sistemas desta natureza devem responder a estímulos da maneira correta e na hora certa. Podemos ter como exemplo um avião em que o piloto está mudando ou controlando sua direção via leme de comando, as respostas dadas pelo sistema que controla esta operação devem ser dadas em intervalos de tempo aceitáveis ou o avião se tornará um objeto incapaz de voar. Esta diferença que existe entre um sistema de tempo real e um sistema tradicional como uma Folha de Pagamento, por exemplo, faz com que atrasos no tempo de resposta não sejam apenas irritantes, mas sim fatais. A segunda característica típica de sistemas de tempo real é que o poder de computação deles está embarcado no sistema, e os processadores utilizados nesta situação são projetados preferencialmente para situações específicas e não para um propósito geral. -3- Para o desenvolvimento de sistemas como estes será necessária uma abordagem um pouco diferenciada das abordagens para desenvolvimento de softwares tradicionais, estas características e outras que ainda iremos citar mais adiante nos impulsionarão para o descrever uma metodologia para o desenvolvimento de sistemas embarcados. 1.1 EVOLUÇÃO DOS SISTEMAS EMBARCADOS A grande maioria dos microprocessadores fabricado no mundo atualmente, cerca de 90%, é usada em dispositivos que usualmente não são chamados de computadores, eles estão presentes em toda à parte: Telefones celulares, caixas automáticos, veículos, aparelhos de DVD, agendas eletrônicas, console de jogos, fornos microondas, aviões, automação industrial e comercial, equipamentos médicos, sistemas de segurança e em uma infinidade de espécies de equipamentos e dispositivos. São denominados "Sistemas Embarcados" equipamentos que utilizam Microprocessadores e Software para seu controle. No final da década de 60 criou-se um programa armazenado de controle para telefones (“Sistema Embarcado”). Posteriormente foram criados outros programas “customizados” para partes específicas de um equipamento. Então para cada novo projeto era sempre necessária uma reengenharia para desenvolve-lo. Com a chegada de microprocessadores os programadores passaram a escrever suas aplicações para um determinado microprocessador específico, onde este poderia ser utilizado em diversos dispositivos, dessa forma a reutilização de código (entre dispositivos) apresentou-se como importante avanço, não mais era necessária a reengenharia entre dispositivos. No início eram utilizadas Linguagens de Máquina ou Linguagem de Montagem. Surgiram (década de 70) algumas bibliotecas de código e depois vieram sistemas operacionais para serem utilizados em Sistemas Embarcados onde estes estavam atrelados a um determinado processador. Com o avanço da microeletrônica, o microcontrolador recebeu dentre de seu Circuito Integrado, uma quantidade de recursos cada vez maior. -4- 1.1.1 SISTEMAS OPERACIONAIS DISPONÍVEIS 1.2 APLICAÇÕES Sistemas embarcados podem ser utilizados em diversos equipamentos e ultimamente esse número tem aumentado de forma exponencial, por exemplo: Sony, empresa japonesa do ramo de jogos eletrônicos lançou um console de jogos rodando um sistema embarcado**; Empower Technoloies empresa de Taiwan lançou um clone do Handheld PALM III*; Nixdorf empresa alemã lançou um terminal de ponto de venda*; SHARP também lançou um PDA*; Aplio lançou um telefone IP via internet*; TiVO fabrica um gravador de vídeo pessoal*. Podemos observar que em nossa volta existem diversos equipamentos eletrônicos inteligentes de toda natureza, como: Relógio de pulso; Caixa automático bancário; Computadores de mão; Equipamentos de rede; Automóveis; Sistemas de segurança; * Todas essas aplicações estão rodando sobre alguma adaptação do Sistema Operacional Linux -5- Sistemas complexos de automação industrial: o Controle de robôs em linha de montagem; o Medidores de temperaturas de caldeiras; o Guindastes e Esteiras. O barateamento de componentes eletrônicos, aliado com o domínio cada vez maior desta tecnologia, caminha para um aumento cada vez maior de equipamentos capazes de cumprir suas tarefas de forma autônoma, dessa forma, as pessoas ficam mais livres de tarefas mecânicas e rotineira, proporcionando maior comodidade. O mercado de Sistemas Embarcados apresenta-se bastante promissor, somente nesse momento é que esta tecnologia está sedo explorada em todo seu potencial. Já existem sistemas e procedimentos consagrados no mercado, onde esses não respondem a nem um terço do que ainda está por vir, considerando também o avanço exponencial na área de transistores e processadores, surgirão equipamentos mais robustos e velozes com maior capacidade de processamento e cada vez menores, portanto podendo ser utilizados em um número maior de dispositivos. Números dizem que o mercado de Sistemas Embarcados é na ordem de R$ 31bi, enquanto que o total gasto com a computação de propósitos gerais é na ordem de R$ 45,5 bi, com base nesses números percebemos o crescimento vertiginoso do mercado de Sistemas Embarcados. 2. TRABALHOS RELACIONADOS Extreme Embedded [1] Foi seguida a filosofia de programação em pares descrita pelo XP, onde um par, formado de preferência mesclando profissionais experientes e iniciantes, eram responsáveis por projetar, codificar e testar uma funcionalidade. Foram usadas stories no lugar de revisões de projeto. Foi encorajada a prática de escrever os testes de unidade, antes de escrever o código. No caso de se estar fazendo refatoramento, o código não foi mofidicado a menos que o programador que o escreveu estivesse no par. Sempre que necessário foi chamado o responsável pelo código para ajudar. -6- Na tarefa de construção do software foi observado que em funcionalidades mais complexas que foram divididas em menores, houve a necessidade de adicionar um “construtor” que era responsável por integrar o código oriundo das várias pessoas sempre que existisse algum conflito. O resultado foi uma demora para adequar o código devido a não familiaridade do construtor com as diversas partes do código. Para resolver este problema foram criadas duas linhas, a de desenvolvimento e a de produto, então sempre que alguma funcionalidade tivesse que ser adicionada ao desenvolvimento era necessário primeiro ser testada na linha de produto. Com a continuidade da prática, o resultado obtido foi que os desenvolvedores voltaram as práticas tradicionais de desenvolvimento, postergando o máximo a integração das funcionalidades para o final, contrariando as práticas do XP de um desenvolvimento rápido, incremental e iterativo. Outra dificuldade encontrada foi à interação com o cliente, pois geralmente o cliente de um software embarcado não consegue enxergar o desenvolvimento das funcionalidades separadamente, mas sim, quer verificar o desenvolvimento do sistema completo, tentou-se o máximo de interação para, ao menos, o cliente indicar os requisitos prioritários. Devido à cultura, a tarefa de planejamento foi difícil de ser feita de forma incremental, pois não foram aceitos modificações no cronograma que modificassem as datas para frente. Devido a isso o desenvolvimento permaneceu sempre pelo menos com dois meses de atraso com o cronograma. Em alguns pares o desenvolvimento ficou mais veloz e eficiente, mas em outros não, devido à percepção que o XP não estava dando certo por parte do time e muitos acharem que era perda de tempo. Em relação à filosofia de propriedade coletiva de código, alguns times preferiram utilizar seus próprios padrões de codificação, dificultando a compreensão por parte dos demais membros da equipe. O trabalho realizado pelos autores mostrou que ainda há bastante resistência a mudança em âmbito do desenvolvimento de sistemas embarcados, devido à dificuldade de algumas pessoas de reagir à mudança de paradigma no desenvolvimento. -7- 3. CONSIDERAÇÕES EMBARCADO SOBRE DESENVOLVIMENTO DE SOFTWARE Sistemas embarcados abrangem uma grande gama de aplicações, que podem variar bastante quanto a sua natureza e seu tamanho, desde máquinas de lavar programáveis a enormes redes de telecomunicação distribuídas. A Internet contribuiu e muito para o desenvolvimento dos sistemas embarcados, se levarmos em consideração apenas à infra-estrutura da internet já temos vários exemplos disso: Switches, roteadores, dispositivos de comunicação PDAs, mas além destes dispositivos tivemos a febre da conexão com a Internet, onde quase todos os dispositivos que possuem um sistema embarcado se conectam a Internet: Veículos, dispositivos Médicos e até mesmo geladeiras e outros equipamentos domésticos. O Modelo de Negócio por trás de cada Sistema Embutido pode variar tão amplamente quanto às aplicações em si. Custo, ciclo de vida e a relação entre produtos de funções semelhantes são questões que podem afetar decisões de projeto. Uma questão crucial quanto ao Negócio relacionado a Sistemas Embutidos diz respeito ao “Time to Market”, isto é, o tempo entre a identificação de uma oportunidade de mercado e a colocação do produto na prateleira não pode se estender muito no âmbito dos Sistemas Embarcados, para isso é necessário um processo que suporte re-projetar rapidamente para acomodar as mudanças em algoritmos e em requisitos funcionais. Um atraso neste processo pode acarretar em perdas significativas para a empresa, uma vez que a instabilidade do mercado e as constantes mudanças funcionais em alguns tipos de aparelhos que portam um Sistema Embutido obrigam os desenvolvedores a produzir rapidamente, ou de nada adiantará um produto de qualidade, mas totalmente fora do prazo de entrega para o mercado. Outro aspecto importante para o Modelo do Negócio dos Sistemas Embarcados diz respeito ao reuso, assim como no desenvolvimento tradicional o reuso no desenvolvimento de sistemas embarcados pode trazer muitas vantagens. É comum existirem projetos que não são únicos, existindo uma variedade de produtos de tipos e preços diferentes que formam uma família de produtos. Reusando componentes -8- comuns entre os produtos os projetistas estão diminuindo o custo total do sistema em uma família de produtos. 3.1 ESCOLHA DO SISTEMA OPERACIONAL Dependendo do tipo de aplicação e a finalidade do sistema, deve-se ter muito cuidado na escolha do Sistema Operacional, então o projeto precisa ser bem planejado e com um objetivo bem definido. Sistemas Embarcados estão ficando cada vez mais complexos e poderosos, portanto, necessitando de um Sistema Operacional capaz de gerenciar tais recursos, estão o Sistema Operacional deve caminhar no mesmo ritmo de evolução da eletrônica (CI’s). A capacidade de interconexão de Sistemas Embarcados com outros equipamentos e dispositivos, utilizando meios de protocolos padronizados (TCP/IP e BlueTooth) é cada vez mais exigida no seu projeto e com a evolução dos Sistemas Operacionais Distribuídos e o avanço das redes de computadores torna-se este fator mais importante. O ambiente gráfico com interfaces mais complexas e fáceis de utilizar é um fator importante a ser considerado na escolha do Sistema Operacional, excluindo-se as aplicações muito específicas que não necessitam de Sistema Operacional onde tem apenas um único programa especialista carregado na ROM. Como projetos de Sistemas Embarcados geralmente são executados em larga escala e cada equipamento ou dispositivo construído deverá ter uma licença de propriedade, o custo de licenciamento deverá ser estudado minuciosamente. Se considerarmos um Sistema Operacional comercial, inclui-se também o custo da “customização” deste para sua aplicação específica no projeto embarcado. Estatisticamente os Sistemas Embarcados necessitam de muita “customização” por parte do Sistema Operacional, para o desenvolvimento de funcionalidades específicas, onde o acesso ao código fonte pode ser fundamental. -9- A portabilidade da plataforma de Hardware visando atender aos requisitos do projeto, considerando aspectos de custo, integração, consumo de energia e desempenho, oferece suporte a múltiplas arquiteturas de hardware. Disponibilizar, quantidade e qualidade de ferramentas (compiladores, linkeditores, depuradores de código, etc.) para o desenvolvimento de aplicações embarcadas, é um outro importante valor a ser considerado na escolha do Sistema Operacional. Foram especificados alguns fatores que devem ser considerados com atenção no projeto e aplicação de Sistemas Embarcados. 3.1.1 SISTEMAS EMBARCADOS e GNU/Linux É observado que o Sistema Operacional GNU/Linux está liderando a corrida na área de Sistemas Embarcados, sendo um padrão de fato para servidores no mundo inteiro, é conhecido pela alta estabilidade, confiabilidade e desempenho sem considerar sua ampla portabilidade para várias plataformas de Hardware. IBM (investiu $ 1bi), Cysclades (adotou o Linux numa série de Terminal Servers) são exemplos de empresas que já adotaram o GNU/Linux. Resumidamente são características do GNU/Linux: O Linux tem 300.000 pessoas contribuindo ativamente para sua evolução acompanhando o ritmo de desenvolvimento dos Circuitos Integrados. Além do TCP/IP o linux também pode ser interligado naturalmente com vários outros tipos de rede como: SAMBA-IPX-APPLETALK, etc., tendo alta conectividade. O linux oferece diversas opções para ambiente gráfico e interface homemmáquina, como: QT embedded, MicroWindows, X-Windows. - 10 - O linux não tem custo de licenciamento de software, sendo este um fator particularmente importante para o desenvolvimento de produtos em larga escala e com baixo preço unitário. Seguindo a filosofia do Software Livre, o GNU/Linux tem seus códigos fonte totalmente disponibilizados, contribuindo assim para sua “customização” e otimização para aplicações específicas. O linux suporta uma maior série de arquiteturas de hardware do que qualquer outro Sistema Operacional, roda em: MainFrame S390, Processadores: Itanium64, intel x86, MIPS, PowerPC, DragonBall da Motorolla, SPARC da sun, StrongARM, SuperH da Hitachi, etc . Encerrando o Linux apresenta um número muito grande de ferramentas Open Source para desenvolvimento, como: Compiladores, Linkeditores, assemblers e depuradores de código, além de dezenas de linguagens disponíveis. 4. DESAFIOS Neste ponto vamos analisar alguns desafios inerentes ao desenvolvimento de software embarcado, alguns pontos importantes podem ser levantados, o que nos fará pensar em quão singular pode se tornar um processo de desenvolvimento de software embarcado. Em geral as companhias buscam reduzir o tempo gasto em desenvolvimento, porém na medida em que tentam reduzir este tempo de desenvolvimento elas também precisam aumentar consideravelmente a qualidade dos produtos, pelo fato dos sistemas embarcados serem usados nos mais críticos sistemas do mundo se torna fácil afirmar que a qualidade deste tipo de software não pode estar de forma nenhuma comprometida, como se já não bastasse isto, softwares embarcados são difíceis de desenvolver e de atualizar. É essencial para projetos de software embutido a redução, ou pelo menos o possível gerenciamento da complexidade do projeto para que se consiga encurtar o tempo necessário para que o produto chegue ao mercado, ao passo que se tenta diminuir os custos relacionados ao projeto. - 11 - O mercado força a redução de custos e tempo de projeto, levando os projetistas a preferir que as funcionalidades dos sistemas embutidos migrem para o software, porém as funcionalidades que necessitam de alto desempenho continuam sendo tarefas realizadas por hardware. Tempo de resposta é um requisito primordial, sistema desta natureza devem aumentar ao máximo a performance e ainda manter o tempo de resposta para cada estímulo individual dentro dos limites aceitáveis para a aplicação, além disso, sistemas embarcados são sistemas dirigidos a eventos, ao contrário dos sistemas tradicionais onde sua funcionalidade depende apenas de um comando de inicio e fim os sistemas embarcados devem estar reagindo continuamente a eventos, sejam eles reportados pelo usuário ou mesmo mensagens de periféricos. Estes eventos podem partir de qualquer fonte, a qualquer momento e em qualquer ordem, isto torna o projeto de desenvolvimento destes softwares muito desafiador, já que estes componentes devem estar prontos para responder corretamente e dentro do tempo estabelecido a qualquer tipo diferente de evento. 5. PROCESSO DE DESENVOLVIMENTO DE SOFTWARE EMBARCADO A tarefa de desenvolvimento de sistemas passa por um processo de evolução devido às mudanças ocorridas nos negócios das empresas, a construção precisa ser mais rápida e eficiente, onde a demora para o desenvolvimento pode fazer com que a empresa perca espaço no mercado, assim como, a usabilidade de um produto inadequado também pode faze-lo. No contexto do desenvolvimento de sistemas embarcados, essa realidade é ainda mais notória, pois, decisões erradas, sobre, por exemplo, o que deve ser embarcado como software e o que deve ser embarcado como hardware, pode ocasionar o insucesso do projeto, devido a uma falta de adequação dos componentes no momento que eles deveriam ser agrupados. O desenvolvimento então, não pode ser algo que siga em um único fluxo, há a necessidade de um processo que consiga gerenciar as mudanças que ocorrerem no negócio, as mudanças e avanços em tecnologias, e a própria evolução natural de qualquer sistema, então se parte de um desenvolvimento com um único fluxo, por exemplo, o modelo cascata, para um desenvolvimento iterativo e incremental: - 12 - Iterativo – partes do desenvolvimento sejam divididas em blocos menores para o acompanhamento do desenvolvimento. Incremental – possam ser adicionadas novas funcionalidades ao projeto ou até mesmo retiradas atividades que não agreguem valor para o cliente. Uma escolha é então necessária, deve-se adotar uma metodologia ágil ou uma metodologia densa? Uma metodologia pesada faz com que o planejamento seja mais detalhado e produz uma documentação mais completa, facilitando as mudanças posteriores. Já uma metodologia ágil torna o desenvolvimento mais rápido e faz com que se tenha uma melhor resposta a mudanças. Então a metodologia ideal seria uma que tanto respondesse rápido a mudanças, como permitisse a documentação de partes importantes do sistema para facilitar modificações por outras equipes. Tradicionalmente as atividades do desenvolvimento ocorrem seqüencialmente, sendo um erro comum, a integração entre hardware software ser feita apenas no final. Em sistemas embarcados, quanto mais próximo o erro está da implementação final, mais caro será a sua correção, portanto a metodologia deve prover formas de validar e verificar o sistema também de forma iterativa, ou seja, a cada iteração, as funcionalidades desenvolvidas devem ser testadas do ponto de vista funcional, de integração entre as diversas partes, especialmente entre software e hardware, e do ponto de vista, de aceitação do usuário em relação aquele desenvolvimento, em termos de usabilidade, interface, etc. Em um nível macro, as atividades de software podem ser divididas em cinco grandes grupos, modelagem do sistema, separação das tarefas de hardware/software, síntese e validação. 5.1 ESPECIFICAÇÃO No primeiro momento são detalhadas as principais funcionalidades do sistema, assim como os requisitos não-funcionais como custo, desempenho, memória, etc. - 13 - 5.2 MODELAGEM Nesta etapa o sistema como um todo deve ser modelado, em uma linguagem de descrição formal ou não, como UML. Deve ser descrito o comportamento físico do sistema, as interações entre o físico e o computacional e também, aspectos funcionais, as estratégias de controle que serão utilizadas, segurança, aparência, etc. 5.3 PROJETO DE HARDWARE E SOFTWARE Nesta fase deve se considerar o que será embarcado como software e hardware. Estes componentes devem ser separados de acordo com os requisitos não funcionais que foram coletados juntamente com o cliente, ou seja, a decisão deve ser tanto técnica quanto de negócio, pois, por exemplo, embora um desenvolvimento em hardware possa ser mais complexo e demorado, se um dos requisitos da aplicação for alto desempenho, esta pode ser a melhor opção. Deve-se decidir nesta fase, quais algoritmos ficam em hardware e quais em software e projetar as interfaces para que os componentes (hardware e software) possam se comunicar. 5.4 SÍNTESE / IMPLEMENTAÇÃO Nesta fase devem ser construídos os modelos projetados na fase anterior, também se deve construir a interface entre hardware e software. 5.5 VALIDAÇÃO Nesta fase deve-se oferecer garantias sobre o funcionamento correto do sistema integrado formado por hardware e software, pode ser realizada via mecanismos de validação formal, simulação dos componentes de hardware e software de forma isolada e em conjunto. - 14 - 6. PROPOSTA APRESENTADA – eXtreme Embedded Process Fugindo da engenharia de software tradicional, que defende uma análise, projeto e só depois começar a construir. Propomos uma metodologia que se adapte melhor as mudanças durante a execução do projeto, para isso mesclando características das metodologias ágeis (iterações rápidas) com das metodologias densas (documentação). Uma das principais idéias e trazer o cliente para dentro do projeto de desenvolvimento, reuniões, workshops, validação, testes de aceitação, cronograma de “releases”, são algumas das tarefas adotadas para serem executadas durante o desenvolvimento do software. Sistemas embarcados tem uma abordagem complexa, pois envolvem muitas camadas diferentes, na camada inferior alguma espécie de hardware, e uma camada de funcionalidade superior, que geralmente é software, e entre essas duas camadas uma camada de infra-estrutura como sistemas operacionais, pilhas de protocolo, outras aplicações, etc., leva-nos a considerar que o trabalho conjunto do Gerente de Negócio, Gerente de Hardware e Gerente de Software, tem que estar bem sincronizado e harmônico. Metas a serem atingidas: Deve satisfazer a sua especificação e não possuir falhas ou erros. Especificação satisfazer aos requisitos dos usuários e da organização, isto é, está de acordo com as necessidades dos usuários. Prever que o usuário pode agir de forma não esperada e deve ser capaz de resistir a estas eventuais situações incomuns sem apresentar falhas, portanto, se comportar como esperado e não falhar em situações inesperadas. Realizar suas tarefas em um tempo adequando à complexidade de cada uma delas. A utilização dos recursos de hardware (memória, tráfego de rede) também deve ser feita de forma eficiente. - 15 - Precisa evoluir para atender novos requisitos, para incorporar novas tecnologias ou para expansão de sua funcionalidade. Poder ser executado no maior número possível de equipamentos de hardware. Software em diferentes plataformas devem poder interagir entre si. Esta qualidade é essencial em sistemas distribuídos uma vez que o software pode estar sendo executado em diferentes computadores e sistemas operacionais. Diversos componentes de um software devem poder ser reutilizados por outras aplicações. O reuso de funções e objeto facilita bastante o desenvolvimento de software. - 16 - 6.1 VISÃO GERAL DO PROCESSO - 17 - 6.1.1 Primeira Etapa: Reunião Inicial Reunião Inicial Participantes Cliente Gerente de Hardware Gerente de Projeto Gerente de Software Atividades Definição das “user stories”; Definição das prioridades; Definição dos requisitos nãofuncionais; Definição inicial das funcionalidades. Essa é a primeira etapa do processo, nela o cliente apresenta a equipe à descrição do que quer no sistema e também há uma definição inicial do prazo no qual o sistema deverá ser desenvolvido, a descrição é feita com base em ”user stories”. As “User Stories” são escritas pelos clientes como coisas que o sistema precisa fazer para eles, são similares aos cenários de uso, exceto que elas não estão limitadas a descrever uma interface com o usuário [5]. Com base nessas “user stories”, são tomadas decisões de construir ou não o software (estudo de viabilidade). A equipe de desenvolvimento sob a supervisão dos gerentes elabora uma descrição inicial das funcionalidades do sistema, onde elas são quebradas em funcionalidades de duas semanas. As “user stories” que não conseguirem ser programadas para um máximo de duas semanas, são quebradas em “user stories” menores. O cliente também fala sobre as características (restrições de software) não funcionais do sistema, como, por exemplo, desempenho, custo, segurança, necessidade de mudanças futuras. Estas características serão utilizadas no momento da definição da arquitetura do sistema. Também são realizadas estimativas quanto aos gastos e prazos aproximados a partir de dados de experiências anteriores e a verificação de possibilidades de que algo possa sair errado (risco). - 19 - 6.1.2 Segunda Etapa: Decomposição do Sistema Decomposição do Sistema Participantes Cliente Gerente de Hardware Gerente de Projeto Gerente de Software Atividades Tradução das “user stories” em funcionalidades; Agrupamento em classes de funcionalidade relacionadas. Com base nas “user stories” levantadas, os gerentes de projeto, software e hardware definem as funcionalidades. As funcionalidades que estão interligadas (relacionadas) são agrupadas em classes, dessa forma identificando os principais componentes do sistema. Também são levantados requisitos como aparência, desempenho, dimensão, segurança, risco, entre outros. Com a descrição inicial das funcionalidades, o gerente e o cliente, planejam uma seqüência de desenvolvimento, as iterações, que deverão entregar funcionalidades prontas, e as “releases”, versões preliminares do sistema. Essa seqüência será baseada em funcionalidades, as quais o time com a ajuda dos “desenvolvedores” classificarão, baseado no FDD, em: Essenciais (Must to have); Necessárias (Nice to have); Adicionais (add if we can); Futuras (future). Ao final da implementação de cada funcionalidade é feita uma avaliação para identificar se o projeto está sendo desenvolvido em conformidade com a descrição da necessidade do cliente, para isso é fundamental a sua participação. Nessa etapa são escritos os testes de aceitação de cada “release” onde as funcionalidades que não passarem no teste de aceitação por parte do usuário, são adicionadas no planejamento da próxima “release”. - 20 - Cada “release” é composta por um conjunto de funcionalidades de hardware e software, como também a release anteriormente entregue. Essas reuniões são realizadas em curtos intervalos de tempo, onde são avaliadas não somente as funcionalidades, mas também a integração das equipes de desenvolvimento sendo elencadas as dificuldades e descobertas. - 21 - 6.1.3 Terceira Etapa: Definição da Arquitetura Definição da Arquitetura Participantes Engenheiros Chefes Gerente de Hardware Gerente de Negócios Gerente de Software Programadores Chefes Atividades Definição de o que será embarcado como hardware/software/ sistema operacional Levar em consideração aspectos como desempenho, flexibilidade, segurança, tolerância à falhas, etc. Neste momento, os gerentes, programadores e engenheiros chefes se reúnem e avaliam as condições técnicas para a implementação das funcionalidades em hardware e software, é definido também um projeto arquitetural de alto nível que pode ser baseado no MVCC (Artigo sobre projeto arquitetural de sistemas embarcados) que é um padrão arquitetural que estende o padrão “Model-View-Controler (MVC)” com a adição de mais uma camada de Comunicação, para os diversos componentes que fazem parte da implementação de sistemas embarcados poderem se comunicar utilizando um padrão que os livre das peculiaridades (Eventos, paralelismo, multitarefa, etc) de cada componente. Deve-se considerar bastante crítica essa etapa, onde uma definição de uma funcionalidade mal colocada pode levar o projeto a risco de falência, para evitar que isso ocorra, todas as funcionalidades são minuciosamente estudadas pelos gerentes, engenheiros e programadores e infelizmente não existe um formalismo para definição do que será embarcado com software ou como hardware, isso vai depender das necessidades do projeto, portanto, é importante considerar a experiência desses papéis no decorrer de todo o processo de desenvolvimento. De forma a minimizar essa dificuldade aspectos como precisão, eficiência são geralmente mapeados para o projeto de hardware por apresentar maior confiabilidade e rapidez. Outros aspectos que não necessitam de tanta precisão, por exemplo, são mapeadas para o projeto de software que por sua vez é mais lento e mais barato do que hardware. Então como um dos principais desafios é baixo custo, costuma-se a mapear o máximo de funcionalidades para o projeto de software, que por sua vez também apresenta maior rapidez no desenvolvimento e possível reestruturação. - 22 - Os projetos de hardware e software devem percorrer em paralelo e em constante integração, para isso é definida uma interface entre os dois projetos e um canal de comunicação constante, onde sempre é discutido o andamento do desenvolvimento das funcionalidades. No projeto de hardware pode-se adotar qualquer processo de desenvolvimento de hardware, respeitando suas primitivas de desenvolvimento, onde, os algoritmos que foram marcados para o desenvolvimento em hardware são então projetados, implementados e simulados antes de serem sintetizados em um dispositivo físico. Para aproveitar a característica do reuso, também nos componentes de hardware, é fundamental o uso de tecnologia de componentes, como por exemplo componentes IP(Intelectual Property), que são componentes autônomos descritos em uma linguagem de descrição de hardware capazes de se comunicar com outros componentes IP e aplicações através de uma interface bem definida, normalmente sinais. O uso de componentes IP possibilita também o uso de TestBenches , também concebidos como componentes, de forma a automatizar, e através de estímulos em várias formas(Nas bordas, Aleatórios, Massivos) verificar o funcionamento funcional dos componentes IP e garantir que mudanças posteriores ainda continuem respeitando as mesmas propriedades. Inicialmente é desenvolvido um protótipo simples de hardware, para serem realizados “testes de bancada”, com o decorrer do desenvolvimento das “releases” são lançados protótipos mais em conformidade com o produto final. No projeto de software pode-se adotar qualquer processo de desenvolvimento iterativo, onde, as funcionalidades de software são implementadas nessa fase, a equipe deve automatizar os testes de unidade e testes de aceitação para validar a implementação. Os testes de unidade e aceitação podem utilizar técnicas como “spoofing” para simular as funcionalidades de hardware enquanto essas ainda não estiverem disponíveis. São usados também os valores definidos no Extreme Programming [6] como programação em pares, metáfora, utilização de padrões, propriedade coletiva de código, etc. O uso dos valores do XP, possibilita uma maior comunicação entre o grupo de trabalho como um todo, por exemplo, o uso de uma metáfora bem escolhida facilita a comunicação das equipes de hardware e software, pois não será necessário o conhecimento de detalhes do vocabulário técnico dos dois mundos para que a comunicação aconteça de forma satisfatória. São indicados também, programas de - 23 - comunicação entre equipes de forma rápida que possam substituir o e-mail e a comunicação formal, para a troca de pequenas informações e a própria integração das equipes, diversos aplicativos estão no mercado e fornecem essa funcionalidade como por exemplo ICQ for WorkGroups, Msn Messenger , Yahoo Messenger, etc. Ao final de cada iteração as equipes de hardware e software sentam juntas para reavaliar cronogramas, funcionalidades, etc. As funcionalidades são projetadas para serem desenvolvidas em períodos de duas semanas, onde ao final de cada período (iteração) é realizada uma verificação de conformidade com o projeto inicial, tanto hardware como software. São reavaliados as prioridades e o cronograma das próximas implementações e “releases”, além dos gastos e risco de acordo com o mercado. - 24 - 6.1.4 Quarta Etapa: Protótipo Executável Protótipo Executável Participantes Engenheiros Chefes Gerente de Hardware Gerente de Negócios Gerente de Software Programadores Chefes Atividades Integrar os componentes hardware/software; Realizar os testes de aceitação; de Neste momento, as equipes de hardware e software se unem para integrar as funcionalidades e desenvolverem uma “release” funcional para ser entregue para a avaliação do usuário. Pode-se realizar essa integração num componente físico (hardware) ou em um ambiente integrado de simulação. Após a integração o protótipo é entregue ao cliente para que seja feita a validação, onde novamente são reavaliados aspectos interentes ao projeto, na presença dos gerentes (hardware, software e negócio, além de engenheiros e programadores chefes). Problemas que surgirem serão acrescentados para serem solucionados na próxima “release”. - 25 - 7. CONCLUSÃO Sistemas Embarcados estão ganhando cada vez mais espaço no mercado atual, e um processo de desenvolvimento para este tipo de sistema deve ser capaz de absorver bem as suas peculiaridades, algumas características especiais devem ser tratadas e bem administradas. Propomos nesse artigo algumas técnicas de como enfrentar os desafios relativos a este tipo de desenvolvimento, o cuidado como “Time to Market” e a necessidade de iterações rápidas nos obrigam a incorporar em nossa proposta técnicas já difundidas de alguns processos ágeis, como é o caso do XP, porém é necessário que tenhamos o cuidado de manter alguns documentos que podem ser úteis no reuso de componentes em famílias de produtos, assim temos de mesclar as técnicas dos processos ágeis com alguns princípios dos processos mais densos, em menor número é verdade. Outro fator influenciador é a necessidade de termos uma integração forte entre hardware e software, nosso processo busca uma integração entre as equipes de hardware e software, existindo um canal de comunicação permanente entre elas, uma vez que estas equipes devem estar trabalhando em conjunto. Uma deve sempre saber o que a outra está fazendo, além de trazer o cliente para dentro do processo de desenvolvimento. - 26 - 8. REFERÊNCIAS BIBLIOGRÁFICAS [1] Boulic, R. and Renault, O. (1991) “extreme Embedded, A Report From The Front Line”, In: New Trends in Animation and Visualization, Edited by Nadia MagnenatThalmann and Daniel Thalmann, John Wiley & Sons ltd., England. [2] Dyer, S., Martin, J. and Zulauf, J. (1995) “Motion Capture White Paper”, http://reality.sgi.com/employees/jam_sb/mocap/MoCapWP_v2.0.html, December. [3] Holton, M. and Alexander, S. (1995) “Soft Cellular Modeling: A Technique for the Simulation of Non-rigid Materials”, Computer Graphics: Developments in Virtual Environments, R. A. Earnshaw and J. A. Vince, England, Academic Press Ltd., p. 449-460. [4] www.embedded.com [5] www.xispe.com.br [6] Beck, Kent, Extreme Programming Explained, Addison Wesley, 1999 [7] Coad P., Lefebvre E., Luca J.D., "Java Modeling In Color With UML: Enterprise Components and Process", Prentice Hall, June 1999 [8] www.featuredrivendevelopment.com [9] Moraes, F. G. e Amory, A. M. “Definição e Desenvolvimento de Metodologia de Codesign”. Trabalho Individual. Pontifícia Universidade Católica do Rio Grande do Sul. Rio Grande do Sul (PUCRS), Porto Alegre, Brasil, 2001. [10] Silva, D. C. J., Coelho, C. J. N., Fernandes, A. O. e Mata, J. M. “Conexão de Sistemas Embutidos a Internet”. Departamento de Ciência da Computação, Universidade Federal de Minas Gerais. Minas Gerais, Brasil, 1999. [11] Tassi, C. “O Telefone Celular e o Forno Microondas têm algo em comum: os sistemas Embutidos”. Fundação Vanzolini. Brasil, 2001. - 27 - [12] Moraes, F. G., Calazans, N. L. V., Marcon, C. A. M. e Mello, A. V. “Um Ambiente de Compilação e Simulação para Processadores Embarcados Parametrizáveis”. Pontifícia Universidade Católica do Rio Grande do Sul (PUCRS). Porto Alegre, Brasil, 2001. [13] Dias, A. F. “Concepção Conjunta de Hardware/Software de Sistemas Embarcados de Processamento de Imagens”. CDTN/CNEN. Belo Horizonte, Brasil, 2001. [14] Reis, C. P. “Embedded Systems Applications”. Universidade Católica de Pelotas. Pelotas, Brasil, 2002. [15] http://www.therationaledge.com/content/dec_00/m_embedded.html - 28 -