Ciência da Computação

Métodos Ágeis: É Importante a Certificação?

g2996Neste artigo vou abordar a importância da certificação em métodos ágeis. O uso de métodos ágeis como uma abordagem para gerenciamento de projetos tem aumentado dramaticamente nos últimos anos. O Gartner prevê que os métodos ágeis serão utilizados em 80% de todos os projetos de desenvolvimento de software.

Uma pesquisa feita pelo PMI mostrou que o uso de práticas ágeis tem aumentando drasticamente ao longo dos anos. Além disso, a pesquisa demonstra o valor que métodos ágeis podem ter na redução de defeitos do produto, melhorando a produtividade da equipe, melhoria na entrega e aumento do valor comercial.

O PMI-ACPSM está posicionado para reconhecer e validar o conhecimento desta importante abordagem. Com a disseminação do gerenciamento de projetos e do constante desenvolvimento de suas ferramentas, os profissionais da área vem se confrontando com um mercado próspero–porém muito complexo.

Devido ao crescimento desse mercado ocorreu também a expansão de diversos cursos de especialização na área de gerenciamento de projetos, praticamente em todas as cidades de médio/grande porte existem dezenas desses cursos. Tendo em vista à evolução do gerenciamento de projetos, o PMI, reconhecendo as necessidades do mercado, oferece diferentes certificações, entre elas a PMI –Agile Certified Pratictioner (PMI-ACP) resultado do ambiente de negócios dinâmico em que hoje as diferentes organizações atuam.

O aumento do número de cursos por um lado proporciona o fomento da área e a formação de massa crítica, porém a falta de padronização e muitas vezes a dissonância com as práticas do Guia PMBOK® criam dúvidas sobre a qualidade de muitos cursos e consequentemente sobre o conhecimento de alguns profissionais.

A grande necessidade de ganhar competitividade estimula as empresas a operar em mercado mais amplos, cooperando e competindo para melhorar sua qualidade e preço, isso gera muitos gastos e para compensar os mesmos, há uma grande necessidade em agregar valor à empresa. Essa realidade vivida pelo setor mais tradicional do gerenciamento de projetos se adéqua melhor quando se utiliza o método ágil, por esse setor ser relativamente novo quando comparado ao gerenciamento de projeto tradicional.

Pensando um pouco sobre a questão do desenvolvimento, esse desenvolvimento se faz presente em diversas áreas do conhecimento técnico e assim, são utilizadas certificações profissionais, pois essas representam o reconhecimento da habilidade e experiência no uso das técnicas e aplicação de conhecimentos, assim, mantendo um diferencial e adicionando confiabilidade ao currículo de cada profissional. Deve ser visto em seu sentido mais amplo a comprovação formal dos conhecimentos, habilidades, atitudes e capacidade do profissional, requeridos para a execução de uma determinada atividade.

As melhores práticas do gerenciamento de projetos difundidas e consolidadas, em sua forma tradicional, começaram a serem questionadas. Em uma área do gerenciamento de projetos envolvida intensamente com desenvolvimento tecnológico de software como o gerenciamento ágil de projeto, as mudanças técnicas são constantes e extremamente rápidas.

Para atender as demandas desses projetos tecnológico o gerenciamento ágil de projetos utiliza ferramentas que focam as entregas ao invés das extensas documentações.

Onde estão os valores e princípios?

Para os Valores, temos:

  • Indivíduos e interações mais que processos e ferramentas;
  • Software em funcionamento mais que documentação abrangente;
  • Colaboração com o cliente mais que negociação de contratos;
  • Responder a mudanças mais que seguir um plano;

Para os Princípios, temos:

  • Maior prioridade é satisfazer o cliente através da entrega contínua e adiantada de software com valor agregado;
  • Mudanças nos requisitos são bem vindas, mesmo tardiamente no desenvolvimento;
  • Processos ágeis tiram vantagem das mudanças visando vantagem competitiva para o cliente;
  • Entregar frequentemente software funcionando, de poucas semanas a poucos meses, com preferência à menor escala de tempo;
  • Pessoas de negócio e desenvolvedores devem trabalhar diariamente em conjunto por todo o projeto;
  • Construa projetos em torno de indivíduos motivados. Dê a eles o ambiente e o suporte necessário e confie neles para fazer o trabalho;
  • O método mais eficiente e eficaz de transmitir informações para e entre uma equipe de desenvolvimento é através de conversa face a face;
  • Software funcionando é a medida primária de progresso;
  • Os processos ágeis promovem desenvolvimento sustentável;
  • Os patrocinadores, desenvolvedores e usuários devem ser capazes de manter um ritmo constante indefinidamente;
  • Contínua atenção à excelência técnica e bom design aumenta a agilidade;
  • Simplicidade — a arte de maximizar a quantidade de trabalho não realizado — é essencial;
  • As melhores arquiteturas, requisitos e designs emergem de equipes auto organizáveis;
  • Em intervalos regulares, a equipe reflete sobre como se tornar mais eficaz e então refina e ajusta seu comportamento de acordo;

O PMI apresenta uma certificação (como citada anteriormente), que cumpre o propósito de padronizar e disseminar o gerenciamento ágil de projetos, reunindo as seguintes exigências de conhecimentos práticos e teóricos dos certificados: educação secundária (ensino médio ou equivalente) ou superior, 2.000 horas de trabalho em projetos adquiridos nos últimos 5 anos, 1.500 horas de trabalho em projetos -usando técnicas ágeis -adquiridos nos últimos 2 anos, 21 horas de treinamento em Gerenciamento Ágil de Projetos.

