Você está na página 1de 84

14/11/22, 09:43 Linguagem C nos sistemas embarcados

Linguagem C nos sistemas embarcados


Profª. Marcos Santana Farias

Descrição Aplicação das ferramentas de software que permitem o


desenvolvimento de sistemas embarcados com a linguagem C.

Propósito A avaliação prática de ferramentas de software utilizadas no


desenvolvimento de sistemas embarcados com a linguagem C, como
ambientes de edição e compilação, depuradores e simuladores, é
essencial para a formação do profissional que busca se integrar em
equipes de projeto em diversas indústrias que utilizam sistemas
embarcados.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 1/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Objetivos

Módulo 1 Módulo 2

Sistemas embarcados Ferramentas integradas de


desenvolvimento
Distinguir as características básicas dos
sistemas embarcados e a sua evolução.
Avaliar as ferramentas integradas de
desenvolvimento para sistemas
embarcados.

Módulo 3 Módulo 4

Técnicas de identificação de Testes para projeto de


erros sistemas embarcados
Empregar técnicas para identificação de Formular testes para projeto de sistemas
erros em códigos de sistemas embarcados. embarcados sem usar um destino físico

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 2/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Introdução Os sistemas de computação estão em toda parte. Não é nenhuma surpresa


que milhões de sistemas de computação são construídos todos os anos
para computadores desktop, estações de trabalho e grandes servidores.
Também não deve ser surpresa que bilhões de sistemas de computação são
construídos todos os anos para uma finalidade específica, tão ampla como
os sistemas citados. Eles podem estar incorporados em dispositivos
eletrônicos maiores, realizando repetidamente uma função, muitas vezes
passando completamente despercebidos pelo usuário do dispositivo.
Podem também ser independentes, controlando uma infinidade de
equipamentos que nos cercam. Estes são os sistemas de computação
embutidos/embarcados, ou simplesmente sistemas embarcados.

Eletrônicos de consumo, máquinas industriais, automóveis, câmeras,


relógios digitais, eletrodomésticos, aviões, bem como dispositivos móveis,
são alguns locais possíveis para um sistema embarcado. Vamos aprender
as características dos sistemas embarcados, os seus possíveis caminhos de
evolução e analisaremos as ferramentas essenciais para programar esses
sistemas com a linguagem C.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 3/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

1 - Sistemas embarcados
Ao final deste módulo, você será capaz de distinguir as características básicas dos sistemas
embarcados e a sua evolução.

Visão geral
Um sistema é um arranjo em que todos os seus componentes funcionam de
acordo com as regras específicas que foram definidas. Assim, o sistema
embarcado pode ser descrito como uma maneira de executar ou organizar uma
ou várias tarefas de acordo com um conjunto de regras, uma associação em que

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 4/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

dispositivos eletrônicos são reunidos coletivamente em sintonia com um


programa ou plano de controle.

Citamos “programa” e “dispositivos eletrônicos”. Contudo, podemos substituir


esses termos por software e hardware. Assim como nos PCs, a maioria dos
sistemas embarcados são compostos por um software. A seguir, vamos discutir
as características comuns dos sistemas embarcados, e em particular os
compostos por software e hardware, em que o software em sua maioria é
desenvolvido na linguagem C.

Software
Um conjunto de instruções para realizar tarefas específicas e descrever todos os
aspectos funcionais que não se referem aos componentes físicos (o hardware).

Características comuns aos sistemas


embarcados
Os sistemas embarcados, sendo sem ou com software embarcado têm várias
características em comum:

Função única expand_more

Um sistema embarcado geralmente executa apenas um controle,


repetidamente. Por exemplo, um medidor de batimentos cardíacos terá

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 5/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

sempre a repetição dos mesmos passos para controlar as funções do


equipamento. Em contraste, um PC executa uma variedade de programas
e alternados com frequência.

Fortemente restrito expand_more

Todos os sistemas de computação têm exigências nas métricas de


projeto, que são medidas dos recursos de uma implementação, como
custo, tamanho, desempenho e potência. As métricas de projeto em
sistemas embarcados podem ser especialmente restritas. Os sistemas
embarcados, muitas vezes, custam apenas alguns dólares, devem ser
dimensionados para caber em um único chip, devem ter desempenho
rápido o suficiente para processar dados em tempo real e devem
consumir o mínimo de energia para estender a vida útil da bateria ou
evitar a necessidade de um ventilador de resfriamento.

Reativo e em tempo real expand_more

A maioria dos sistemas embarcados deve reagir continuamente às


mudanças no ambiente onde estão inseridos e deve calcular certos
resultados em tempo real, sem atraso. Por exemplo, o controlador de
cruzeiro de um carro monitora continuamente e reage aos sensores de
velocidade e freio. Ele deve calcular os valores de aceleração ou
desaceleração repetidamente dentro de um tempo limitado; um resultado
de cálculo atrasado pode resultar em uma falha em manter o controle do
carro.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 6/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Podemos dizer que para cada sistema embarcado existe uma visão conceitual
ou modelo de controle do sistema, ou seja, uma abstração da funcionalidade do
sistema que consiste em um conjunto de objetos e interações entre eles. A
seguir apresentamos dois modelos de controle de sistema:

Baseado em máquina de Conceitual algorítmico


estados
No modelo de controle
No modelo de controle conceitual algorítmico, um
baseado em máquina de conjunto de instruções (os
estados, os objetos são o objetos) é executado sob
conjunto de estados, close uma sequência de controle
enquanto as interações (as interações), que usa
entre eles são ramificações e construções
representadas pelas em estruturas de repetição.
transições na máquina de
estados.

O modelo de controle conceitual algorítmico é o mais utilizado em sistemas


embarcados, em que um software (mais conhecido como firmware) é executado
em um processador e, em geral, integrado em um microcontrolador.
Exploraremos, neste conteúdo, a programação desse microcontrolador em
linguagem C.

Apesar de menos utilizado nos projetos de sistemas embarcados, o modelo de


controle baseado em máquina de estados é muito importante quando o foco é o

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 7/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

alto desempenho do sistema. Nesse caso, estamos falando da criação de um


controle baseado em hardware digital, sem software embarcado, com alto
desempenho e confiabilidade para soluções que visam expandir ou
complementar o uso dos microcontroladores. Uma das soluções mais usadas
hoje em dia para esse fim é o uso de dispositivos FPGA.

FPGA
Um FPGA (Field Programmable Gate Array) ou “arranjo de portas programáveis em
campo” é um circuito integrado que pode ser configurado por um projetista após a
fabricação (programável em campo). Sua configuração é especificada usando uma
linguagem de descrição de hardware (HDL). Eles contêm blocos lógicos
programáveis (como AND e OR) e uma hierarquia de interconexões reconfiguráveis
que conectam os blocos. Esses blocos também podem conter elementos de
memória, como flip-flops.

Características dos sistemas embarcados


baseados em microcontroladores
A principal característica adicional dos sistemas embarcados baseados em
microcontroladores é a separação em hardware e software, que podem variar em
complexidade e número de funções.

Microprocessadores e
microcontroladores surgiram mais ou
menos na mesma época. Entre 1970 e
1971, quando a Intel estava

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 8/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

trabalhando na invenção do primeiro


microprocessador do mundo, a Texas
Instruments desenvolvia um conceito
bastante semelhante e inventou o
microcontrolador, um único chip de
circuito integrado que poderia conter
quase todos os circuitos essenciais
para formar uma calculadora; apenas
Primeiro microcontrolador desenvolvido pela
Texas.
o mostrador e o teclado não foram
incorporados. O microcontrolador
desenvolvido na Texas Instruments
(TMS1000) foi usado internamente em
seus produtos de calculadora entre
1972 e 1974. Em 1983, quase 100
milhões de TMS1000 já tinham sido
vendidos.

Mesmo que os microprocessadores representassem uma grande melhoria em


relação aos grandes circuitos digitais que substituíram, eles não eram uma
solução mágica completa para reduzir os custos e a complexidade dos projetos.
O problema era que, para fazer um microprocessador fazer algo útil, ele
precisava ser cercado por muitos chips adicionais para entrada e saída (E/S) e
geralmente precisava de outros chips de suporte também, como chips de relógio
em tempo real e decodificadores de endereços.

Os sistemas baseados em microprocessador, como o mostrado na imagem a


seguir, são sistemas de uso geral que podem ser programados e reprogramados
dependendo da tarefa ou do aplicativo; normalmente os chamamos de
computadores.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 9/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Sistema baseado em microprocessador.

Atenção
O computador pessoal destaca-se como uma das aplicações mais importantes e
úteis dos sistemas baseados em microprocessadores.

Na década de 1990, as técnicas aprimoradas de processamento de silício e


fabricação de chips resultaram na capacidade de colocar cada vez mais
circuitos em um chip. Uma das maneiras pelas quais isso foi usado foi para
aumentar o chip do microprocessador com funções e recursos adicionais que
foram previamente implementados por chips externos separados, criando
famílias de microcontroladores. O sistema baseado em microcontrolador,
mostrado na imagem a seguir, é o clássico sistema embarcado com as
características de sistema de função única, fortemente restrito às métricas de
projeto e com resposta em tempo real.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 10/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados
Sistema baseado em microcontrolador.

Arquitetura básica dos microcontroladores

Os microcontroladores são frequentemente descritos como computadores de


chip único. Isso porque já têm todos os componentes que permitem operá-lo
sozinho, em particular para tarefas de monitoramento e/ou controle. Como
mostrado na imagem anterior, eles contêm um núcleo de processamento,
memórias e vários dispositivos periféricos, como portas de E/S paralelas,
temporizadores e vários outros subsistemas de funções especiais. Veremos
mais detalhes dos componentes a seguir.

CPU
É a unidade central de
processamento, responsável por
executar o programa armazenado e
gerenciar os periféricos. Ela busca
instruções na memória, os códigos de
operação (opcodes), uma por uma, as
interpreta e executa alguma operação
para obter o resultado. Os programas
Unidade central de processamento.
consistem em uma coleção desses
opcodes misturados com dados
numéricos.

