Euripedes Rocha
This book is for sale at http://leanpub.com/firmwarec
This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
O que é firmware? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
A linguagem C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Microcontroladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Pela união dos seus poderes… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Versionamento e controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Editor de texto/IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Placa de desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Ferramentas de compilação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
O sistema de build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
O datasheet e documentações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Iniciando os trabalhos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Objetivos do capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Criando o repositório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Versionando o nosso repositório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Iniciando o microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Mapa de memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
A função main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Antes da função main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
The PowerLoop! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Iniciando o hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Periféricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
CONTEÚDO
Conversores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Seriais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Interrupções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
State machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Sobre este livro
Objetivos desse livro
Antes de iniciar propriamente o texto do livro é preciso estabelecer os modestos objetivos do
mesmo. Este livro pretende ser uma introdução ao projeto de firmware para sistemas embarcados
microcontrolados. A ideia é que ele sirva de texto introdutório e amplie o conhecimento sobre
microcontroladores e a linguagem C.
É um livro dedicado aos iniciantes e aos iniciados com pouca estrada, embora eu tenha esperança
de também fornecer alguma informação útil aos que tem mais experiência.
1
Sobre este livro 2
com a causa. Talvez você se pergunte o motivo de adotar esse modelo, e essa resposta é a parte mais
importante desta parte do livro. Eu acredito que o acesso a informação e conhecimento deva possuir
o mínimo de barreiras para aquisição, mas também sei que produzir material com alguma qualidade
custa muito tempo e algum dinheiro. Espero que essa iniciativa tenha sucesso e que isso fomente a
ideia de outras pessoas produzirem conteúdo em português sobre outros assuntos.
Introdução
O que é firmware?
A primeira questão que temos de sanar é o que raios é o firmware.
Quando tratamos de sistemas programáveis é comum estabelecer uma divisão bem clara entre o
elemento físico e a lógica envolvida.
Ao elemento físico damos o nome de hardware. No hardware estão os sensores de temperatura, o
transistor que irá acionar o relé e o led que acende indicando um problema. Esses elementos são
mais difíceis de modificar uma vez finalizado o projeto.
A parte que complementa esses elementos é o software. Nesse ponto temos estabelecida a lógica sob
a qual irá funcionar o produto. O que diferencia o software do firmware?
A diferença não é muito definida e estabelecida, mas o firmware lida com a atividade mais básica
de interface com o hardware e faz o papel de comandar e coordenar as ações do mesmo. O termo
software é comumente deixado para elementos de mais alto nível.
A linguagem C
A despeito de todos os anos passados desde a sua criação nos anos 70 o C ainda é predominante
quando se trata de desenvolvimento de sistemas embarcados e código que faz interface com o
hardware. Por possuir características que permitem o interfaceamento direto com a memória e não
colocar muitas camadas entre o código e sua execução essa hegemonia está aparentemente longe
de ser posta a prova. Mesmo o C++ está há vários anos nessa jornada e ainda não atingiu a mesma
utilização que o C.
Microcontroladores
Um microcontrolador é um dispositivo que possui internamente um microprocessador permite a
execução de um programa em sua linguagem nativa(o assembly) e que contém ainda no mesmo
encapsulamento uma memória pra guardar esse programa, uma memória que será utilizada durante
a execução do programa.
Hoje em dia temos diversos fabricantes, modelos e arquiteturas e é preciso alguma experiência na
hora de fazer a escolha de que microcontrolador utilizar em um determinado projeto, discutir essa
escolha está além do escopo desse livro.
Vamos brevemente discutir cada uma das partes dessa nossa definição de microcontrolador.
3
Introdução 4
Microprocessador
O microprocessador é quem de fato possui a capacidade de executar tarefas programadas interface-
ando com o mundo exterior através de seus periféricos. Um processador pode de maneira resumida
e simplificada definir seu funcionamento através do ciclo:
1 - Busca
Uma tarefa é retirada de uma lista de tarefas previamente determinado. Essa lista de tarefas é o
programa em execução e o local pré determinado é um endereço na memória que guarda o programa.
2 - Decodificação
A tarefa é analisada pelo processador para que o mesmo saiba o que exatamente ele deve fazer.
Embora exista uma infinitude de aplicações as tarefas que o processador é capaz de executar, suas
instruções, são limitadas. A esse conjunto chamamos de Arquitetura do conjunto de Instruções (ISA
na sigla em inglês).
3 - Execute
Uma vez que a instrução foi interpretada a mesma deve ser executada. As instruções envolvem
acessos a memória, operações aritméticas e lógicas. Algumas arquiteturas apresentam instruções
especializadas para acelerar a execução de uma determinada classe de algoritmos.
Esse ciclo é executado a cada nova instrução do processador, ou seja, pra cada endereço do nosso
programa o ciclo se repete e nos processadores modernos esse ciclo ocorre alguns milhões de vezes
por segundo!³
ignora conceitos mais avançados no funcionamento do processador. Um livro específico sobre
arquitetura de computadores tratará melhor o assunto que está além do escopo deste livro.
Memória de programa
Essencialmente é o lugar onde está guardado o programa que será executado pelo processador.
Essa memória em microcontroladores é não volátil, ou seja, ela não seu conteúdo ao desligarmos
a alimentação do circuito. Nos microcontroladores atuais essa memória é do tipo flash na maioria
dos casos. O tamanho varia de 1kB até 2MB (é possível que uma ou outra exceção apareça mas esses
são valores típicos).
Memória de dados
Nessa memória estão os dados utilizados durante a execução do programa. Essa memória é volátil
e portanto os dados são perdidos quando a alimentação do circuito é removida. Essa memória é
usualmente muito menor que a memória flash do microcontrolador, chegando a algumas dezenas
de kB.
³É importante destacar que essa é uma visão simplificada que
Introdução 5
Periféricos
Nesse ponto está o que considero o grande poder dos microcontroladores. A presença de elementos
de hardware dedicados as mais diversas funções é o que provê a versatilidade encontrada nos
microcontroladores. Entre os periféricos estão timers,interfaces de comunicação SPI, I2C e UART,
conversores analógico digital e em alguns casos elementos mais especializados. Para o processador,
que é quem faz o controle de todos os elementos os periféricos são somente mais endereços de
memória a serem acessados.
Versionamento e controle
Imagine a seguinte cena. Você acabou de escrever uma parte do seu código e resolveu testar o
funcionamento do mesmo mas nada aconteceu, o que fazer? Você levanta alguma teoria e vai testá-
la, mas não pretende perder o trabalho feito. Ou mesmo quando no meio do projeto você ou algum
responsável pelo mesmo resolve mudar o comportamento do sistema. Como salvar sem perder o
trabalho realizado?
Em um mundo de trevas e caos em que eu já vivi seria criada uma nova pasta com o nome
projetodataxxxx ou mesmo projetoversaofinal, ou projetoagoravai(quem nunca :) ).
Após algum tempo com esse sofrimento descobri existem sistemas inteiros dedicados a solução desse
problema. Aqui vou dedicar algumas linhas ao git, sistema de versionamento desenvolvido para
facilitar o desenvolvimento do kernel do Linux.
Existem outros sistemas de versionamento disponíveis mas focaremos no git. Você pode usar o
sistema que melhor se adaptar, menos o da mudança de nomes de arquivos e diretórios descrito
acima ;).
Plataformas
Primeiramente vamos deixar claro. Já passamos de 2010 e para cada necessidade que pode ser
resolvida com um computador há pelo menos uma plataforma online. Salvo o caso em que há
6
Ferramentas 7
propriedade intelectual com questões de segurança de estado há pouca justificativa pra manter uma
base de código local somente.
Há para o caso de repositórios de código baseado no git algumas opções.
1 - Github
github.com⁵
O Github é basicamente uma rede social de programadores. Há muitos projetos de grande porte que
usam o Github para versionamento e controle de sua base. O github possui repositórios públicos
gratuitos e para que o repositório seja privado é preciso migrar para o plano pago.
2 - Bitbucket
bitbucket.org⁶
Uma alternativa ao github, oferece repositórios privados e públicos, mas os repositórios privados
possuem limite de colaboradores e é preciso migrar para panos pagos caso o número de desenvol-
vedores seja maior que 10.
Além do git oferece suporte ao uso do mercurial como controle de versão.
3 - Gitlab
gitlab.com⁷
Outra alternativa que permite a criação de repositórios privados no plano gratuito.
As três plataformas que foram listadas atendem aos projetos mais básicos e profissionais e possuem
diferenças que dependem do uso e da necessidade de cada projeto/equipe. É preciso usar por um
tempo pra definir a escolha. No nosso caso iremos utilizar o Github, mas eu mantenho projetos nas
três plataformas, o livro é mantido no Bitbucket e o nosso conjunto de tickets ( issues ) para controle
de atividades está no github.
Editor de texto/IDE
Essa é de fato a nossa ferramenta de trabalho enquanto desenvolvedores. A escolha é um tanto
pessoal mas é importante escolher um editor que possua ao menos destaque de sintaxe. Uma boa
interface de debug é algo igualmente importante dado que boa parte do nosso tempo é dedicado a
encontrar os problemas que nós mesmos inserimos no código.
Uma opção comum é o uso do Eclipse com plugins que facilitam o desenvolvimento de sistemas
embarcados. Alguns fabricantes disponibilizam ambientes de desenvolvimento dedicados aos seus
microcontroladores e algumas pessoas, eu entre elas, possuem a preferência pelo uso de ferramentas
de linha de comando. A questão aqui é automatizar o máximo de tarefas e tornar menos complexas
as atividades de suporte como compilação, debug de código e gravação do microcontrolador. Voltarei
ao assunto mais vezes.
Placa de desenvolvimento
Quando comecei nessa brincadeira alguns anos atrás as placas de desenvolvimento eram muito mais
caras que são hoje em dia e poucos fabricantes possuíam kits com preço acessível. Aliás era difícil
inclusive comprar alguns microcontroladores.
O cenário evoluiu bastante e há muitas opções para placas de desenvolvimento.
Algumas opções para seguir com o assunto desse livro:
A Texas Instruments possui as placas [launchpad] A NXP possui as placas [Freedom] A ST possui
as placas [Discovery]
Note que os três links apontam para placas com microncontroladores cujo processador é um ARM
Cortex-M4. Nesse texto vamos tratar o uso desses processadores por uma questão de acesso as
ferramentas. Embora os exemplos estejam focados nessas plataformas não acredito que isso seja
um limitante para levar os conceitos a outras plataformas.
Ferramentas de compilação
Quando escrevemos o código no editor de texto que escolhemos ele é somente uma descrição da
lógica que pensamos ao iniciar o nosso projeto. O processador integrado ao microcontrolador não é
capaz de executá-lo. Conforme disse anteriormente o processador só possui capacidade de executar
seu limitado conjunto de instruções. Precisamos de um tradutor.
Quando finalizamos a escrita do código temos um conjunto de caracteres gerando um texto. O
processador interpretará suas instruções no formato de palavras binárias com códigos de operação
e operandos, qual o processo de tradução entre os dois idiomas?
Ferramentas 9
No primeiro passo temos a compilação. Nesse estágio o texto que criamos é transformado em
arquivos objeto. Esse arquivo é a tradução direta do que está escrito para a linguagem do processador
em questão. Esse arquivo ainda não poderá ser executado.
No segundo estágio o linker entra em ação. O linker irá juntar essas peças em seus endereços corretos
e montar uma sequência que permita que o código execute e as chamadas de função ocorram de
maneira correta. Voltaremos ao assunto em mais detalhes quando formos de fato utilizar essas
ferramentas.
No decorrer desse texto iremos utilizar este compilador⁹ e portanto é importante que o mesmo
seja instalado. Acredito que todas as distribuições Linux possuam um pacote para a instalação do
compilador.
O sistema de build
O projeto de sistemas vai ficando mais complexo conforme vamos adicionando novas bibliotecas e
algoritmos. Juntar todo o código manualmente e gerar os artefatos para gravação do microcontrola-
dor se torna uma tarefa tediosa e sujeita a muitos erros. Para solucionar essa questão um conjunto
de ferramentas dedicadas a construção de software foi desenvolvida. No decorrer do texto iremos
utilizar makefiles.
O make é uma ferramenta que data dos anos 70 e possui uma linguagem própria para descrever
como devem ser construídos os sistemas.
Há diversas outras ferramentas dedicadas a essa tarefa de automação de construção de código e do
mesmo modo que o editor você pode escolher a sua. Atualmente tenho iniciado o uso do ceedling
como ferramenta de build em substituição ao make por sua integração com ferramentas de testes
unitários automatizados.
Debug
Não vou estabelecer uma estatística precisa, mas o fato é que a maior parte do tempo em que estamos
trabalhando em um projeto é dedicado a encontrar e corrigir problemas no código. Esse processo é
denominado debugging.
Precisamos deixar uma coisa bem clara. Em um sistema microcontrolado o seu código é escrito em
um ambiente e executado em outro, isso é denominado cross development. Essa características torna
as coisas mais interessantes no momento de encontrar os problemas.
Ao longo dos anos as ferramentas de debug se tornaram mais evoluídas e já há algum tempo é
possível controlar a execução do firmware a partir do ambiente de desenvolvimento. Para isso
precisamos de dois componentes.
⁹http://bit.ly/booktask1
Ferramentas 10
O primeiro deles é um hardware que faça a interface com o controlador interno de debug do
microcontrolador. A maior parte das placas de desenvolvimento atual integra uma interface dessas,
as três listadas acima possuem, permitindo a gravação da memória de programa e a execução de
código passo a passo para a depuração e remoção de erros.
O segundo elemento é o software que executado no ambiente de desenvolvimento irá traduzir os
comandos para essa interface e nos apontar no código em que estágio da execução estamos.
Essa é a interface que deve ser melhor escolhida e a ferramenta que devemos conhecer mais a fundo
pois é ela quem irá nos servir na maior parte do tempo.
O datasheet e documentações
Não é usual listar datasheets como ferramentas, mas qualquer um que já passou algum tempo
desenvolvendo sabe que é importante manter a documentação do microcontrolador em uso com
fácil acesso. Vou deixar duas notas sobre o assunto.
Primeiro que a documentação dos microcontroladores tem se tornado muito complexa e crescido
bastante. Um efeito disso é que ao longo dos anos a documentação tem se tornado cada vez pior isso
é um sofrimento enorme para quem depende de utilizar um microcontrolador.
O segundo ponto que se relaciona ao primeiro é que com a complexidade dos microcontroladores
a documentação se dividiu em vários documentos. Usualmente iremos encontrar um datasheet
contendo informações elétricas e úteis ao projeto do hardware e um reference manual que contém
as informações relevantes dos periféricos e que será utilizada por nós ao desenvolver a interface com
os periféricos.
Iniciando os trabalhos
Objetivos do capítulo
Nesse capítulo iremos tratar o início de um projeto e a estrutura que utilizaremos para o trabalho.
Trataremos da criação e o uso básico do git como sistema de versionamento com um repositório
no github. Vamos aproveitar para tratar do boot do microcontrolador e como o código vai do
processador de texto até a memória do microcontrolador.
Criando o repositório
No capítulo anterior tratamos rapidamente das ferramentas que são utilizadas no decorrer de
um projeto e agora vamos colocar em prática o uso. O primeiro passo é criar o repositório para
mantermos o trabalho e facilitar o compartilhamento de código e informação entre nós.
Vá até o github.com e crie uma conta e um novo repositório, escolha o .gitignore para a linguagem
C e a licença que você se sentir a vontade, usualmente eu escolho MIT. Qualquer problema nesse
processo use o chat¹⁰ para pedir auxílio.
O arquivo .gitignore vai nos permitir listar os artefatos que não queremos salvar, como os binários
gerados por exemplo.
• Clonando
O git é um sistema distribuído, ou seja, a sua cópia local irá conter todo o histórico e para iniciar o
trabalho é preciso obter os arquivos do repositório.
Para isso usamos:
¹⁰http://bit.ly/chatfirmware
¹¹https://git-scm.com/book/pt-br/v1
11
Iniciando os trabalhos 12
• Branch
Uma vez que a sua cópia local foi sincronizada com o repositório é hora de trabalhar nas
modificações. Uma boa prática é criar um branch local para executar as alterações necessárias no
código.
Um branch é uma variação, um ramo, do tronco principal do seu código. Ao criar o repositório há
inicialmente o branch master. Executando o comando:
Será criado o branch novo_codigo e seremos movidos pra lá. Esse branch é exatamente o master. Se
fizermos alguma modificação no código e commitarmos voltando ao master com:
As modificações não estarão presentes. Isso porque elas pertencem ao branch novo_codigo.
Repare no uso da opção -b no primeiro comando. Ao informar essa opção ao git nós estamos
solicitando a criação de um novo branch. O checkout para o master não necessita do -b pois o
branch já existe.
• Commit
Quando fazemos alguma alteração no código, existe o momento em que temos de dizer para o sistema
de versionamento que ele deve registrar o estado atual do código. Esse momento é o commit.
Enquanto estamos trabalhando no código usando o editor de texto e validando usando as demais
ferramentas para o sistema de versionamento nenhuma das modificações existe. Uma vez que exista
uma modificação que deve ser salva devemos indicar ao sistema de versionamento que deve salvar
o status atual do branch. O comando é:
• Add
Para que o git saiba que deve manter o registro das modificações em um determinado arquivo ou
pasta devemos dizer ao sistema:
Iniciando os trabalhos 13
• Merge
Após finalizarmos o trabalho no branch queremos que esse trabalho seja incorporado ao branch
master e pra isso usamos o comando merge. O comando merge irá misturar as duas versões deixando
com as versões mais recentes de cada arquivo. A sequência de comandos é:
• Push
Até esse ponto todas as modificações estão somente na cópia local e salvas somente no nosso
computador de trabalho. Nenhuma das plataformas listadas foi usada. É o momento de salvarmos o
trabalho no repositório remoto.
1 git remote -v
• Pull
1 git pull
Pondo em prática.
Vamos clonar o repositório criado no início do capítulo. Se tudo correu corretamente você terá uma
página com o seu repositório contendo 3 arquivos:
Após isso há uma cópia local do repositório. Voltaremos ao uso do git adiante.
Iniciando o microcontrolador
Quando tratamos do processo de funcionamento do microprocessador listamos as tarefas que ele
executa para saber qual a instrução a ser executada:
1 - Busca 2 - Decodificação 3 - Execução
Mas esse processo deve se iniciar em algum ponto. Antes de tratarmos o código de inicialização do
nosso programa vamos dar uma olhada no espaço de memória do nosso processador.
Mapa de memória
Quando descrevemos o que é um microcontrolador em essência foi dito que temos um microproces-
sador com um conjunto de periféricos integrado. Para o processador tudo que há é um conjunto de
endereços de memória. Cabe ao fabricante do microcontrolador preencher os endereços e acrescentar
algum significado aos mesmos¹².
Busque por port mapped i/o para entender as diferenças do outro método.
Quando utilizamos um microcontrolador cujo núcleo é um Cortex-Mx o mesmo possui algumas
características comuns para todos os fabricantes. O mapa de memória por exemplo é similar para
todos eles. O mapa de memória é uma informação encontrada nos manuais do microcontrolador
indicando a distribuição dos endereços de memória e seu significado.
Os processadores ARM Cortex-Mx possuem um endereço pra memória com 32 bits, com isso é
possível endereçar 2ˆ32 posições de memória, e a ARM já fez a divisão desse latifúndio previamente.
¹²Tratamos aqui somente de entrada e saída mapeada em memória.
15
Iniciando o microcontrolador 16
O mapa de memória simplificado da figura destaca somente as partes que nos interessam nesse
momento. Como dito anteriormente o processador do nosso microcontrolador somente é capaz de
manipular conteúdos de memória e esse mapa começa a refletir o conteúdo dessa memória.
A parte que se inicia no endereço 0x00000000 é dedicada ao código. Esse espaço pode se estender
até o endereço 0x20000000, o que nos daria 0,5GB de espaço para o nosso código! Mas não se
Iniciando o microcontrolador 17
anime tanto, esse é o espaço reservado para a memória flash entretanto esse espaço não é ocupado
completamente pelos fabricantes. Para efeitos práticos, a depender do microcontrolador escolhido,
podemos considerar algo entre 32KB e 2MB para gravar os programas que escreveremos, acredite
isso é bastante coisa.
O setor seguinte possui o mesmo tamanho e do mesmo modo não é completamente ocupado pelo
fabricante. Nesse ponto temos o espaço de memória dedicado a SRAM, que é a nossa memória de
dados. Aqui estarão os dados que manipulamos na execução da função do nosso sistema embarcado.
Na sequência temos o espaço dedicado aos periféricos. Nesses endereços estarão os registradores
de configuração dos diversos periféricos presentes no microcontrolador. Essa seção da memória é
dividida novamente entre os periféricos e cada endereço representa um registrador com os vários
bits de configuração. Trataremos novamente dessa região e olharemos em detalhe alguns periféricos
para compreender melhor a leitura dos manuais e interface quando tratarmos a escrita de drivers.
A função main()
Nesse ponto do texto chegamos a parte que todos esperavam, código! Nesse ponto vamos tratar
superficialmente a estrutura do nosso programa. Na linguagem C o início de tudo é sempre através
da função main().
Assim o nosso programa terá necessariamente a seguinte estrutura na sua inicialização:
1 int main(){
2 return 0;
3 }
Nesse ponto possuímos um código que não executa absolutamente e não possui qualquer relação
com o hardware que será utilizado, mas já nos dá a semente do nosso trabalho.
Trataremos funções com mais detalhes no próximo capítulo.
The PowerLoop!
Voltemos agora a estruturar o nosso código. Em sistemas embarcados é pouco provável que a
execução do nosso programa termine. O nosso sistema deve permanecer funcionando o tempo em
que estiver ligado. Imagine se o controlador do freio ABS de um carro estivesse desligado durante o
processo de frenagem do carro?
Assim é típico encontrar um loop infinito, uma sequência de tarefas que são executadas por tempo
indeterminado. Assim o nosso código inicial fica assim:
1 int main(){
2 while(1) {
3 coisas fantásticas acontecem;
4 };
5 return 0;
6 }
O bloco while é o responsável por estabelecer o loop comentado. No próximo capítulo vamos tratar
as estruturas da linguagem C e discutir todas essas questões com mais detalhes.
Iniciando o hardware
Nos microcontroladores há tipicamente várias opções e configurações que devemos fazer para
utilizá-los da maneira que precisamos no nosso projeto. Tipicamente eu dedico um conjunto de
funções para essa tarefa e concentro tudo em um arquivo e uma única chamada de função no código
principal.
Iniciando o microcontrolador 19
1 #include "hardware.h"
2
3
4 int main(){
5 hw_init();
6
7 while(1) {
8 coisas fantásticas acontecem;
9 };
10 return 0;
11 }
20
Timers
21
Conversores
22
Seriais
23
Interrupções
24
State machines
25