Os conceitos Ágeis através de diferentes métodos e processos, foram sendo incorporados no gerenciamento de projetos e sua utilização aplicada em diversas organizações. Não poderia deixar de adicionar ao texto, as principais vantagens do gerenciamento ágil de projetos:

  • Retorno mensurável do investimento mais cedo, entrega iterativa de incrementos dos produtos;
  • Alta visibilidade do andamento do projeto, permite a identificação precoce e resolução ou monitoramento de problemas;
  • Envolvimento contínuo do cliente em todo o ciclo de desenvolvimento do produto;
  • Melhoria na satisfação e motivação dos times de desenvolvimento do projeto;
  • Poder ao proprietário da empresa para tomar decisões necessárias para atingir as metas;
  • Adaptação à evolução das necessidades de negócio, dando mais influência sobre as mudanças de requisitos;
  • Redução dos resíduos do produto do processo;
  • Maior pontualidade na entrega. Estimativas mais realistas, clientes mais envolvidos e satisfeitos

A intensiva competitividade na área de desenvolvimento de software faz com que as empresas busquem sempre o aperfeiçoamento de seus serviços para poder vencer a concorrência. Prazo e qualidade, além é claro de melhor aceitação e adaptação a mudanças são importantes diferenciais que podem ser atingidos utilizando-se metodologias ágeis de desenvolvimento. Embora não seja a solução para todos os problemas, a metodologia ágil mostra uma maneira de trabalhar bastante organizada e iterativa, podendo inclusive contribuir para um ambiente de trabalho mais amigável, portanto é uma boa opção para se obter os diferencias desejados.

Em um mundo qualificado pelo desenvolvimento tecnológico e pela dispersão do uso de software em praticamente todas as áreas do conhecimento humano, faz-se necessário um novo tipo de gestão para os projetos.

O mundo hoje depende de projetos e, para muitas organizações, são eles que garantem o dia de amanhã e permite-lhes sobreviver e crescer.Assim sendo, os métodos ágeis veem respondendo de forma positiva a essas necessidades, por focar os esforços da equipe no produto final e nas necessidades do cliente, relevando à segundo plano o processo de documentação exaustivo. Uma vez que as empresas estejam ao par de tais metodologias e as principais ferramentas utilizadas na Gestão de Projetos aprendido na prática o que tange às certificações, então será possível um maior alcance nas credenciais e certificações.

O PMI veem trabalhando para criar um padrão para os métodos ágeis através do PMI-ACP Examination Content Outline e da certificação PMP-ACP. Outro ponto relevante do PMP-ACP é a re-certificação, a qual difunde as práticas do gerenciamento ágil e estabelece a necessidade de constante aprimoramento dos profissionais certificados.

Espero que tenham gostado do artigo.

Márcio Pulcinelli @ OminaVIncit


Referências:

[1] LEFFINGWELL, Dean and MUIRHEAD, Dave, Tactical Management of Agile Development: Achieving Competitive Advantage. 2004. Boulder, Colorado

[2] SOARES, Michel dos Santos, Comparação entre Metodologias Ágeis e Tradicionais para o Desenvolvimento de Software. Unipac-
Universidade Presidente Antônio Carlos, Faculdade de Tecnologia e Ciências de Conselheiro Lafaiete

[3] Agile Manifesto, Disponível em http://agilemanifesto.org/

[4] SCHWABER , Ken, What Is Scrum?

[5] www.scrumalliance.org

[6] PMI. Profissional Certificado em Métodos Ágeis.Disponível em:http://brasil.pmi.org/brazil/CertificationsAndCredentials/PMI-ACP.aspx/.


Microcontrolador – TM4C123G LaunchPad (Cortex-M4)

bd_EV-LM4F120XL

Neste artigo falarei sobre a placa (que particularmente gosto bastante) Tiva C Series LaunchPad que inclui o microcontrolador TM4C123GH6PM e um ICDI (In-Circuit Debug Interface) integrado, bem como um conjunto de recursos periféricos muito úteis para o desenvolvimento de sistemas embarcados (embedded systems). Neste artigo descreverei como estes periféricos operam e fazem interface com o microcontrolador.

Antes porém, talvez seja importante antes de falar sobre a placa em si, seja apresentar onde ela pode ser utilizada. Um sistema integrado combina componentes mecânicos, elétricos e químicos, juntamente com um computador oculto no seu interior, para que seja possível realizar um propósito único dedicado. Há mais computadores no planeta do que há pessoas, e a maioria destes computadores são microcontroladores de chip único que são os cérebros da maioria dos sistemas embarcados.

Sistemas embarcados são um componente onipresente da nossa vida cotidiana. Nós interagimos com centenas de minúsculos computadores todos os dias que estão embutidos em nossas casas, nossos carros, nossos eletrodomésticos, os nossos brinquedos, e nosso trabalho. Como o nosso mundo tem se tornado mais complexo, a cada dia “vemos” mais controladores embutidos em nossos dispositivos com capacidade cada vez maior de processamento. Portanto, o mundo precisa de uma força de trabalho treinada para desenvolver e gerenciar produtos baseados em microcontroladores embarcados.

Para iniciar, falarei sobre o microcontrolador TM4C123GH6PM, pois sem ele não seria possível efetuar a execução das instruções de máquina. Basicamente, o TM4C123GH6PM é um microcontrolador baseado em ARM Cortex-M4 32-bit com memória de 256 KB Flash, 32KB SRAM, e operação de 80 MHz (clock de 80 MHz).

O processador ARM Cortex-M fornece a base para um alto desempenho, é uma plataforma de baixo custo que atende às necessidades de implementação mínima de memória, diminuição do número de pinos e baixo consumo de energia e ao mesmo tempo oferecendo um ótimo desempenho computacional e tempo de resposta do sistema para as interrupções do hardware. Realmente gosto muito desta placa, existem outras tão boas quanto, mas essa em termos de simplicidade realmente é muito boa.

Um multiplexador interno permite que diferentes funções periféricas possam ser atribuída a cada um desses slots GPIO. O microcontrolador TM4C123GH6PM vem com um programa de demonstração “quickstart” pré-programado de fábrica. O programa “quickstart” reside no chip de memória Flash e roda cada vez que a energia é aplicada na placa, a não ser que a aplicação “quickstart” tenha sido substituída por um programa desenvolvido pelo usuário (no próximo artigo falarei sobre o desenvolvimento para essa placa).