Os opcodes são o resultado da


compilação dos programas escritos

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 11/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

em uma linguagem de programação,


como a linguagem de montagem ou a
linguagem C. A CPU funciona
sequencialmente por meio dessas
instruções, às vezes, com saltos de
uma posição para outra da memória
como resultado do algoritmo descrito
no programa ou como resultado das
condições operacionais.

A seguir, temos alguns dos componentes que integram a CPU:

Registradores expand_more

A CPU possui registradores que funcionam como áreas de


armazenamento da memória interna e são úteis para resultados de
cálculos provisórios. Isso reduz o número de leituras/gravações na
memória externa, que geralmente é mais lenta. Alguns registradores têm
funções especiais, como controlar onde a próxima instrução deve vir da
memória.

ALU expand_more

Também interna à CPU, a unidade lógica aritmética (ALU) é responsável


por realizar os cálculos. Em algumas CPUs são bastante simples, com
suporte apenas para adicionar, subtrair e operações lógicas básicas. Em

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 12/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

CPUs mais sofisticadas pode haver várias unidades aritméticas, algumas


capazes de realizar operações avançadas de ponto flutuante.

Decodificador expand_more

O decodificador de instruções é usado para traduzir os opcodes em


sequências de ações.

Barramento de dados expand_more

Trata-se de uma coleção de fios ou trilhas usada para transportar


números para dentro e para fora da CPU. Qualquer dispositivo com o qual
a CPU precisa se comunicar está conectado (em paralelo com outros) ao
barramento de dados.

Barramento de endereços expand_more

Tem por objetivo selecionar qual dos dispositivos externos (ou locais de
memória) tem permissão para usar o barramento de dados. Lembre-se
de que cada fio do barramento de dados é apenas uma condução
simples e só é capaz de transmitir um bit de dados por vez. Se, por
exemplo, dois dispositivos tentarem gravar no barramento de dados ao
mesmo tempo, seus sinais ficarão confusos e perdidos. Em sistemas
simples, a CPU sozinha controla o barramento de endereço.
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 13/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Memórias
Podemos dividir as memórias em dois tipos:

RAM (memória de acesso aleatório) ROM (memória somente lei


close
Usada para armazenar valores que podem mudar É usada para armazename
durante a execução de um programa, como os longo prazo, pois não perd
relacionados às variáveis de um programa. Esse a alimentação é removida
tipo de memória é volátil, ou seja, o seu conteúdo é geralmente utilizado par
é perdido toda vez que os sistemas são programas, mas não variá
desligados. Como resultado disso, a RAM não é Existem diferentes tecnolo
útil para armazenamento de programas de longo implementar memória de
prazo. EPROM, EEPROM e memó

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 14/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

E/S digital paralela


Microcontroladores enviam e recebem
dados para o mundo exterior por meio
de portas. A porta de entrada e saída
(E/S) paralela é a de utilização mais
simples. Essas portas podem ser
vistas como registradores que são
conectados ao núcleo da CPU, usando
o barramento de dados e, ao mesmo
Porta LPT.
tempo, ao mundo externo, por meio de
pinos do microcontrolador.

No caso de portas paralelas, cada bit


no registrador da porta é conectado a
um pino no chip. Se um bit está em
nível lógico alto, o pino é acionado
para qualquer tensão que represente a
lógica '1' para aquele sistema
(geralmente 5 Volts ou 3,3 Volts). Da
mesma forma, bits na lógica '0'
conduzem 0 Volts no pino apropriado.
As portas LPT são exemplos de E/S
paralela.

E/S serial
As comunicações seriais exigem que
o remetente envie dados de 1 bit por

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 15/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

vez, a uma taxa acordada com o


receptor. O receptor verifica a tensão
que chega do emissor no meio de
cada intervalo de tempo de bit. Ele
pode, portanto, decidir se um '1' ou '0'
foi enviado para um determinado bit.
RS232, USB e Ethernet são exemplos
de transmissão serial.
Transmissão via USB.

Saiba mais
A transmissão de dados seriais é mais barata do que a transmissão paralela,
pois há menos condutores envolvidos.

Temporizadores e contadores

Os temporizadores são normalmente construídos usando uma fonte de clock e


um registrador específico com função de contador. Os contadores contam os
períodos de clock que são inseridos neles, mas têm um número de bits limitado
e, como resultado, só podem contar para cima ou para baixo até esse limite sem
reiniciar a contagem.

Exemplo
Um contador de 8 bits pode contar apenas até 255 decimais; com mais uma
entrada de período ele transborda e reverte seu valor para zero.

ADCs e DACs
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 16/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

É comum que os sistemas embarcados sejam usados para processar sinais


analógicos, que se alteram em valores contínuos de tensão. Para que eles façam
isso, é necessário um dispositivo especial denominado conversor analógico
para digital (ADC). Microcontroladores atuais, em sua maioria, possuem ADCs
integrados ao chip.

O ADC aceita uma entrada analógica e a traduz em um número digital cujo


tamanho é proporcional à magnitude do sinal analógico. Cada conversor
analógico para digital tem uma faixa de tensão de entrada associada e uma faixa
numérica de saída.

Exemplo
Consideremos um ADC de 10 bits que opera com faixa do sinal de entrada de 0 a
5V. O ADC, por comando da CPU, tira um instantâneo (amostra e espera) da
entrada analógica e, nesse caso, usa uma aproximação sucessiva para mapear
esse sinal para um número digital proporcional. O programa monitora o estado
do sinal de “conversão concluída” em um bit de um registrador específico.
Quando a conversão é concluída, o resultado de 10 bits convertido pode ser lido
em um registrador.

A imagem a seguir ilustra a conversão de valores de um sinal contínuo (as


curvas em vermelho) para valores discretos (em azul) no caso de dados digitais
representados com 2 e 3 bits.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 17/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados
Representação de sinal contínuo em valores discretos com 2 e 3 bits.

Na imagem observamos que o aumento no número de bits implica no aumento


no número de valores específicos na representação digital. Esse aumento no
número de bits permite, portanto, o aumento na resolução da representação
binária do valor de entrada.

Exemplo
Para um ADC de 10 bits, a representação do sinal de entrada terá 1024 (210)
valores discretos. Se esse ADC trabalha com uma tensão de referência de 5V, a
resolução que ele possui é de 5/1024, aproximadamente 4,88mV (10(−3)V ). Ou
seja, os valores binários resultantes da conversão do ADC representam múltiplos
de 4,88mV. Dessa forma, quanto maior o número de bits de um ADC, maior é a
resolução da representação binária do valor de entrada e mais fiel é a
representação digital do valor contínuo de entrada.

Os conversores digitais para analógico (DACs) executam o inverso dos ADCs.


Eles aceitam um sinal de entrada digital e emitem um sinal analógico
proporcional, permitindo a atuação para controlar um componente externo com
tensão contínua. Historicamente, os DACs raramente foram encontrados
integrados a microcontroladores por motivos de fabricação. Se uma saída
analógica for necessária para um microcontrolador sem um DAC interno, um
circuito DAC externo deve ser adicionado. Alternativamente, pode ser possível
gerar uma saída que simula uma saída analógica controlando o ciclo de trabalho
de um pino da porta digital de saída.

Por exemplo, se um pino de saída digital gasta metade de seu tempo em 5V e o


resto em 0V, sua tensão média é 2,5V. Variando a porcentagem de tempo em
nível alto, a tensão média de saída pode ser controlada. Isso é conhecido como

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 18/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

modulação por largura de pulso (PWM). A saída pulsada pode ser filtrada para
criar um sinal analógico contínuo.

Controle de interrupções
As interrupções são sinais que fazem
com que a CPU suspenda sua
atividade atual e execute alguma outra
tarefa. Os sinais de interrupção são
produzidos por dispositivos de
hardware que requerem atenção
urgente. O modem, a impressora, o
mouse e o teclado são exemplos de
O modem é um exemplo de dispositivo que pode
dispositivos que podem solicitar enviar uma solicitação de interrupção.
atenção urgente.

Veja alguns exemplos de atividade desempenhadas pelos controladores de


interrupções dos Microcontroladores:

portable_wifi_off code settings_input_hdmi


Contar pulsos Executar uma Receber dados
de entrada. determina por porta
função a cada serial.
intervalo de
tempo.
Interrupções permitem retirar alguns microcontroladores de um estado de baixo

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 19/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

consumo de energia, permitindo que este esteja sempre disponível, mesmo


mantendo boa parte de seus circuitos desligados.

Evolução nas características dos


sistemas embarcados
O projeto de sistemas embarcados tende a evoluir à medida que as empresas
estão sob pressão para inovar mais rápido, modernizando seus produtos para
dar lugar a novos sistemas fáceis de operar e conectados. Assim, o que antes
eram sistemas isolados, agora se tornam sistemas interligados a uma rede de
objetos físicos incorporados com componentes inteligentes, conectados a
outros dispositivos e sistemas pela internet, no que convencionou-se chamar de
Internet da Coisas (IoT).

Exemplo
Em um sistema automotivo, os sistemas de telemetria, frenagem e
conectividade podem trabalhar juntos para enviar dados do veículo ao fabricante,
ao proprietário da frota ou até mesmo a um sistema de direção autônomo. Esses
sistemas automotivos embarcados, agora conectados uns aos outros, precisam
de contramedidas de segurança maiores do que quando estavam isolados.
Como muitas das principais violações de dados recentes demonstraram, um
sistema pode fornecer aos hackers o caminho para ocasionar danos em larga
escala.

Os motivadores das mudanças no projeto de sistemas embarcados incluem


melhorias no hardware, bem como a evolução contínua nos métodos de

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 20/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

desenvolvimento de software, conforme descritos a seguir.

Hardware

É possível fazer mais com microcontroladores de alto desempenho e


mais periféricos integrados. Em vez de hospedar apenas uma aplicação,
novos sistemas de múltiplos núcleos em um chip ou de FPGAs
associados a núcleos de microcontroladores, chamados SoCs (System on
a Chip - Sistema em um chip), podem oferecer suporte a várias aplicações
em uma única plataforma de hardware, mantendo ainda os requisitos de
energia e custo.

Software

Os avanços nas técnicas de desenvolvimento de software apontam para


sistemas que são mais definidos por software e flexíveis do que seus
predecessores.

Como muitas mudanças se apresentam no mundo dos sistemas embarcados,


os requisitos essenciais não só permanecem, como também se tornam mais
exigentes. Os sistemas embarcados modernos incrementam a necessidade de
serem seguros, tolerantes a falhas, confiáveis e certificáveis.

Comentário
Todos esses requisitos tornam o domínio das ferramentas de programação para
sistemas embarcados algo essencial, incluindo os ambientes de programação
com a linguagem C, as técnicas para depuração de erros nos programas
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 21/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

embarcados e o uso de simuladores para otimizar recursos e tempo no


desenvolvimento com os dispositivos mais utilizados.

As características de um sistema
video_library embarcado
No vídeo a seguir, abordamos as características de um sistema embarcado,
apresentando sua evolução e os componentes que o integram.

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Um sistema embarcado para acionamento de airbags em automóveis foi


desenvolvido com microcontrolador. Considere as afirmações a seguir sobre

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 22/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

esse sistema.

I – É um sistema de função única.

II – É um sistema de tempo real.

III – É um sistema sem separação de hardware e software.

Quais as opções estão corretas?

A I e III.

B II e III.

C I e II.

D Somente a I.

E Somente a III.

Parabéns! A alternativa C está correta.

Os sistemas embarcados baseados em microcontroladores são os mais


conhecidos e os de maior aplicação. Classicamente, esses sistemas são de
função única, pois realizam repetidamente uma sequência de atividades que

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 23/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

não se alteram. Isso pode ser uma atividade de captura de dados de


sensores, como no caso de airbags. Na eventualidade de os sensores
indicarem uma alteração além de um limite preestabelecido, o sistema atua
de forma a acionar o airbag. Esses sistemas também são de tempo real, pois
é exigido que ele atue em intervalo de tempo bem definido e sem atrasos
para não comprometer a segurança que o sistema traz ao usuário. A única
afirmação incorreta é a que indica que esses sistemas não separam
hardware e software. O microcontrolador possui um software embarcado que
controla o hardware e necessita de um projeto em separado para realizar as
funções requeridas pelo sistema.

Questão 2

Avalie as asserções a seguir e a relação sugerida entre elas.

I. Microcontroladores e microprocessadores são usados de forma distinta


nos projetos de sistema embarcados

PORQUE

II. O microcontrolador possui funções e recursos internos ao chip que nos


microprocessadores estão disponíveis em chips externos, como memórias e
portas de entrada e saída.

A respeito dessas asserções, assinale a alternativa correta.

As asserções I e II são proposições verdadeiras e a II é uma


A
justificativa correta da I.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 24/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

As asserções I e II são proposições verdadeiras, mas a II não


B
é uma justificativa correta da I.

A asserção I é uma proposição verdadeira, e a II é uma


C
proposição falsa.

A asserção I é uma proposição falsa, e a II é uma proposição


D
verdadeira.

E As asserções I e II são proposições falsas.

Parabéns! A alternativa A está correta.

Nos projetos de arquiteturas de microcontroladores, os fabricantes buscaram


integrar vários componentes necessários em sistemas computacionais
embarcados, como a memórias, portas de E/S e de comunicação, entre
outros componentes, com intuito de diminuir o custo por chip e o consumo
de energia. Com isso, os microcontroladores se tornaram dominantes em
sistemas embarcados. Os microprocessadores, embora possam ser usados
em sistemas embarcados, passaram a ser mais dedicados aos sistemas
computacionais, onde o poder de processamento é prioridade, como PCs e
servidores. Portanto, o uso dos microprocessadores em sistemas
embarcados é bem distinto do uso de microcontroladores.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 25/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

2 - Ferramentas integradas de desenvolvimento


Ao final deste módulo, você será capaz de avaliar as ferramentas integradas de desenvolvimento para
sistemas embarcados.

Uso de Ambiente de Desenvolvimento


Integrado (IDE)
Somente quem viveu na década de 1980, como estudante ou profissional na
área de programação, deve se lembrar que um desenvolvedor de software

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 26/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

escrevia um aplicativo em um editor de texto, salvava-o, saía do editor, escrevia


linhas de comando para executar o compilador, anotava as mensagens de erro
em um bloco de papel e, em seguida, rastreava o código em busca dos erros.
Talvez repetisse isso centenas de vezes antes de ter seu programa pronto para
ser usado.

No desenvolvimento moderno de software, os programadores possuem mais


recursos e ferramentas do que simplesmente o que temos no processo de
compilação. Agora, podemos trabalhar em um ambiente de desenvolvimento que
chamamos de IDE, que significa Ambiente de Desenvolvimento Integrado
(Integrated Development Environment).

Componentes e benefícios do IDE


Em 1983, uma empresa chamada
Borland adquiriu um compilador de
linguagem Pascal e o lançou nos EUA
como TurboPascal, que apresentava
um editor e compilador integrados.
Isso foi muito útil, ter as mensagens
de erro do compilador ali mesmo no
editor em que você poderia clicar e ir
TurboPascal
para o erro.

Enquanto o TurboPascal lançou a ideia


de um ambiente de desenvolvimento
integrado, muitos acreditam que o
Visual Basic (VB) da Microsoft,
lançado em 1991, foi o primeiro IDE

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 27/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

real. O VB foi construído na linguagem


BASIC (linguagem de programação
popular dos anos 1980). Com o
surgimento do VB, a programação
pôde ser pensada em termos gráficos
e surgiram benefícios de produtividade
significativos.

Visual Basic.

Podemos definir IDE como um software para construir aplicativos que combina
ferramentas comuns de desenvolvedor em uma única interface gráfica de
usuário (GUI).

Um IDE normalmente é integrado pelas seguintes ferramentas:

Editor

Um editor de texto ajuda a escrever código de software com recursos,


como destaque de sintaxe com dicas visuais, preenchimento automático
específico de linguagem e verificação de bugs à medida que o código está
sendo escrito.

Compilador

O código-fonte é escrito em uma linguagem de programação de alto nível,


como a linguagem C. Um compilador é uma ferramenta para transformar

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 28/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

o código-fonte em um código de linguagem de máquina de baixo nível,


aquele que uma máquina pode entender.

Montador

Os montadores são semelhantes aos compiladores no sentido em que


produzem código executável. No entanto, os montadores são mais
simples, pois convertem apenas código de baixo nível (linguagem de
montagem ou assembly) em código de máquina. Uma vez que cada
linguagem assembly é projetada para um processador específico, a
montagem de um programa é realizada usando um mapeamento simples
um-para-um do código assembly para o código de máquina.

Depurador

Um programa para testar outros programas e que pode exibir


graficamente a localização de um bug (erro) no código original. Esta é
uma ferramenta crítica para teste. Precisamente, os depuradores
identificam as linhas em que os problemas são encontrados, para que os
programadores possam resolvê-los rapidamente.

Bibliotecas
Outro conceito indispensável quando falamos dos elementos que formam um
IDE é o das bibliotecas. Embora não sejam uma ferramenta que se integra em

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 29/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

um IDE, bibliotecas constituem-se em um recurso muito importante,


principalmente em se tratando de IDEs para sistemas embarcados. Para um
desenvolvedor de software, a ideia de uma biblioteca é bastante simples: é um
arquivo contendo um número (normalmente grande) de funções/
procedimentos/sub-rotinas em um formato especial. Isso significa que o
programador precisa apenas fazer referência às funções comumente usadas e
seu código é “puxado” automaticamente.

Saiba mais
Como acontece com a maioria dos aspectos da programação embarcada, as
bibliotecas apresentam mais desafios e opções para os desenvolvedores. O fato
de cada sistema embarcado ser diferente é frequentemente citado como uma
razão para grande parte da complexidade do desenvolvimento de software
embarcado. O uso de bibliotecas reflete isso. Além de obter uma biblioteca certa
para a família de dispositivos alvo e o compilador escolhido, pode haver uma
ampla seleção de outras variações: especificações de membros da família de
chips, endereçamento relativo de registro, otimização de tamanho/velocidade,
dentre outras.

Benefícios dos IDEs


O objetivo geral e o principal benefício de um ambiente de desenvolvimento
integrado é o aumento da produtividade do desenvolvedor, que pode ser
alcançado por:

settings_applications pending_actions
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 30/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Configuração mais Tarefas de


rápida desenvolvimento mais
Sem uma interface IDE, os
rápidas
desenvolvedores precisariam gastar A integração mais estreita de todas as
tempo configurando várias tarefas de desenvolvimento melhora a
ferramentas. Com a integração de produtividade do desenvolvedor. Por
ferramentas de um IDE, os exemplo, o código e a sintaxe podem
desenvolvedores têm o mesmo ser verificados durante a edição,
conjunto de recursos em um só lugar, fornecendo retorno instantâneo
sem a necessidade de trocar de quando erros são inseridos, sem
ferramenta constantemente. precisar alternar entre os aplicativos
para concluir as tarefas.

school pattern
Aprendizagem contínua Padronização
Manter-se atualizado e informado é O IDE padroniza o processo de
outro benefício. Por exemplo, os desenvolvimento, o que ajuda os
tópicos de ajuda do IDE são desenvolvedores a trabalharem juntos
constantemente atualizados, bem com mais facilidade e ajuda os novos
como novos exemplos, modelos de contratados a trabalhar mais
projeto etc. rapidamente.

IDEs para sistemas embarcados


https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 31/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Como existe um número enorme de


opções, não há como dizer qual
ferramenta você deve escolher para
criar software embarcado. Podemos
dizer que tudo depende das
habilidades e preferências do
programador, bem como das
necessidades do projeto. A seleção do
IDE.
microcontrolador para o projeto limita
as escolhas entre alguns IDEs que
estejam disponíveis para a família e
modelo escolhidos.

Atenção

É importante certificar-se de que todas as ferramentas necessárias estão


disponíveis para o modelo de microcontrolador selecionado para o projeto,
incluindo o compilador que se integra ao IDE escolhido.

Vários IDEs para microcontroladores podem incorporar mais de um compilador e


montador, que deve ser escolhido pelo programador quando monta o projeto.
Também existem fabricantes de IDEs que desenvolvem versões dos seus
produtos para várias famílias de microcontroladores. Alguns IDEs são
completamente gratuitos, enquanto outros são gratuitos para teste ou até um
tamanho limitado de código. A seguir, conheça alguns dos fabricantes e seus
IDEs.

Keil expand_more

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 32/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

A Keil é uma empresa fundada em 1982 para comercializar produtos e


ferramentas de desenvolvimento para microcontroladores. A Keil
implementou o primeiro compilador C projetado especificamente para o
microcontrolador 8051. Hoje a Keil fornece uma ampla gama de
ferramentas de desenvolvimento como compilador ANSI C, montadores
(assemblers), depuradores e simuladores, gerenciadores de biblioteca e
sistemas operacionais em tempo real que se integram em seus IDEs. O
MDK Keil possui versões para as famílias 8051, 251, ARM e XC16x / C16x
/ ST10, totalizando mais de 8500 modelos de dispositivos. Existem
versões gratuitas com limite de tamanho de código em 32 kBytes.

IAR expand_more

A IAR Systems desenvolve compiladores e depuradores C e C++ para


microcontroladores de 8, 16 e 32 bits. Embedded Workbench é seu
ambiente de desenvolvimento, que na versão mais recente do IAR
Embedded Workbench oferece suporte a núcleos de 64 bits dos
microcontroladores de núcleo Arm. Possui suporte para 14.000
dispositivos de 30 famílias diferentes de microcontroladores, incluindo
8051, ARM, AVR, AVR32, MSP430, H8, R8C, STM8 e V850. Também
possui versões gratuitas com limite de tamanho de código, ou versões
completas funcionais por 30 dias.

Code Composer Studio expand_more

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 33/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Code Composer Studio é o IDE da Texas Instruments para seus


processadores embarcados, incluindo o TMS320 DSP OMAP e DaVinci
system-on-chip, microcontroladores Hercules e microcontroladores
MSP430 e MSP432. Combinando as vantagens da estrutura do software
Eclipse, ele compreende um conjunto de ferramentas para desenvolver e
depurar aplicativos integrados.

MPLAB X IDE expand_more

A Microchip oferece o MPLAB X IDE, uma interface gráfica de usuário


(GUI) completa, que usa C e C++. Pode ser baixado gratuitamente junto
com os compiladores padrão da série XC C, como XC8, XC16, XC32 e
XC32/32++, compatíveis os microcontroladores PIC de 8, 16 e 32 bits,
respectivamente, além de controladores de sinal digital (dsPIC). Inclui um
editor, gerenciador de projeto, além de suportar ferramentas de hardware
populares da Microchip, como depuradores em circuito e programadores
de chip. Baseado na plataforma NetBeans de código aberto, o MPLAB X
IDE pode ser executado em Windows, MAC e Linux. O MPLAB inclui um
montador para PIC, em que a linguagem de montagem pode ser usada
para programar os microcontroladores PIC. Muitos compiladores C estão
disponíveis para programar os microcontroladores PIC (além do gratuito
XC C) como o MikroC e o CCS C. O CCS C foi um dos primeiros e é um
dos melhores compiladores para iniciantes, pois inclui muitas bibliotecas
integradas que permitem programar um microcontrolador PIC sem
profundo conhecimento de sua arquitetura. Portanto, ao iniciar um
projeto no MPLAB X IDE é preciso escolher o compilador C que precisa
ser instalado em separado ao MPLAB X IDE.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 34/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Arduino IDE expand_more

O Arduino IDE é muito leve e escrito em Java, desenvolvido para uso com
a popular série de plataformas Arduino. Os programas são escritos em
esboços, os sketches. Ele suporta C e C ++, e uma das maiores
vantagens desse IDE é a enorme quantidade de código-fonte aberto
disponível para todos pela grande comunidade, o que significa que alguns
pequenos projetos podem ser escritos em questão de minutos. O Arduino
IDE pode ser usado para desenvolver código para todos os
microcontroladores da série ATMEGA AVR, que compõem as placas da
plataforma Arduino. É muito importante observar que o IDE do Arduino
normalmente depende da programação dos microcontroladores por meio
da interface UART para um carregador de inicialização pré-carregado. É
possível programar esse bootloader usando uma variedade de
programadores. Diversos outros dispositivos possuem integração com o
Arduino IDE, incluindo os modelos ESP8266 e ESP32, muito utilizados em
aplicações de Internet da Coisas (IoT).

Microchip Studio expand_more

Microchip Studio é a plataforma de desenvolvimento integrada gratuita


da Microchip – que suporta a linha de produtos mais ampla da empresa
Atmel, adquirida pela Microchip, incluindo os produtos SMART ARM
(SAM), AVR e AVR32. Ele oferece importação perfeita de projetos do IDE
do Arduino. Também permite desenvolver código para todos os

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 35/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

microcontroladores da série ATMEGA AVR, que compõem as placas da


plataforma Arduino, com o benefício de permitir um controle muito maior
sobre o dispositivo, se necessário.

Ao examinar os vários ambientes de desenvolvimento, é importante observar


que o MDK Keil e o IAR Embedded Workbench oferecem a capacidade de
programar uma ampla variedade de microcontroladores de diferentes
fabricantes. Muitas empresas de desenvolvimento de sistemas embarcados
preferem usar ferramentas deste tipo, pois podem manter uma padronização de
projetos e bibliotecas com diferentes times de desenvolvimento dentro da
empresa. MPLAB X, Arduino IDE e Code Composer são amplamente suportados
e oferecem muitos exemplos de código para você começar, mas se concentrarão
apenas em seu próprio subconjunto de microcontroladores.

Passos para programar um dispositivo


usando IDEs
A seguir, vamos utilizar os microcontroladores PIC e a plataforma Arduino para
exemplificar o uso de IDEs para programar um dispositivo microcontrolador.

MPLAB X IDE para microcontroladores PIC


Siga os passos:

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 36/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

system_update_alt Instale o software

O primeiro passo é instalar o software MPLAB X IDE em seu


PC.

settings Configure o hardware

Configure a placa com microcontrolador PIC para ser


reconhecida pelo MPLAB. Algumas placas com
microcontrolador PIC podem ser reconhecidas diretamente
pelo MPLAB, mas isso não é uma regra. No caso mais geral,
ao final do processo, o arquivo compilado com extensão
.hex, gerado pelo MPLAB, é usado em um programador de
dispositivos específico para PIC.

system_update_alt Instale um compilador

Instale um dos compiladores disponíveis para MPLAB,


como os gratuitos da série XC C, MikroC ou CCS para
escolher na construção o projeto. Certifique-se de que o
MPLAB X IDE esteja apto a usar o compilador instalado,
selecionando Tools > Options > Embedded > Build Tools e
verificando seu compilador na lista.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 37/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

integration_instructions Inicie o MPLAB X IDE e crie um projeto ou abra um


já existente

O projeto será construído para criar um arquivo HEX, que


será programado em seu dispositivo. Para criar um projeto
no MPLAB X IDE selecione Arquivo > Novo projeto e
configure um projeto MPLAB X IDE, seguindo as etapas no
assistente de projeto. As escolhas incluem o modelo de
microcontrolador usado e o compilador escolhido. Depois
de concluído, a árvore do projeto será aberta na janela
Projetos. Selecione Arquivo > Novo arquivo para abrir um
modelo de arquivo no qual inserir seu código. Ou você pode
importar o código existente para o projeto clicando com o
botão direito na pasta Arquivos de código-fonte da árvore do
projeto e selecionando Adicionar item existente. Para abrir
um projeto existente, selecione Arquivo > Abrir projeto,
navegue até seu projeto e clique em Abrir projeto.

note_add Gere um arquivo hexadecimal

Para construir o projeto e gerar um arquivo HEX, clique com


o botão direito no nome do projeto na janela Projetos e
selecione Construir (Build) no menu suspenso. Se você tiver
erros de compilação, verifique a configuração do projeto e

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html#
i bl i li d ódi E tã 38/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados
quaisquer problemas sinalizados em seu código. Então,
construa-o novamente.

video_settings Insira e programe o dispositivo

Caso a placa seja reconhecida pelo MPLAB, na barra de


ferramentas MPLAB X IDE clique no ícone Executar (Run). O
projeto será construído e o dispositivo será programado. O
programa começará a ser executado imediatamente após a
conclusão da programação.

IDE para Arduino


Siga os passos:

devices_other Separe os equipamentos

Primeiro, você deve ter sua placa Arduino e um cabo USB.


Caso você use Arduino UNO, você precisará de um cabo
USB padrão (plugue A para plugue B), do tipo que é usado
para conectar uma impressora USB.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 39/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

file_download Baixe o software Arduino IDE

Você pode obter diferentes versões do Arduino IDE na


página de download no site oficial do Arduino. Você deve
selecionar seu software, que é compatível com seu sistema
operacional (Windows, MacOS ou Linux). Após a conclusão
do download do arquivo, descompacte o arquivo.

power_settings_new Ligue sua placa

O Arduino Uno extrai energia automaticamente de qualquer


uma das conexões USB para o computador ou de uma fonte
de alimentação externa. Conecte a placa Arduino ao seu
computador usando o cabo USB. O LED verde de
alimentação (identificado como PWR) deve acender.

open_in_browser Inicie o Arduino IDE

Clique duas vezes no ícone do aplicativo, com um logo


infinito e nome arduino, para iniciar o IDE.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 40/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

note_add Abra seu primeiro projeto

Depois que o software é iniciado, você pode criar um novo


projeto selecionando Arquivo > Novo, ou abrir um exemplo
de projeto existente selecionando Arquivo > Exemplo >
Básico > Piscar. Ele liga e desliga o LED com algum atraso.
Você pode selecionar qualquer outro exemplo da lista.

domain_verification Selecione a sua placa Arduino

Para evitar qualquer erro ao enviar seu programa para a


placa, você deve selecionar o nome da placa Arduino
correta, que corresponde ao da placa conectada ao seu
computador. Vá para Ferramentas > Placas e selecione a
sua placa.

settings_input_hdmi Selecione a porta serial

Selecione a porta serial onde está conectada a placa


Arduino. Vá para o menu Ferramentas > Porta serial. É
provável que seja COM3 ou superior (COM1 e COM2 são
geralmente reservados para portas seriais de hardware).
Para descobrir, você pode desconectar sua placa Arduino e

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html#
bi t d d d d l 41/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados
reabrir o menu, a entrada que desaparece deve ser da placa
Arduino. Reconecte a placa e selecione essa porta serial.

file_upload Faça a transferência do programa para a sua placa

Agora, basta clicar no botão Upload do IDE, uma seta para a


direita. Aguarde alguns segundos; você verá os LEDs RX e
TX na placa piscando. Se o upload for bem-sucedido, a
mensagem Upload concluído aparecerá na barra de status.

video_library IDEs para sistemas embarcados


No vídeo a seguir, falamos sobre sobre IDE e as vantagens em empregá-lo no
desenvolvimento de um sistema embarcado.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 42/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Os ambientes de desenvolvimento integrados atuam consideravelmente no


aumento da produtividade do desenvolvedor. Considere os fatores citados a
seguir.

I. Configuração mais rápida das ferramentas.

II. Processo de desenvolvimento sem padronização.

III. Troca constante de ferramentas.

Qual ou quais dos fatores citados são características dos IDEs que atuam no
aumento da produtividade?

A I e II.

B I e III.

C II e III.

D Somente a I.
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 43/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

E Somente a II.

Parabéns! A alternativa D está correta.

Um grande benefício dos IDEs é a possibilidade de ter várias ferramentas no


mesmo ambiente, dentro da mesma interface gráfica. Isso permite uma
configuração mais ágil de todas as ferramentas necessárias, incluindo o
editor de texto, compilador e ferramentas de depuração. Os erros são
encontrados de forma rápida sem a necessidade de trocar constantemente
entre ferramentas. Desse modo, o fator citado na opção III está errado. A
padronização também influi no aumento da produtividade, pois induz ao
trabalho em conjunto dos programadores. Logo, a falta de padronização,
citada na opção II, não é uma característica de uma IDE e não ajuda no
aumento de produtividade.

Questão 2

Quais dos IDEs a seguir criam versões para várias famílias de


microcontroladores de vários fabricantes?

A Arduino e MPLAB X IDE.

B Arduino e Code Composer Studio.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 44/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

C MPLAB X IDE e IAR.

D Keil e Code Composer Studio.

E Keil e IAR.

Parabéns! A alternativa E está correta.

Os primeiros desenvolvedores de IDEs eram independentes dos fabricantes


de microcontroladores e assim criavam seus produtos para os modelos mais
utilizados no mercado. Com o tempo, muitas famílias de microcontroladores
passaram a ser cobertas por esses pioneiros, que são desenvolvidos pela Keil
e pela IAR. A IDE Arduino vem atendendo também a outras famílias de
microcontroladores, além das placas da plataforma Arduino, como ESP8266
e ESP32. Code Composer Studio é exclusivo dos microcontroladores da
Texas Instruments, e MPLAB X IDE é exclusivo da família PIC de
microcontroladores.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 45/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

3 - Técnicas de identificação de erros


Ao final deste módulo, você será capaz de empregar técnicas para identificação de erros em códigos
de sistemas embarcados.

Testes com depuradores


O projeto de sistemas embarcados
combina as disciplinas altamente
técnicas de projeto de hardware,
desenvolvimento de firmware e
software aplicativo. Os projetistas
enfrentam desafios significativos em
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 46/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

todo o processo de desenvolvimento,


especialmente quando se trata de
integração e depuração de sistemas
de hardware e software.

Rastreando bugs.

Conforme um projeto de sistemas embarcados amadurece e cresce em


complexidade, torna-se cada vez mais difícil rastrear e isolar bugs no código.

Muitos recursos e tempo são gastos em cada projeto de depuração de código,


aumentando o orçamento dos projetos. Nesse sentido, é essencial investigar
técnicas tradicionais de depuração em tempo de execução, valorizar os
benefícios dos testes e verificar como os desenvolvedores podem implementar a
depuração de rastreamento em tempo real para descobrir e retificar bugs de
software, trazendo produtos ao mercado com mais rapidez e menos erros.

O que é um depurador
Os depuradores (debuggers) ajudam os programadores a avaliar e corrigir seus
programas. Vejamos algumas das características do funcionamento do
depurador.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 47/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Execução no processador de desenvolvimento expand_more

Em modo completo de funcionamento, eles são executados no


processador de desenvolvimento e suportam a execução do programa
passo a passo, executando uma instrução e, em seguida, parando,
prosseguindo para a próxima instrução quando instruído pelo usuário.

Pontos de interrupção expand_more

Eles permitem a execução até alcançar os pontos de interrupção


especificados pelo usuário, que são instruções que, quando encontradas,
fazem com que a execução do programa seja interrompida. Sempre que
o programa é interrompido, o usuário pode examinar os valores de vários
locais de memória e registradores.

Depuração em nível de origem expand_more

Um depurador de nível de origem permite a execução passo a passo na


linguagem do programa de origem, seja a linguagem assembly ou uma
linguagem estruturada como C. Porém, nem sempre será possível ter
uma ferramenta completa dessa forma em sistemas embarcados. Além
de ter um IDE que permita essa funcionalidade, em geral só em versões
profissionais e pagas, é preciso que a placa contendo o dispositivo
microcontrolador também possua uma interface que permita esta
execução.
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 48/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Uma boa capacidade de depuração é crucial, pois os programas de hoje podem


ser bastante complexos e difíceis de escrever corretamente. Mas, a detecção de
erros em tempo de execução não é tão óbvia. Como a maioria dos sistemas
embarcados não possui uma “tela” ou mostrador, não podemos encontrar os
erros em tempo de execução como no desenvolvimento de software em geral.
Por isso, examinar as técnicas de depuração em sistemas embarcados é
essencial.

Depurando em sistemas embarcados


Depurar em sistemas embarcados é um desafio para os desenvolvedores.
Muitos sistemas embarcados não são possíveis de depurar, a menos que
estejam operando em velocidade total. Consequentemente, a depuração de um
sistema embarcado usa um computador. O depurador pode existir como duas
partes, um núcleo de depuração no destino e um aplicativo no PC, em geral o
IDE, que se comunica com ele e gerencia o banco de dados de origem e as
tabelas de símbolos.
Existem dois requisitos para depurar um sistema
embarcado em tempo real. São eles:

settings_applications find_in_page
Controle de execução Análise em tempo real
É a capacidade de iniciar, parar, Segue o fluxo de código com o
verificar e atuar no microcontrolador e rastreamento das variáveis em tempo

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 49/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

na memória. real.

A ferramenta de depuração de nível de origem, como vimos, atende a esses


requisitos, permitindo percorrer o código, interrompê-lo e, em seguida, examinar
o conteúdo da memória e as variáveis do programa. É a primeira ferramenta,
fundamental para resolver um problema de erro em sistemas embarcados mais
complexos. Sem uma ferramenta desse tipo disponível, técnicas de depuração
tradicionais podem ser utilizadas.

Técnicas de depuração tradicionais

Método de impressão

A depuração por impressão é provavelmente a maneira mais simples e básica de


depurar um sistema embarcado. O método pode ser executado de duas
maneiras:

Usando instruções

O método é executado observando as instruções de impressão ao vivo


que são escritas à medida que o código é executado. Essa escrita pode
ser para uma porta serial do microcontrolador, por exemplo, capturando a
saída em um programa no computador. Para conseguir isso, o
desenvolvedor deve intercalar as instruções de impressão em todo o
código que será impresso, quando partes específicas do código forem
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 50/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

executadas, permitindo visualizar a execução de partes específicas do


código.

Usando LEDs

Outra forma para esse método é, por exemplo, com LEDs ligados às
portas para exibir a saída de estados, que podem ser usados para a saída
de depuração durante a fase de testes. Por meio deles, o desenvolvedor
visualiza o fluxo do programa, indicando se o programa atingiu, e em que
ordem, determinadas funções ou endereços de memória.

Embora o método de impressão possa fornecer transparência sobre o


comportamento do código, normalmente não é ideal para projetos mais
complexos. As instruções impressas podem confirmar que uma parte específica
do código foi executada, mas não fornecem uma visão completa do estado do
sistema, o que seria útil (e às vezes necessário) para rastrear erros mais
elusivos. Assim, embora o método de impressão seja útil para aplicações
simples e para desenvolvedores que não têm acesso a um ambiente de
depuração completo, uma solução mais robusta é necessária para atender às
necessidades de projetos de sistemas embarcados mais complexos.

Métodos de tempo de execução


O método de depuração por impressão é realmente apenas a versão mais
simples de uma técnica de depuração em tempo de execução. Os métodos de
depuração em tempo de execução compartilham uma característica comum:

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 51/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

eles monitoram a execução de um processo ou parte do código em tempo real,


enquanto o desenvolvedor usa técnicas manuais ou software para depurar o
processo. Há dois métodos de depuração em tempo de execução:

Depuração remota expand_more

É uma técnica de depuração em que o processo ou código que está


sendo depurado é executado em um ambiente separado do próprio
depurador. A depuração remota é útil para sistemas embarcados que não
possuem um sistema operacional completo implementado neles,
tornando mais fácil para o desenvolvedor implementar uma pequena
plataforma de depuração no software, o que facilita a depuração a partir
de um local remoto. Na depuração remota, o depurador se comunica com
o processo depurado em uma rede, em vez de iniciar ações diretamente
ou aguardar eventos.

Depuração baseada em comunicação expand_more

É uma técnica em que o depurador é conectado à comunicação entre


vários processos no sistema embarcado. Isso permite o monitoramento
eficaz de dados e mensagens que são passados entre os processos,
fornecendo ao depurador uma visão sobre a função do aplicativo. Um
desenvolvedor pode configurar um processo por meio do qual todas as
mensagens são enviadas e, em seguida, monitorar as mensagens sob
várias condições para garantir que todos os processos estejam se
comportando conforme o esperado.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 52/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Ferramentas tradicionais de depuração com


equipamentos
Há duas ferramentas de depuração tradicionais muito importantes em análises
de tempo real, são elas:

Analisadores lógicos Osciloscópios


Equipamento de laboratório Equipamento de laboratório para
projetado especialmente para depuração de hardware. É usado
solucionar problemas de hardware para examinar qualquer sinal
digital. Ele pode ter várias entradas elétrico, analógico ou digital, em
(até 100 pares), cada uma capaz qualquer peça de hardware.
de detectar se o sinal elétrico ao Osciloscópios são úteis para
qual está conectado está observar rapidamente a tensão em
atualmente no nível lógico 1 ou 0. um pino específico, na ausência de
um analisador lógico.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 53/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Depuração com emulador (In Circuit Emulator – ICE)

Emulação refere-se à capacidade de um programa de computador ou dispositivo


eletrônico de imitar outro programa ou dispositivo.

O emulador de circuito (ICE) toma o lugar do microcontrolador de destino. Ele


contém uma cópia do microcontrolador de destino, além de RAM, ROM e seu
próprio software embarcado. Mas por que usar um emulador? Veja a seguir:

Monitoramento do estado do microcontrolador expand_more

Permite que você examine o estado do microcontrolador enquanto o


programa está sendo executado, usando o depurador remoto para
interface humana e oferecendo suporte a pontos de interrupção de
software e hardware.

Rastreamento em tempo real expand_more

Ele armazena as informações sobre cada ciclo do microcontrolador que é


executado e permite que você veja em ordem como o software
embarcado é processado.

Flexibilidade no desenvolvimento de aplicativos expand_more

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 54/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Fornece maior flexibilidade e facilidade para desenvolver vários


aplicativos em um único sistema em vez de testar vários sistemas
direcionados. A desvantagem desse método é que ele é caro.

Além das vantagens mencionadas, vale destacar que um emulador de circuito


fornece muito mais funcionalidades do que um depurador remoto. Um ICE não
só fornece os recursos disponíveis com um depurador remoto, como também
permite:

Depurar o código de inicialização e programas em execução da ROM;


Definir pontos de interrupção para o código em execução da ROM;
Executar testes que requerem mais RAM do que o sistema contém;
Monitorar e controlar o estado do microcontrolador em tempo real, pois ele
tem sua própria cópia do microcontrolador de destino;
Oferecer suporte a pontos de interrupção de hardware e software, enquanto
que com um monitor de depuração só é possível definir pontos de interrupção de
software.
Atenção
Pontos de interrupção de hardware permitem que se interrompa a execução em
resposta a uma ampla variedade de eventos, não apenas buscas de instruções,
mas também interrupções, leituras e gravações de memória.

Teste de integração
O teste de integração, às vezes chamado de teste de integração de sistema,

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 55/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

descreve uma abordagem fundamentalmente diferente para testar e depurar


sistemas embarcados em todo o processo de desenvolvimento. Esse método
pega emprestado a sabedoria de métodos de trabalho de desenvolvimento de
software, como Agile e DevOps, que promovem testes periódicos em todo o
processo de desenvolvimento, em vez de um único processo de depuração
longo, nos estágios finais do desenvolvimento do produto. O teste de integração
funciona da seguinte forma:

check_circle_outline Teste de unidade

O teste de integração começa com o teste de unidade.


Antes que os módulos de código sejam integrados, eles
devem ser submetidos a testes de unidade isoladamente
para garantir que operem sem erros por conta própria. O
teste de unidade garante que cada componente de software
funcione conforme o esperado antes de ser integrado ao
todo.

grid_view Integração dos módulos

Depois que um módulo passa no teste de unidade, ele pode


ser integrado a outros módulos para começar a desenvolver
um sistema. Os desenvolvedores podem começar
combinando módulos de baixo nível que implementam uma
funcionalidade comum e estabelecendo casos de teste e
procedimentos para verificar seu funcionamento correto.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 56/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

format_list_bulleted Casos de teste

Os desenvolvedores devem escrever uma bateria de casos


de teste que serão usados para verificar se tudo está
funcionando corretamente. Quando dois ou mais módulos
são integrados com sucesso e passam em todos os testes
relevantes, os desenvolvedores podem continuar a
incorporar mais módulos, escrever novos casos de teste e
repetir o teste até que as partes finais do código sejam
adicionadas ao sistema.

A integração bem-sucedida significa que o software funcionou corretamente no


hardware de destino e que o desempenho do software foi esperado de acordo
com os requisitos especificados durante a fase do plano do projeto.

Existem várias maneiras que os desenvolvedores podem escolher para organizar


os testes de integração, mas os pontos mais importantes são:

check_circle_outline published_withe_chang
done_all
Teste de Casos de teste Testar, testar e
unidade sempre testar
primeiro Escrever casos de teste Testar o quanto antes e
para cada nova com frequência para
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 57/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Realizar testes de integração e certificar- evitar um processo de


unidade antes de se de que um módulo depuração demorado e
integrar o novo código recém-integrado esteja complicado no final do
para garantir que ele funcional antes de criar processo de
funcione corretamente. complexidade adicional. desenvolvimento.

Depuração por rastreamento em tempo


real
Uma técnica de depuração poderosa é conhecida como depuração por
rastreamento em tempo real, que funciona da seguinte maneira:

description manage_search

Registro das informações Identificação de anomalias

Com o rastreamento em Quando um desenvolvedor


tempo real, os percebe que um processo
desenvolvedores está se comportando de
implementam um maneira inesperada, a
dispositivo de hardware, depuração de rastreamento
como um analisador de em tempo real fornece uma
protocolo, que registra visão completa e total do
informações sobre a close funcionamento do processo
execução de processos no dentro do código. O

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 58/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

código. Essas informações desenvolvedor pode


podem incluir sequências produzir um log que indica
de valores de contadores de exatamente como o
programa, leituras e sistema mudou durante a
gravações de registradores, execução do processo,
alterações na memória do tornando significativamente
dispositivo e valores de mais fácil isolar, identificar e
dados associados. corrigir bugs de software.

A depuração de rastreamento em tempo real pode ser implementada em


qualquer estágio de desenvolvimento, como um complemento ao teste de
integração ou quando o software e o hardware do sistema embarcado estiverem
totalmente integrados. As informações de rastreamento também podem ser
capturadas de forma não intrusiva, o que significa que o tempo e o desempenho
do sistema não serão afetados pelo rastreamento. O rastreamento em tempo
real também permite que os desenvolvedores capturem, registrem e coletem
mais facilmente os resultados dos testes para análises futuras de bugs.

Depurando com simuladores


Simulador é um programa baseado em PC ou em nuvem que simula a
funcionalidade e o conjunto de instruções do microcontrolador alvo. Um
simulador pode ser muito valioso no estágio inicial de um projeto, quando ainda
não há nenhuma implementação de hardware real para os programadores
experimentarem. Soluções de depuração de código usando simuladores se
popularizaram nos últimos anos. Essas ferramentas têm se tornado bem fiéis ao

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 59/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

modelo físico das placas e permitem testes do código antes da aquisição,


diminuindo o tempo de desenvolvimento e os custos.

video_library As ferramentas de depuração


No vídeo a seguir, apresentamos os tipos de ferramentas de depuração.

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

Depuradores são ferramentas fornecidas pelos ambientes de


desenvolvimento integrados (IDEs), que permitem inspecionar e modificar o
estado de uma aplicação enquanto ela está sendo executada. Considere as
afirmações a seguir sobre os requisitos para depuradores em sistemas
embarcados.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 60/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

I – O rastreamento das variáveis em tempo real é um requisito.

II – Interromper a execução do código é um requisito.

III – Recompilar o código é um requisito.

A I e III.

B II e III.

C I e II.

D Somente a II.

E Somente a I.

Parabéns! A alternativa C está correta.

A análise em tempo real do código em um sistema embarcado é uma


condição necessária para um depurador ser utilizado em um IDE. Essa
análise implica em controlar a execução do código, interrompendo e
reiniciando a cada linha, a critério do programador. Cada vez que o código é
interrompido, os valores de variáveis, memória e registradores devem estar

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 61/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

acessíveis em tempo real. Porém, recompilar o código não é função nem


requisito de depuradores em um IDE.

Questão 2

O processo de depuração inclui historicamente perguntas que você faz para


verificar se o sistema está funcionando conforme o esperado. Uma pergunta
é: “Onde meu código está sendo executado agora?” Qual técnica de
depuração é utilizada para esse fim?

A Depuração com analisador lógico.

B Depuração por impressão.

C Depuração com emulador.

D Depuração remota.

E Teste de integração.

Parabéns! A alternativa B está correta.


https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 62/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Ao desenvolver programas para desktop, é muito comum "imprimir no


console" durante o desenvolvimento. No entanto, a maioria dos sistemas
embarcados não tem um "console" como um programa de desktop. Para
exibir um dado, indicando onde está o código, é comum usar uma porta serial
para imprimir texto e usar um adaptador USB para serial para ver essas
informações no computador. Outra forma é usar um LED para piscar ou
mesmo um pulso que possa ser lido por um analisador lógico. Essa técnica é
chamada de depuração por impressão.

4 - Testes para projeto de sistemas embarcados

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 63/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Ao final deste módulo, você será capaz de formular testes para projeto de sistemas embarcados sem
usar um destino físico.

Uso de simuladores
Uma maneira de lidar com os diversos desafios inerentes à dependência de
laboratórios físicos para desenvolvimento e teste de sistemas embarcados é
usar software para simular a funcionalidade do hardware e do sistema. Usar um
simulador de sistema embarcado permite que as equipes adotem uma
abordagem diferente e mais eficiente, separando o processo de desenvolvimento
de software da disponibilidade de hardware. Existem muitos simuladores para
diferentes famílias de microcontroladores, poucos acessíveis gratuitamente.
Veremos dois simuladores gratuitos:

Tinkercad PICSimLab
Para a plataforma Arduino. Para microcontroladores da linha PIC.

Simulador de circuitos Tinkercad


O Tinkercad é um programa de CAD gratuito e intuitivo, baseado na web, que
pode ser usado gratuitamente. O módulo de simulação de circuitos eletrônicos
trouxe um lado totalmente novo para o Tinkercad, girando em torno da
simulação de circuitos eletrônicos com a placa Arduino Uno e possuindo

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 64/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

possibilidades para teste de sensores e atuadores externos à placa. A seguir,


veremos como montar o Arduino no Tinkercad.

Montagem
Para realizar uma montagem com Arduino no Tinkercad, ache a placa Arduino
Uno e coloque na área central da página.

Os orifícios ao longo de ambos os


lados da placa são os pinos de
Entrada/Saída. Cada um é um
conector que pode ser ligado a uma
protoboard ou diretamente a algum
componente com um fio. A maioria
deles está marcada com um número,
que são usados para identificar os
Ligação de LED no Arduino Uno na plataforma
pinos no código que escrevemos. Para Tinkercad.
controlar um LED no pino 13, por
exemplo, podemos ligá-lo à placa,
conforme a imagem.

No painel de componentes dos circuitos do Tinkercad, à direita da tela, arraste


um resistor e um LED para o plano de trabalho. As pernas do LED são
conectadas a dois pinos no Arduino:

power power
Terra Pino 13
https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 65/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Atenção
O componente entre o LED e o pino 13 é um resistor, que ajuda a limitar a
corrente para evitar que o LED se queime. Sem ele, você receberá um aviso de
que o LED poderá queimar em breve. As listras coloridas identificam o valor do
resistor e, para este circuito, qualquer valor de 100 ohms a 1000 ohms
funcionará corretamente.

O LED é um diodo emissor de luz (Light Emitting Diode) que possui conexões
que o tornam diferente de uma lâmpada normal. Um LED tem uma conexão
chamada catodo e outra chamada de anodo. O anodo é maior do que o catodo.
Essa distinção é importante porque o anodo deve ser conectado à extremidade
positiva de um circuito elétrico. A corrente flui em apenas uma direção através
de um LED.

Tendo uma placa programável no plano de trabalho do Tinkercad, como a placa


Arduino Uno, habilita-se a opção CÓDIGO (CODE) no menu superior direito.
Clicando nesse botão, você pode editar o seu código em modo de blocos ou
texto. Escolhendo texto, você verá o código para piscar o LED no pino 13, como
mostrado a seguir.

Arduino No Tinkercad
content_copy

1
2 void setup()
3 {
4 pinMode(13, OUTPUT); // Configura o pino 13 como saída
5 }
6 void loop()
7 {
8 digitalWrite(13, HIGH); // Configura o pino 13 com

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 66/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

9 delay(1000); // Espera 1000 ms (1 s


10 digitalWrite(13, LOW); // Configura o pino 13
11 delay(1000); // Espera 1000 ms (1 segun
12 }

Código inicial para Arduino no Tinkercad.

Veja que no ambiente de programação, um programa (chamado de sketch)


apresenta duas funções básicas:

setup()

A função setup() é chamada quando um programa começa a executar. É


usada para inicializar as variáveis, os tipos dos pinos, declarar o uso de
bibliotecas, entre outros. Essa função será executada apenas uma vez
após a placa Arduino ser ligada ou reiniciada.

loop()

Após a função setup(), a função loop() executa sempre o mesmo bloco de


código, continuamente em um loop infinito, permitindo ao programa fazer
mudanças e responder às interações com o exterior da placa.

No Arduino Uno, os 14 pinos digitais podem ser utilizados como uma entrada ou

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 67/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

uma saída, utilizando-se as seguintes funções:

pinMode digitalWrite digitalRead


Para estabelecer o pino Para escrever no pino. Para ler do pino.
como entrada ou saída.

Os pinos operam a 5V. Há um LED integrado ao pino digital 13. Quando esse pino
está no valor HIGH, o LED está aceso, quando o pino está em LOW, o LED está
apagado. Clicando em Iniciar Simulação, será possível observar os dois LEDs, o
da placa e o ligado externamente, piscando em intervalos de um segundo.

Componentes para montagens de circuitos no


Tinkercad
Os componentes são normalmente montados usando uma placa de ensaio ou
protoboard. Encontre o componente protoboard e clique nele uma vez para
selecioná-lo e colocá-lo na área de trabalho. O protoboard pode parecer muito
pequeno ou muito grande na área de trabalho. Clique no zoom para que o
protoboard fique centralizado na tela.

Mova o ponteiro do mouse sobre um dos orifícios na parte central da placa. O


orifício será identificado em um quadrado vermelho com uma borda preta, como
visto na imagem a seguir. Os outros orifícios serão identificados com círculos
verdes. Esses círculos verdes indicam que cada orifício na linha está conectado
a cada um dos outros orifícios na linha. Há uma ligação entre qualquer conexão
dentro da mesma linha.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 68/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Protoboard
Um protoboard é um pedaço de plástico que tem vários orifícios. Eles são usados
para conter diferentes componentes.O protoboard tem uma grade de trinta por dez
orifícios na área principal. As linhas são numeradas de 1 a 30 e as colunas são
rotuladas com as letras de A a J. As bordas da protoboard contêm duas colunas
com o mesmo número de linhas. Essas colunas possuem símbolos negativos e
positivos. Essas colunas e orifícios são usados para a fonte de energia. Os
componentes no centro do protoboard podem se ligar nessas colunas para receber
alimentação de energia.

Linhas de alimentação no protoboard na plataforma Tinkercad.

Além dos LEDs, os testes mais simples com circuitos no Tinkercad podem
utilizar:

Botões de pressão (pushbutton) expand_more

O pushbutton é um botão de pressão para conexão temporária. Clicar


com o botão do mouse sobre o pushbutton na ferramenta Tinkercad irá
simular o apertar do botão de pressão e o fechamento do circuito. O

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 69/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

botão tem um grande círculo no centro que é usado para fechar o


circuito. Existem quatro conectores no botão de pressão. Dentro do
botão, os conectores esquerdo e direito são dois fios ligados, um fio de
cada lado do botão. Portanto, é possível fazer a ligação para a conexão
temporária, usando os lados direito e esquerdo do pushbutton.

Potenciômetros expand_more

O potenciômetro é um dispositivo com três conectores e um botão que


gira. O botão é usado para variar a quantidade de tensão elétrica que flui
através do potenciômetro e é enviada para um circuito. Os
potenciômetros são usados como controles de volume em equipamentos
de áudio e geralmente não lidam com muita tensão. Dentro do
potenciômetro está um material resistivo, em que uma extremidade do
circuito é conectada. A quantidade de resistência muda quando o botão é
girado.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 70/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Simulador PICSimLab
O PICSimLab é um acrônimo de PIC Simulator Laboratory, um simulador
desenvolvido pelo professor Luis Claudio Gambôa Lopes, do CEFET/MG.
Inicialmente suportando apenas uma placa de desenvolvimento com o modelo
PIC16F628A, a versão atual pode simular 5 placas com vários periféricos e
vários microcontroladores PIC, como o PIC18F4550. Essa versão integra
também uma placa Arduino Uno.

Para gerar o arquivo executável em uma IDE para PIC, como a MPLAB X IDE,
precisamos usar um compilador integrado, que para PIC pode ser CCS C. A
escolha do compilador irá definir as bibliotecas de funções e diretivas para
configurar o microcontrolador PIC. Mesmo usando a mesma linguagem C,
diferentes compiladores usarão a sua própria biblioteca de funções e diretivas.
Portanto, é importante entender os passos para gerar um arquivo executável
para PIC com essas ferramentas.

Atenção

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 71/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

O PICSimLab não roda em página web e tem a vantagem de exigir o uso das
mesmas ferramentas profissionais que seriam usadas no desenvolvimento de
um projeto com microcontroladores PIC. Ele necessita ser carregado com o
mesmo arquivo executável com extensão .hex, que você usaria para carregar em
uma placa real com microcontrolador PIC. Desse modo, antes de usar o
simulador PICSimLab, você precisa programar o código em uma IDE para PIC,
usando um compilador profissional, como faria para desenvolver projetos para o
mercado.

Gerando código executável no MPLAB X IDE

Com os programas MPLAB X IDE e CCS C instalados, e com o CCS C disponível


como compilador ao MPLAB, os passos para geração de um executável para PIC
são os seguintes:

note_add Criar um projeto no MPLAB. Nas janelas que se abrem para


a seleção das configurações do projeto, escolher um nome
e o microcontrolador PIC16F628A. Deixar os demais valores
com o padrão, com exceção da janela onde se solicita a
escolha do compilador a ser usado, onde deve-se escolher o
CCS C.

drive_file_move Com o projeto criado, abre-se um conjunto de pastas na


lateral esquerda do ambiente MPLAB. Na pasta Source

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html#
Fil d i i f t j t 72/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados
Files, podemos criar arquivos-fonte para o nosso projeto.
Clicando com o botão direito nessa pasta, deve-se escolher
C Source File. Será solicitado um nome para esse arquivo,
que será o arquivo-fonte do projeto.

code Na área central do ambiente MPLAB abre-se o arquivo-fonte


que foi criado. Nele, podemos digitar o programa em
linguagem C que será executado no PICSimLab. Um
programa simples pode ser usado como teste.

A seguir, temos um exemplo de código simples que pode ser usado no último
passo:

Linguagem C
content_copy

1
2 #include <16F628A.h>
3 #fuses XT
4 #use delay( clock=4MHz )
5
6 void main () {
7 while (1) {
8 output_high(PIN_B0);
9 delay_ms(1000);

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 73/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

10 output_low(PIN_B0);
11 delay_ms(1000);
12 }
13 }

Programa teste.

Esse programa executa a tarefa clássica na iniciação de estudos com


microcontroladores, o piscar de um LED ligado a um pino, como fizemos no
Arduino com o simulador Tinkercad. O esquema mostrado na imagem a seguir
exemplifica as ligações esperadas por esse programa.

Esquema de ligação do circuito.

No esquema, além do LED ligado ao pino 6, temos o cristal oscilador (XT) que
será usado para sincronizar a execução do programa. Vamos examinar as
instruções do programa:

#include <16F628A.h> expand_more

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 74/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Definições do microcontrolador modelo PIC16F628A. Incluindo esse


arquivo, é possível usar as diretivas e funções que são descritas a seguir,
como #fuses, output_high e PIN_B0, escrevendo corretamente nos
registradores do microcontrolador.

#fuses XT expand_more

Os fuses são bits de configuração. No projeto de software embarcado,


existem algumas configurações para cada microcontrolador usado no
projeto, como o tipo de oscilador interno/externo, se será usado um
cronômetro de monitoramento ou não (watchdog), se haverá um pino de
reinicialização ou não, e assim por diante. Essas configurações são
controladas por meio de registradores específicos. Nesse exemplo, o
parâmetro XT determina que será usado um cristal externo para se
determinar o clock do programa, o valor do oscilador para o sincronismo
do programa. O valor dele está determinado na linha seguinte – #use
delay( clock=4MHz), onde se instrui o compilador a usar uma função
delay (atraso) com clock de 4MHz.

void main () expand_more

Função principal, existente em todo programa em C.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 75/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

while (1) expand_more

Repetição (loop) infinita. Essa estrutura é essencial para programas


embarcados em microcontroladores. Ela é usada para garantir que o
programa será executado de forma repetida, em loop infinito. A estrutura
while garante isso com o parâmetro (1) passado.

output_high(PIN_B0) e output_low(PIN_B0) expand_more

Respectivamente atribuem um valor lógico alto e baixo no pino de nome


RB0 (pino 6 da imagem anterior). No arquivo de definições 16F628A.h, o
valor PIN_BO é atribuído ao registrador que guarda o valor do pino de
nome RBO do PIC.

delay_ms(1000) expand_more

Estabelece um atraso na execução da próxima instrução, no caso no


valor de 1000ms (1 segundo). Isso permitirá o efeito de apagar e acender
o LED ligado ao pino RB0 com esse intervalo.

Clicando no botão para compilar no MPLAB, um arquivo com extensão .hex será
gerado, caso o compilador CCS C não detecte erros ou inconsistências no
programa. Esse arquivo pode ser usado para programar uma placa no simulador

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 76/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

PICSimLab. Podemos, então, abrir o simulador e no menu Board, escolher


McLab1, uma placa que trabalha com o microcontrolador PIC16F628A. Com a
placa selecionada, conforme a imagem a seguir, deve-se carregar o arquivo HEX
gerado no menu File -> Load HEX. Você verá o LED correspondente piscando e
poderá alterar o código no MPLAB, diminuindo o valor para a função delay_ms(),
por exemplo, recompilando o programa e recarregando o arquivo HEX no
PICSimLab.

Placa McLab1 do simulador PICSimLab.

A placa McLab1 é bem simples, possuindo dois displays de 7 segmentos, 8 leds,


uma lâmpada ligada à saída PWM e 4 pushbuttons. Não possui mostrador LCD
ou conversor analógico-digital (ADC). Para testar programas com esses
periféricos uma placa mais completa, chamada PICGenios, a placa 4 do
simulador, pode ser usada.

Com a PICGenios, vários testes podem ser realizados, utilizando sensores de


temperatura, ventoinha, buzzer, potenciômetros, além de mostrador LCD,
mostrador de 7 segmentos, 16 LEDS e 19 pushbuttons. A placa trabalha com
alguns modelos de microcontroladores PIC, entre eles, o PIC18F4550. A placa
PICGenios é mostrada na imagem a seguir.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 77/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Placa PICGenios do simulador PICSimLab.

O simulador PICSimLab está em frequente atualização, com novas placas


experimentais sendo adicionadas. Como possui código aberto, um grupo de
contribuidores pode acrescentar novas placas para facilitar o desenvolvimento
com microcontroladores, inclusive placas que não utilizam os
microcontroladores PIC. Mesmo assim, ele não possui as facilidades de integrar
dispositivos externos às placas (sensores e atuadores), como ocorre no
simulador do Tinkercad.

De modo geral, os simuladores para microcontroladores têm evoluído e se


tornado uma alternativa muito boa para realizar testes com circuitos. O
aparecimento de ferramentas gratuitas com boa qualidade, como a Tinkercad e
o PICSimLab, tende a incentivar que os próprios fabricantes empreendam
esforços para a implementação de novas ferramentas gratuitas de simulação.
Mas, no momento, a maioria dos simuladores para microcontroladores são
versões pagas, que dependem de licença, o que restringe seu uso ao ambiente
profissional.

video_library Simuladores para sistemas embarcados


https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 78/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Os simuladores PICSimLab e Tinkercad e a finalidade do uso de simuladores


para o desenvolvimento dos sistemas embarcados são apresentados no vídeo a
seguir.

Falta pouco para atingir seus objetivos.

Vamos praticar alguns conceitos?

Questão 1

O simulador para placas da família de microcontroladores PIC, o PICSimLab,


permite fazer testes, que depois podem ser usados em um projeto real. A
seguir, temos afirmações sobre esse simulador.

I – Permite simular o consumo da placa com microcontrolador PIC.

II – Permite simular o programa embarcado no microcontrolador PIC.

III – Permite simular o recebimento de dados pelo microcontrolador PIC.

IV – Permite simular sensores e atuadores externos à placa com


microcontrolador PIC.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 79/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Quais afirmações estão corretas?

A I, II e IV

B I, III e IV

C II e IV

D I, II e III

E II e III

Parabéns! A alternativa E está correta.

O simulador PICSimLab possui placas com microcontroladores da família PIC


e alguns periféricos, que dependem do modelo da placa. Assim, ele permite
simular o programa embarcado, que é um arquivo HEX, criado em um IDE
para PIC, além de permitir a simulação do recebimento e envio de dados para
os periféricos que estão na placa. Não há possibilidade de acrescentar outros
periféricos, sensores ou atuadores, externos à placa. Da mesma forma, ele
não permite simular o consumo de energia da placa.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 80/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Questão 2

Sabendo-se que a função de leitura no pino digital no ambiente Arduino


possui a sintaxe digitalRead(pino), em que pino é o número do pino digital
que se quer verificar o estado; sabendo-se também que essa função retorna
HIGH ou LOW para indicar o estado do pino, e que digitalWrite (pino, HIGH ou
LOW) realiza uma escrita de nível alto ou baixo no pino indicado, diga o que o
trecho de código a seguir realiza. Considere um LED ligado ao pino 13 e que
ele se acende com nível alto.

A Apaga o LED, se o estado do pino 2 é baixo.

B Pisca o LED por um segundo, se o estado do pino 2 é baixo.

C Apaga o LED, se o estado do pino 2 é alto.

D Acende o LED, se o estado do pino 13 é alto.

E Pisca o LED por um segundo, se o estado do pino 13 é alto.

Parabéns! A alternativa C está correta.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 81/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

O código verifica continuamente, em um loop infinito, se o pino 2 está em


nível baixo – if (digitalRead(2) == LOW). Caso esteja, ou seja, se a condição
testada na cláusula if é verdadeira, o programa escreve um nível alto no pino
13 – digitalWrite(13, HIGH) – acendendo o LED. Do contrário, ou seja, se o
estado do pino 2 é alto (condição dada pela cláusula else), o LED é apagado
– digitalWrite(13, LOW). Desse modo, a opção “Apaga o LED se o estado do
pino 2 é alto” é a correta.

Considerações finais
Verificamos as características mais importantes dos sistemas embarcados e as
ferramentas profissionais utilizadas para o desenvolvimento do software
embarcado em linguagem C, incluindo os ambientes integrados de programação
mais importantes, as técnicas de depuração de programas e os simuladores
mais conhecidos da plataforma Arduino e da família de microcontroladores PIC.

headset Podcast
Ouça o podcast sobre a importância da linguagem C para o desenvolvimento de

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 82/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

sistemas embarcados, as vantagens e desvantagens do seu emprego.

Referências
MONK, Simon. Programação com Arduino: Começando com Sketches. 1. ed.
Porto Alegre: Bookman, 2017.

OLIVEIRA, A. S.; ANDRADE, F. S. Sistemas Embarcados – Hardware e Firmware


na Prática. 1. ed. São Paulo: Érica, 2010.

PECKOL, J. K. Embedded Systems: A Contemporary Design Tool. 1. ed. Nova


Jersey, EUA: Wiley, 2019.

ZANCO, W. S. Microcontroladores PIC18 com Linguagem C – Uma Abordagem


Prática e Objetiva. São Paulo: Érica, 2010.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 83/84
14/11/22, 09:43 Linguagem C nos sistemas embarcados

Explore +
Veja a aplicação da linguagem C em um sistema embarcado com Arduino no
artigo Experimento de difração luminosa utilizando coleta de dados totalmente
automatizada por Arduino, de Tiago Destéffani Admiral, publicado na Revista
Brasileira de Ensino de Física, 2020.

Veja o desenvolvimento de um sistema embarcado baseado em PIC para busca


de pessoas no artigo Plataforma robótica para busca de pessoas em locais de
risco, de Edgar Natanael Gregorio e Ricardo Teixeira de Almeida, publicado na
Revista de Engenharia e Pesquisa Aplicada, 2017.

Veja a aplicação de simuladores via web no desenvolvimento de ensino remoto


no artigo Desenvolvimento de Laboratório Remoto Utilizando Módulo Didático
para Ensino de Microcontroladores, de Flávio Henrique Toribio Destro e Fabio
Iaione, publicado no Simpósio Brasileiro de Informática na Educação (SBIE),
2019.

https://stecine.azureedge.net/repositorio/00212ti/02574/index.html# 84/84

Você também pode gostar