Como eu disse acima, o processador Cortex-M4 é construído sobre um núcleo de processamento de alto desempenho, utiliza uma arquitetura Harvard com 3 estágios de pipeline, tornando-o ideal para aplicações embarcadas. O processador oferece uma ótima eficiência de energia através de um conjunto de instruções eficiente e design otimizado, assim proporcionando hardware de processamento high-end, ainda contando com o “IEEE754-compliant” computação de precisão simples de ponto flutuante, uma variedade de ciclo único e multiplicação SIMD e ainda capacidades do tipo “multiply-with-accumulate”, saturação aritmética e divisão de hardware dedicado.

Outro fato importante do Cortex-M4 é facilitar a concepção de dispositivos sensíveis ao custo. O processador Cortex-M4 implementa componentes fortemente acoplados, que reduzem a área do processador enquanto melhora significativamente a capacidade de tratamento de interrupção e de depuração do sistema.

Recursos da Placa

Alguns Recursos da Placa:

Tiva C Series LaunchPad inclui os seguintes recursos:
Tiva TM4C123GH6PMI microcontroller
Motion control PWM
USB micro-A and micro-B connector for USB device, host, and on-the-go (OTG) connectivity
RGB user LED
Two user switches (application/wake)
Available I/O brought out to headers on a 0.1-in (2.54-mm) grid
On-board ICDI
Switch-selectable power sources:
– ICDI
– USB device
Reset switch
Preloaded RGB quickstart application

Esta placa vem com uma série dos chamados “BoosterPacks”. Estes “BoosterPacks” expandem os periféricos disponíveis para potenciais aplicações da Tiva C Series LaunchPad. BoosterPacks pode ser usado com a Tiva C Series LaunchPad ou você pode simplesmente usar o microcontrolador TM4C123GH6PM com o próprio processador dela em uma placa desenhada e projetada por você mesmo.

Especificações

A tabela abaixo sumariza as especificações para a Tiva C Series LaunchPad.

image

A imagem abaixo apresenta o “port pins” para os microcontrolador TM4C123GH6PM.

image

É através desta configuração que as portas são acessadas gerando sinais digitais e analógicos de entrada e saída.

O Microcontrolador

Como já dito, o TM4C123GH6PM é um microcontrolador baseado em ARM Cortex-M4 de 32 bits com 256 KB de memória Flash, 32 KB SRAM, e operação de 80 MHz (clock da placa); host USB, dispositivos e conectividade OTG; um módulo de hibernação e PWM, e uma ampla gama de outros periféricos. Caso tenha interesse acesse o data sheet do microcontrolador aqui.

A maioria dos sinais de microcontroladores são direcionados para os conectores de 0,1-in (2,54 mm). Um multiplexador interno permite que diferentes funções periféricas sejam atribuídas a cada um desses slots GPIO. Um ponto importante a observar é que ao adicionar um circuito externo, deve-se considerar uma carga adicional sobre a alimentação da placa. Veja ainda que o microcontrolador TM4C123GH6PM já vem com um programa de demonstração denominado “quickstart”. Como eu disse anteriormente, o programa “quickstart” reside dentro do chip de memória Flash e roda cada vez que a energia é aplicada, este programa é substituído sempre que o usuário programador da placa escrever um novo programa e fizer o o download para a placa (“burn” do programa em memória flash).

Conectividade USB

O EK-TM4C123GXL foi concebido e funciona como um dispositivo USB sem modificação de hardware. Os sinais de dispositivos USB são dedicados a funcionalidade USB e não são compartilhados com os cabeçalhos BOOSTERPACK. Os sinais do dispositivo USB estão listados na Tabela abaixo.

image

O dispositivo de destino TM4C123GH6PM também é capaz de ser host USB embutido e com funções (OTG) “on-the-go”. A funcionalidade de OTG pode ser ativado carregando R25 e R29 com resistências de 0-Ω. Estes resistores conectam o ID USB ​​e sinais VBUS USB para PB0 e PB1. Quando estes resistores são carregados, PB0 e PB1 devem permanecer nas respectivas configurações do modo PIN USB para evitar danos ao dispositivo. PB0 e PB1 também estão presentes no cabeçalho J1 BoosterPack. Portanto, se R25 ou R29 são carregados, deve-se tomar cuidado para que estes sinais não entrem em conflito com os sinais do BOOSTERPACK.

A operação do USB embutido pode ser ativada da mesma forma para dispositivos USB que são auto-alimentados. Fornecer energia ao atuar como um host USB requer um BoosterPack com comutação de energia e conectores apropriados. Todos os sinais de host USB estão disponíveis na interface BoosterPack exceto D+ e D-, que só estão disponíveis no conector USB micro-A/-B e nos dois pontos de teste adjacentes.

Quando conectado como um dispositivo USB, a placa Tiva C Series LaunchPad pode ser alimentada a partir de qualquer ICDI ou os conectores do dispositivo USB. O usuário pode selecionar a fonte de energia, movendo o interruptor POWER SELECT (SW3) para a posição de dispositivos.

Motion Control

O EK-TM4C123GXL inclui a tecnologia PWM Tiva C-Series Motion Control, com dois módulos PWM capazes de gerar 16 saídas PWM. Cada módulo PWM proporciona grande flexibilidade e pode gerar sinais PWM simples. Exemplo: para aqueles exigidos por uma bomba de carga simples, bem como sinais PWM emparelhados e com atrasos de banda, tais como os exigidos por um half-H bridge driver. Três blocos geradores também podem gerar o total de seis canais de controles exigidos por uma ponte inversora de 3 fases. Duas interfaces de quadratura do codificador (QEI) também estão disponíveis para fornecer feedback de controle de movimento.

User Switches and RGB User LED

A placa Tiva Série C LaunchPad vem com um LED RGB. Este LED é usado na carga do programa “Quickstart” e pode ser configurado para ser utilizado em aplicações personalizadas. Dois botões para utilização estão incluídos na placa. Os botões são ambos usados ​​na aplicação “Quickstart” para ajustar o espectro de luz do LED RGB, bem como entrar e sair do modo de hibernação. Os botões podem ser utilizados para outros fins na sua aplicação.

A placa também tem um LED verde. A tabela abaixo mostra como estas características são ligadas aos pinos do microcontrolador.

image

Headers and BoosterPacks

As duas filas de cabeçalhos (slots) empilháveis ​​são mapeadas para a maioria dos pinos GPIO do microcontrolador TM4C123GH6PM. Estas linhas são rotuladas como conectores J1, J2, J3, J4. Vide imagem abaixo para maior entendimento dos cabeçalhos da placa.

image

Os conectores J3 e J4 estão localizados em 0.1 in (2,54 mm) no interior dos conectores J1 e J2. Todos os 40 pinos de conectores do J1, J2, J3, J4 compõem a Tiva Série C TM4C123G LaunchPad BoosterPack XL Interface. Para configurar os dispositivos periféricos de forma fácil e intuitiva através de uma interface gráfica do usuário (GUI), consulte a Tiva Série C Pinmux Utility encontrada em www.ti.com/tool/lm4f_pinmux. Esta interface “Easy-To-Use” torna a configuração de funções alternativas para GPIOs simples e livre de erros.

Abaixo apresento a configuração de cada conector, seus GPIOs e funções alternativas.

J1 Connector

image

J2 Connector

image

J3 Connector

image

J4 Connector

image

No próximo artigo falarei sobre como implementar um software simples usando o “Code Composer Studio”, que é uma das IDEs recomendadas para o desenvolvimento de software para essa e muitas outras placas.

Espero que tenha gostado do artigo. Qualquer dúvida entre em contato.


Construindo Termômetro Com Arduino

Neste artigo (da série embedded systems), vou demonstrar como é possível criar um termômetro para o ambiente utilizando o Arduino UNO e alguns poucos componentes. O ideal é que se tenha alguma noção de eletrônica, mas não é mandatório.

Para mais detalhes sobre o Arduino, acesse o artigo anterior sobre o assunto aqui. Você encontrará maiores referências sobre a placa.

Mas o que é preciso para produzir um produto como esse?

image

Inventário das Peças

image

Com as peças acima selecionadas, podemos começar a produzir o nosso termômetro. A descrição de cada uma das peças é auto explicativa e não entrarei nos detalhes de cada uma delas.

Uma boa prática é sempre desenhar o seu circuito antes de começar a construi-lo fisicamente. Para isso, existe um software chamado “Fritzing” (http://fritzing.org/) que facilita enormemente essa tarefa. Este software é freeware e pode e deve ser baixado gratuitamente para efetuar essa tarefa de design. Para baixa-lo, acesse o link http://fritzing.org/download/.

Escolha a versão para seu sistema operacional e faça download do programa conforme imagem abaixo:

image

Depois que efetuar o download, não é necessário instalação, basta descompactar o programa em algum local no seu computador e executar o arquivo “Fritzing.exe”. A tela abaixo deverá aparecer:

SNAGHTML10211123

O que interessará para nós nesse primeiro momento é a aba “Breadboard”, pois é nela que iniciaremos o desenvolvimento do produto.

SNAGHTML10236592

Inicialmente adicionamos cada um dos componentes que iremos utilizar na nossa Breadboard. veja imagem abaixo:

SNAGHTML102b5d8d

Estes são basicamente os componentes que precisaremos para montar o projeto. Agora está faltando o mais importante: conectar os fios e os componentes na Breadboard e faze-los funcionar.

1) Adicionar o LM35 (Sensor de Temperatura) na BreadBoard.

SNAGHTML102e944e

2) Adicionar o potenciômetro de 10K na Breadboard.

SNAGHTML10306d63

3) Adicionar o display LCD 16×2.

SNAGHTML10317b49

4) Adicionar as ligações entre os componentes e o controlador (Arduino).

image

Nossas ligações deverão ficar conforme imagem acima.

Para baixar o projeto de design criado, Login to view..

Você também pode notar que uma vez terminada a montagem da placa, a ferramenta gera o “Schematic” e o “PCB” para o nosso produto conforme as imagens abaixo:

Schematic

SNAGHTML10415eba

PCB

SNAGHTML1042ef4d

Construindo o Produto Físico

Uma vez que já construímos o nosso design, vamos agora para a parte prática, que nada mais é do que executar os passos que criamos no design do produto.

Veja a montagem do meu circuito:

image

Perceba que pela falta de cores dos fios eu precisei adicionar fios de cores diferentes (pois os meus acabaram), perceba também, que o meu potenciômetro não cabe na Breadboard, por esse motivo improvisei.

Bom, toda a parte de montagem da breadboard já está pronta, precisamos agora iniciar o desenvolvimento do software que irá rodar dentro do Arduino e controlar todas as peças conectadas.

Desenvolvimento do Software

Para desenvolver, utilizarei o Visual Studio 2012 + Plugin para Arduino. Motivo: A IDE do Visual Studio é muito melhor para se trabalhar que a do Arduino, por esse motivo farei uso dela.

Para criar um novo projeto, basta seguir as imagens abaixo:

Para baixar o projeto finalizado, Login to view.

image

Em seguida dê nome ao seu projeto:

SNAGHTML105c0136

E clique em “OK”.

Por fim será aberta a IDE do Visual Studio com seu projeto novo para Arduino (veja abaixo).

image

Podemos então começar a codificar o nosso projeto para efetuar o controle e apresentar na tela a temperatura ambiente.

A imagem abaixo apresenta o código do projeto pronto.

image

Assim que terminar de escrever o código, basta mandar rodar o projeto com o Arduino conectado na porta USB e o código será gravado na memória flash do controlador e automaticamente seu projeto estará funcionando (apresentando a temperatura no display de LCD).

Veja o resultado na imagem abaixo:

image

Espero que tenha gostado do artigo. Qualquer dúvida entre em contato.

Valeu um café?


Princípios de Um Compilador

binary-LanguageNeste artigo apresentarei um assunto muito relevante (e que a maioria dos desenvolvedores de software não dá a devida atenção), que são os compiladores e seu funcionamento. Falaremos sobre o funcionamento e aplicação dos compiladores, sobre a ótica da implementação e conceito, pois em sua forma mais geral, um compilador é um programa que aceita como entrada um texto de programa em uma certa linguagem e produz como saída um texto de programa em outra linguagem, enquanto preserva o significado desse texto.

Podemos entender da seguinte forma: que esse processo é chamado tradução como seria denominado se os textos estivessem em linguagens naturais. Quase todos os compiladores fazem a tradução de uma linguagem de entrada, a linguagem de origem ou linguagem-fonte, apenas para uma linguagem de saída, a linguagem de destino.

Este conceito acima pode ser extrapolado para outros tipos de sistemas além do próprio compilador, como por exemplo, sistemas de gestão de regras de negócio, quando se precisa escrever regras em linguagem de alto nível sem se ter o inconveniente de compilar o programa novamente. Normalmente, espera-se que a linguagem de origem e a linguagem de destino sejam bem diferentes: por exemplo, a linguagem de origem poderia ser C e a linguagem de destino poderia ser código de máquina para processador especificamente da série Pentium (não é comum, mas é possível ser feito).

O nome “compilador” é usado principalmente para os programas que traduzem o código fonte de uma linguagem de programação de alto nível para uma linguagem de programação de baixo nível (por exemplo, Assembly ou código de máquina).

Tenha em mente que a principal razão pela qual alguém desejaria tal tradução é o fato de haver hardware no qual seria possível “executar” o programa traduzido ou, mais corretamente falando, fazer o hardware executar as ações descritas pela semântica do programa. Este conceito é bastante importante quando se precisa manipular um hardware específico. O hardware é a única fonte real de poder de computação.

A execução de um programa traduzido muitas vezes envolve alimenta-lo com dados de entrada em algum formato, e isso provavelmente resultará em alguns dados de saída em algum outro formato. Os dados de entrada podem ser oriundos de diversas fontes: os exemplos são arquivos, sequências de teclas digitadas e pacotes de rede. Da mesma forma, a saída pode ir para diversos lugares; os exemplos são arquivos, telas de monitores e impressoras.

É importante observar que para obter o programa traduzido executamos um compilador, que é simplesmente outro programa cujos dados de entrada são constituídos por um arquivo com o formato de um texto de origem de programa e cujos dados de saída constituem um arquivo com o formato de código executável (para um determinado sistema operacional).

Observe que para obter o compilador, executamos outro compilador cuja entrada consiste em código-texto-fonte do compilador e que produzirá código executável correspondente a esse código-texto-fonte, como faria para o código-texto-fonte de qualquer programa.

Abaixo, segue uma imagem para ilustrar o que foi falado até o momento:

image

Perceba que um aspecto claro da compilação é que a entrada tem uma propriedade chamada semântica (seu ‘significado’), que deve ser preservado pelo processo e com frequência é menos claramente identificável em um programa de conversão de arquivos tradicional, por exemplo um programa que faça a conversão de EBCDIC em ASCII.

O Compilador consegue realizar suas tarefas devido a dois fatores:

  • A entrada está em uma linguagem e consequentemente tem uma estrutura, que é descrita no manual de referência da linguagem.
  • A semântica da entrada é descrita em termos dessa estrutura e está associada a ela.

Esses fatores permitem ao compilador ‘reconhecer’ o programa e coletar sua semântica em uma representação semântica.
Outro conceito importante é: A parte de um compilador que executa a análise do texto da linguagem-fonte é chamada front-end, e a parte que faz a síntese da linguagem de destino é o back-end.

image

Um ponto importante sobre a imagem acima (e que você pode estar se perguntando) é que a imagem acima sugere de imediato outro modo de operação para um compilador: se todos os dados de entrada exigidos estivessem disponíveis, o compilador poderia executar as ações especificadas pela representação semântica, em vez de expressa-las novamente em uma forma distinta. Certo? Sim. Mas nesta abordagem, o back-end de geração de código é então substituído por um back-end de interpretação, e assim, o programa inteiro é chamado interpretador e não compilador. Um ponto positivo para os interpretadores é que normalmente ele é escrito em uma linguagem de alto nível, e portanto funcionará na maioria dos tipos de máquinas, enquanto o código-objeto gerado só funcionará em máquinas do tipo de destino: em outras palavras, a portabilidade será aumentada. Outra razão é que a escrita de um interpretador é muito menos trabalhosa que a escrita de um back-end (sem a menor dúvida).

É importante observar que não há nenhuma diferença fundamental entre usar um compilador e usar um interpretador. Em ambos os casos, o texto do programa é processado em uma forma intermediária, a qual é então interpretada por algum mecanismo de interpretação.

Na compilação: O processamento de programas é considerável, a forma intermediária resultante, código binário executável específico da máquina, é de baixo nível e o mecanismo de interpretação é a CPU do hardware. A execução do programa é relativamente rápida.

Na interpretação: O processamento de programas é de mínimo a moderado, a forma intermediária resultante, alguma estrutura de dados específica do sistema, é de nível alto a médio, o mecanismo de interpretação é um programa (de software). A execução de programas é relativamente lenta.

Por Que Se Chama Compilador?

Então vamos aos conceitos: O significado original de compilar é selecionar material representativo e acrescenta-lo a uma coleção.  Em seu início, a conversão de linguagens de programação era vista do mesmo modo: por exemplo, quando a entrada continha ‘a + b’, um fragmento de código pré-fabricado ‘carregar a no registrador; adicionar b ao registrador’ era selecionado e adicionado à saída. Observe que um compilador compilava uma lista de fragmentos de código a serem adicionados ao programa traduzido. Os compiladores de hoje, em especial aqueles relacionados a paradigmas de programação não-imperativos, com frequência realizam transformações muito mais radicais sobre o programa de entrada.

Por Que Devo Estudar Compiladores?

Há uma série de razões objetivas pelas quais o estudo da construção de compiladores é uma boa ideia: A construção de compiladores é um ramo muito bem-sucedido da ciência da computação, e um dos primeiros a obter esse atributo. Dada sua relação próxima com a conversão de arquivos, ela tem uma aplicação mais ampla que os simples compiladores. Contém muitos algoritmos geralmente úteis em uma configuração realista. A principal razão subjetiva para estudar a construção de compiladores é, a pura curiosidade: é fascinante ver como os compiladores conseguem realizar tudo que fazem. E principalmente ganhar mais conhecimentos em algoritmos mais complexos.

A construção de compiladores é um ramo muito bem-sucedido da ciência da computação. Algumas razões para isso são a estruturação apropriada do problema, o uso criterioso de formalismos e o uso de ferramentas sempre que possível. Os compiladores analisam sua entrada, constroem uma representação semântica e sintetizam sua saída a partir dela. Esse paradigma de análise-síntese é muito eficiente e amplamente aplicável. Veja por exemplo, um programa para medir comprimentos de palavras em um texto poderia consistir em um front-end que analisasse o texto e construísse interiormente uma tabela de pares (comprimento, frequência) e um back-end que depois imprimisse essa tabela.

Outro fato importante de ser apresentado, é que, sem a separação estrita das fases e análise e síntese, as linguagens de programação e a construção de compiladores não seriam o que são hoje. Sem ela, cada nova linguagem exigiria um conjunto completamente novo de compiladores para todas as máquinas. Esse fato dificultaria muito todo o processo. Basta um novo front-end para essa linguagem, a ser combinado com os back-ends existentes para as máquinas atuais.

Veja conforme a imagem abaixo o que estamos falando:

image

Observe porém, que essa separação estrita não é completamente livre de trabalho. Se um front-end souber que está fazendo a análise para uma máquina com instruções de máquina especiais referentes a saltos de vários caminhos, é provável que ele analise instruções case/switch de modo que elas possam se beneficiar dessas instruções de máquina. De forma parecida, se um back-end souber que está gerando código para uma linguagem que não tem nenhuma declaração de rotinas aninhadas, ele poderá gerar um código mais simples para chamadas de rotinas. Entenda que muitos compiladores profissionais são compiladores integrados, destinados a uma linguagem de programação e uma arquitetura de máquina, utilizando uma representação semântica que deriva da linguagem-fonte e que já deve conter elementos da máquina de destino. De qualquer forma, a estruturação desempenhou e ainda desempenha um papel importante na introdução rápida de novas linguagens e novas máquinas.

Outro fato que deve ser sempre levado em conta é o uso criterioso de formalismos. Em algumas partes da construção de compiladores foram desenvolvidos excelentes formalismos padronizados, os quais reduzem bastante o esforço para produzir essas partes. Os melhores exemplos são expressões regulares e gramáticas livres de contexto, usadas em análise léxica e sintática. Não entraremos nesses detalhes aqui, pois demandaria um curso inteiro sobre o assunto. As gramáticas de atributos são um formalismo que pode ser usado para tratar o contexto, as relações de longa distância em um programa que vincula, por exemplo, o uso de uma variável à sua declaração. A geração de código-objeto para uma dada máquina envolve uma grande quantidade de programação complicada quando feita manualmente, mas o processo pode ser automatizado usando-se, por exemplo, técnicas de correspondência de padrões e programação dinâmica. Diversos formatos de formalismos foram projetados para a descrição de código de máquina tanto em nível “Assembly” quando em nível binário, todavia nenhum deles obteve ampla aceitação até hoje, e cada sistema de escrita de compiladores tem sua própria versão.

Teoricamente, assim que se tenha o formalismo apropriado no qual será descrito o que um determinado programa deve fazer, pode-se gerar um programa a partir desse formalismo, usando um gerador de programas.

Observe que para o ramo de compiladores, gerar programas em vez de escreve-los à mão tem várias vantagens:

  1. A entrada para um gerador de programas é de um nível de abstração muito mais alto do que seria o programa escrito à mão. O programador precisa especificar menos, e as ferramentas assumem a responsabilidade por grande parte das tarefas de administração interna propensas a erros. Isso aumenta as chances de que o programa esteja correto. Por exemplo, seria incômodo escrever tabelas de análise à mão.
  2. O uso de ferramentas de geração de programas oferece maior flexibilidade e facilidade de modificação. Por exemplo, se durante a fase de projeto de uma linguagem fosse considerada uma pequena mudança na sintaxe, um analisador escrito à mão seria um grande empecilho a qualquer mudança. Com um analisador gerado, bastaria alterar a descrição da sintaxe e gerar um novo analisador.
  3. Pode-se adicionar código pronto ou sob medida ao programa gerado, aumentando sua capacidade quase sem custo. Por exemplo, o tratamento de erros de entrada em geral é uma tarefa difícil em analisadores escritos à mão; um analisador gerado pode incluir código pronto de correção de erros sem qualquer esforço por parte do programador.
  4. Uma descrição formal às vezes pode ser usada para gerar mais de um tipo de programa. Por exemplo, depois de termos escrito uma gramática para uma linguagem com o propósito de gerar um analisador a partir dela, podemos usa-la para gerar um editor dirigido para a sintaxe, um editor de textos de programa de uso especial que oriente e forneça suporte para o usuário durante a edição de programas nessa linguagem.

Na teoria, os programas gerados podem ser ligeiramente mais ou menos eficientes que programas escritos à mão, mas gera-los é tão mais eficiente que escreve-los à mão que, sempre que existir essa possibilidade, quase sempre será preferível gerar um programa. Outras formas de programação podem ser consideradas construção de compiladores, mais do que se consideraria tradicionalmente. Os exemplos são a leitura de dados estruturados, a introdução rápida de novos formatos e os problemas gerais de conversão de arquivos.

A estrutura básica de qualquer compilador tem de conter pelo menos um analisador léxico, um analisador de sintaxe e um tratador de contexto, nessa ordem. Isso nos leva à estrutura do compilador/interpretador mostrado abaixo.

image

O back-end permite duas implementações intuitivamente diferentes: um gerador de código e um interpretador. Ambos usam o código intermediário, o primeiro para gerar código de máquina, e o segundo para executar de imediato as ações implícitas.

A imagem anterior mostra que, para descrever o compilador mínimo, tínhamos de decompor o front-end em três módulos e que o back-end poderia permanecer como um único modulo. E claro que isso não é suficiente para um compilador real. Apresento uma versão mais realista abaixo, no qual o fronr-end e o back-end consistem cada um em cinco módulos. Além desses módulos, compilador conterá módulos para o tratamento da tabela de símbolos e relatórios de erros; esses módulos serão chamados por quase todos os outros módulos.

image

Propriedades Para Bom Compilador

Não preciso nem dizer que a propriedade mais importante de um bom compilador é a de gerar código correto (mas já disse). Um compilador que ocasionalmente gera código incorreto é inútil; um compilador que gera código incorreto uma vez por ano pode parecer útil, mas talvez seja perigoso. Também é importante que um compilador obedeça completamente à especificação da linguagem. Ele pode estar tentando implementar um subconjunto, um superconjunto, ou até aquilo que às vezes é chamado sarcasticamente um ‘subconjunto’ estendido da linguagem, e os usuários podem até agradecer, mas esses mesmos usuários logo perceberão que programas desenvolvidos com um tal compilador são muito menos portáteis que programas escritos com o uso de um compilador completamente compatível. Outra propriedade de um bom compilador, negligenciada com frequência, é que ele deve ser capaz de manipular programas de tamanho essencialmente arbitrário, desde que a memória disponível o permita.

A velocidade de compilação é uma questão importante, mas não a principal, espera-se que programas pequenos sejam compilados dentro do intervalo de um segundo em máquinas mais potentes. O caráter amistoso de um compilador em relação ao usuário se mostra principalmente na qualidade de seus relatórios de erros. No mínimo, o usuário deve receber uma mensagem de erro clara que inclua a causa percebida do erro, o nome do arquivo de entrada e a posição nesse arquivo. A importância da velocidade e do tamanho do código gerado depende totalmente do propósito do compilador. Em geral, pode-se esperar que o usuário esteja mais interessado em alta velocidade que em tamanho pequeno (exceto o código para aplicações embarcadas utilizando  microcontroladores e etc).

No próximo artigo entrarei no assunto das gramáticas que é bem interessante e sem ela não existiria o formalismo da linguagem.

Qualquer dúvida entre em contato.


Arduino Pra Que Te Quero

Neste artigo, vou abordar o assunto dos micro controladores, mais especificamente o Arduino [www.arduino.cc].

Diversas áreas precisam controlar o funcionamento de máquinas e aparelhos diversos e não podem se dar ao luxo de gastar muito dinheiro com produtos caros, pois podem inviabilizar um determinado projeto. Por esse (e outros motivos) utilizam placas com micro controladores em seus projetos. Neste artigo falarei sobre a plataforma de prototipagem eletrônica de hardware livre chamada “Arduino”.

O Hardware

A placa do Arduino consiste em um microcontrolador Atmel AVR de 8 bits, com componentes complementares para facilitar a programação e incorporação para outros circuitos.
Existem várias placas Arduino, sendo que a mais difundida é a Arduino UNO que apresento conforme as imagens abaixo:

“Uno” significa “um” em italiano e foi o nome dado para marcar o lançamento do Arduino 1.0.
Esta placa contem 14 pinos digitais de entrada e saída (todos podem ser utilizados como entrada e saída conforme programação efetuada pelo usuário da placa) sendo que 6 podem ser utilizados como saída PWM. Além disso, contém 6 entradas analógicas, um clock de 16 MHz, uma porta para conexão USB, uma entrada de força e outros atributos mais técnicos.
Esta placa (assim como as outras) passa por revisões e atualizações. Atualmente o Arduino UNO está no rev3.

Visão geral do Hardware

Microcontroller

ATmega328

Operating Voltage

5V

Input Voltage (recommended)

7-12V

Input Voltage (limits)

6-20V

Digital I/O Pins

14 (of which 6 provide PWM output)

Analog Input Pins

6

DC Current per I/O Pin

40 mA

DC Current for 3.3V Pin

50 mA

Flash Memory

32 KB (ATmega328) of which 0.5 KB used by bootloader

SRAM

2 KB (ATmega328)

EEPROM

1 KB (ATmega328)

Clock Speed

16 MHz

A imagem abaixo está apesentado o esquema da placa Arduino UNO para os mais interessados em eletrônica.

Alimentação da Placa

O Arduino Uno pode ser alimentado através de uma conexão USB ou com uma fonte de alimentação externa. A fonte de alimentação é selecionada automaticamente conforme o fornecimento da energia pelas fontes. Fonte externa (não-USB) de energia pode vir com um adaptador AC-DC ou bateria.
O adaptador pode ser conectado através de um plugue centro positivo 2,1 milímetros na tomada de energia da placa. Além disso, cargas de uma bateria podem ser inseridas nos pinos Gnd e Vin do conector de alimentação.

A placa pode operar a partir de um fornecimento externo de 6 a 20 volts. Se fornecido com menos de 7V, no entanto, o pino de 5V pode fornecer menos de cinco volts e a placa pode se tornar instável. Se usar mais do que 12V, o regulador de voltagem pode superaquecer e danificar a placa. Sendo assim, o intervalo recomendado é de 7 a 12 volts.
Os pinos de energia são os seguintes:

  • VIN – A tensão de entrada para a placa Arduino quando se está usando uma fonte de alimentação externa (ao contrário de 5 volts a partir da conexão USB ou outra fonte de alimentação regulada). Você pode fornecer tensão por este pino ou, se o fornecimento de tensão se der através da tomada de energia, acessá-lo através deste pino.
  • 5V – Este pino gera uma tensão regulada de 5V na placa. A placa pode ser alimentada com energia a partir da tomada de energia DC (7 – 12V), do conector USB (5V), ou do pino VIN da placa (7-12V). Fornecimento de tensão através dos pinos 5V e/ou 3.3V ignora o regulador, e pode danificar sua placa. Este procedimento não é nenhum pouco recomendado.
  • 3.3V – Este pino gera uma tensão de 3,3 volts gerado pelo regulador on-board. A corrente máxima é de 50 mA.
  • GND – São os pinos de aterramento.
  • IOREF – Este pino na placa Arduino fornece a referência de tensão com que o microcontrolador está operando. Um determinado circuito configurado corretamente pode ler a tensão do pino IOREF e selecione a fonte de alimentação adequada ou habilitar tradutores de tensão nas saídas para trabalhar com o 5V ou 3.3V.

Memória do Arduino UNO

O chip ATmega328 tem 32 KB (com 0,5 KB utilizada para o bootloader). Ele também tem 2 KB de SRAM e 1 KB de EEPROM (que pode ser lido e escrito com a biblioteca EEPROM).

Entrada e Saida

Cada um dos 14 pinos digitais do Arduino Uno pode ser utilizado como uma entrada ou uma saída, usando as funções pinMode(), digitalWrite() e digitalRead().Eles operam com 5 volts. Cada pino pode fornecer ou receber um máximo de 40 mA e tem um resistor pull-up interno (desconectado por padrão) de 20-50 kOhms. Além disso, alguns pinos têm funções especializadas:

  • Serial: 0 (RX) and 1 (TX): Usado para receber (RX) e transmitir (TX) dados seriais TTL. Estes pinos são ligados aos pinos correspondentes do USB-TTL chip serial ATmega8U2.
  • External Interrupts (2 and 3): Estes pinos podem ser configurados para disparar uma interrupção por um “low value”, uma “rising” ou “falling edge”, ou uma mudança de valor. Caso tenha interesse, acesse a documentação da função attachInterrupt() para mais detalhes.
  • PWM: 3, 5, 6, 9, 10 e 11: Assegura a saída PWM de 8-bit com a função analogWrite().
  • SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK): Estes pinos suportam comunicação SPI usando a biblioteca SPI.
  • LED 13: Há um LED pré-montado conectado ao pino digital 13. Quando o pino está com o status HIGH, o LED está ligado, quando o pino é LOW, ele está desligado.

O Arduino Uno tem 6 entradas analógicas, rotuladas A0 a A5, cada uma das quais com 10 bits de resolução (1024 valores diferentes). Por padrão elas medem até 5 volts, embora seja possível mudar o limite superior de sua faixa usando o pino AREF e a função analogReference().Além disso, alguns pinos tem funcionalidades especializadas:

  • TWI (A4 ou SDA pin e A5 ou SCL pin): Suporta Comunicação TWI usando a biblioteca Wire.
  • AREF: Tensão de referência para as entradas analógicas. Usado com analogReference().
  • Reset: Traz essa linha LOW para resetar o microcontrolador. Tipicamente usado para adicionar um botão de reset para “Shields” que bloqueiam o que está na placa.

Comunicação do Arduino

Muita coisa no Arduino não faria sentido se não houvesse comunicação dele com o mundo externo e do mundo externo para ele.

O Arduino Uno tem uma série de facilidades para se comunicar com um computador, outro Arduino ou outros microcontroladores. O chip ATmega328 fornece UART TTL (5V) de comunicação serial, que está disponível nos pinos digitais 0 (RX) e 1 (TX). Um ATmega16U2 direciona esta comunicação serial através de USB que aparece como uma porta COM virtual para o software no computador. O firmware ’16U2 usa os drivers COM USB padrão, e nenhum driver externo é necessário, no entanto, no Windows, um arquivo (inf) se faz necessário.

O software do Arduino inclui um monitor serial que permite que dados simples de texto sejam enviados de e para a placa Arduino. Os LEDs RX e TX da placa piscam quando os dados estão sendo transmitidos através do chip “USB-to-Serial” e conexão USB para o computador (mas não para comunicação serial nos pinos 0 e 1). Além disso, o ATmega328 também suporta I2C (TWI) e comunicação SPI. Inclui ainda uma biblioteca Wire para simplificar o uso do bus I2C.

Programando Para Arduino

Talvez uma das partes mais interessantes do Arduino, seja a possibilidade de escrever seus próprios comandos para a placa, facilitando muito a automação de qualquer atividade que se tenha em mente.

O Arduino Uno pode ser programado com o software Arduino que pode ser baixado aqui.

O ATmega328 no Arduino Uno vem precarregado com um bootloader que permite o envio de novos códigos sem o uso de um programador de hardware externo, o que é muito bom, pois facilita enormemente a vida do programador. Ele se comunica utilizando o protocolo original STK500.

Também é possível ignorar o bootloader e programar o microcontrolador através do ICSP (In-Circuit Serial Programming), porém é necessário conhecimentos específicos que, não necessariamente o programador precisa ter para tocar seus projetos.

Uma vez que você tenha feito o download do software, você deve instala-lo no seu computador para começar a programar. Basta rodar o arduino.exe e a IDE dele será aberta. É uma IDE bastante simples e sem qualquer tipo de “intellisense”.

Vide abaixo a imagem da IDE com um exemplo do LED na porta 13 piscando a cada 1 segundo.

No próximo artigo sobre Arduino, falarei sobre a parte de programação da placa e como configurar os drivers para Windows 8.

Espero que tenha gostado do artigo. Qualquer questão, escreva para mim.