Você está na página 1de 124

SISTEMAS EMBARCADOS PARA CONTROLE E

AUTOMAÇÃO
SISTEMAS EMBARCADOS

1 Introdução a Arquitetura ARM


1.1 Famílias ARM
1.2 Versões da CPU
1.3 Estados e os Registradores da CPU;
1.4 Modos de Processamento;
1.5 Organização e Alinhamento da Memória;
1.6 Principais Características das Instruções ARM e
1.7 Evolução da Tecnologia ARM.
2 Software de Programação
2.1 Criação e Gerenciamento de projetos;
2.2 Configuração do Linker;
2.3 Arquivo de Inicialização;
2.4 Simulação e Depuração de Programas
2.5 Sistemas Operacionais em Tempo Real: Características e Conceitos.
SISTEMAS EMBARCADOS

3 Placa de Desenvolvimento
3.1 Características Gerais;
3.2 Diagrama Esquemático
3.3 Conexões com Periféricos.

4 Configuração e Programação de Periféricos em Linguagem "C"


4.1 Controle de Interrupções;
4.2 Portas de E/S;
4.3 Sistema de Suporte à CPU;
4.4 RTC;
4.5 Timer;
4.6 UART;
4.7 SPI;
4.8 Conversor A/D;
4.9 Controlador de Memória FLASH (FPEC)
4.10 Interface USB.
SISTEMAS EMBARCADOS

Bibliografia Básica

PEREIRA, Fábio. Tecnologia ARM - Microcontroladores de 32 Bits. 1. ed. São Paulo: Editora Érica

RODRIGUES, Daniel. Microcontroladores ARM7 (Philips - família LPC213x) - O poder dos 32 Bits - Teoria
e Prática. 1. ed. São Paulo: Editora Érica

Bibliografia Complementar
1. MIZRAHI, Victorine. Treinamento em linguagem C. 2ª ed. São Paulo: Editora Pearson.
2. MIZRAHI, Victorine. Treinamento em Linguagem C++ módulo 1. 2ª ed. São Paulo: Editora Pearson.
3. MIZRAHI, Victorine. Treinamento em Linguagem C++ módulo 2. 2ª ed. São Paulo: Editora Pearson.
SISTEMAS EMBARCADOS

O processo de avaliação oficial será composto de três etapas, Avaliação 1 (AV1), Avaliação 2 (AV2) e
Avaliação 3 (AV3).

A AV1 contemplará o conteúdo da disciplina até a sua realização.


As AV2 e AV3 abrangerão todo o conteúdo da disciplina.

Para aprovação na disciplina o aluno deverá:


1. Atingir resultado igual ou superior a 6,0, calculado a partir da média aritmética entre os graus das
avaliações, sendo consideradas apenas as duas maiores notas obtidas dentre as três etapas de
avaliação (AV1, AV2 e AV3). A média aritmética obtida será o grau final do aluno na disciplina;
2. Obter grau igual ou superior a 4,0 em, pelo menos, duas das três avaliações;
3. Frequentar, no mínimo, 75% das aulas ministradas.
SISTEMAS EMBARCADOS
SISTEMAS ELETRÔNICOS EMBARCADOS

Sistemas eletrônicos embarcados (Embedded Electronics Systems) são


sistemas computacionais de uso específico, com seus recursos
computacionais como memória e poderde processamento projetados
restritamente para este propósitoespecial.

2
SISTEMAS ELETRÔNICOS EMBARCADOS

Computadores comuns são sistemasde uso geral

Um mesmo computador pessoal pode ser


usado para realizar tarefasdiversas

Sistemas Embarcados geralmente realizam uma únicatarefa

3
SISTEMAS ELETRÔNICOS EMBARCADOS

Embedded Electronic System(Sistema Eletrônico Embarcado


ou Sistema EletrônicoEmbutido)

Combinação de hardware esoftware

Interfaces de entrada e saída específicas e dedicadas

Realiza uma função específica para a qual foi programado

É reconfigurável via software

➔ Um sistema eletrônico é dito embarcado quando é dedicado auma única tarefa e


interage continuamente com o ambiente a sua volta por meio de sensores e
atuadores, gerenciado por um softwarereconfigurável.
4
SISTEMAS ELETRÔNICOS EMBARCADOS

▪ Um sistema eletrônico embarcado realiza apenas um conjunto de


tarefas pré-definidas
▪ Consequências do sistema ser dedicado à tarefas específicas:
▪ O circuito eletrônico é otimizado para realizar apenas aquela tarefa
▪ Redução do tamanho
▪ Redução dos recursoscomputacionais
▪ Redução do custofinal
▪ Aumento daconfiabilidade
SISTEMAS ELETRÔNICOS EMBARCADOS

Em um sistema eletrônico embarcado a interface com o


usuário é geralmente simples e limitada
▪ Botão liga-desliga
▪ LEDs sinalizadores das principaisfunções
▪ Teclado
▪ Display de Cristal Líquido
▪ Botão dereset
▪ Web-based interface
SISTEMAS ELETRÔNICOS EMBARCADOS

Devido aos constantes avanços na tecnologia eaqueda nos custos de


implementação tanto de componentes de software como hardware, a
definição de Sistemas Embarcados está em aberto.

➔Alguns sistemas, como smartphones, TVs e Tablets, estão se tornando bem


completos, fugindo ao conceito inicial e aproximando-se a um sistema de uso
genérico.
SISTEMAS ELETRÔNICOS EMBARCADOS

Descrições atualmente contestadas:


▪ Sistemas Embarcados são mais limitados em funcionalidades de
hardware e/ou software que um PC?
▪ Sistemas Embarcados são desenvolvidos para executar tarefas
específicas?
▪ Érequerido maior qualidade e confiabilidade dos Sistemas Embarcados
que de outros sistemas computacionais?

Conclusão: Alguns dispositivos classificados como Sistemas Embarcados


na verdade estãodeixando de ser ou já não ossão!
HISTÓRICO DOS SISTEMAS EMBARCADOS

Décadas de 30 e40:
▪ Os primeiros computadores possuíamfunções específicas.
• ENIGMA: Máquina eletromecânica projetadopara gerar mensagens em
código (Segunda Guerra Mundial – código quebrado por AlanTuring).
• ENIAC - Electronic Numerical Integrator And Computer - University of
Pennsylvania's Moore School of Electrical Engineering – Cálculo de
trajetórias deprojéteis.
06/06/2011 10
17.468 válvulas – 7.200 diodos – 1.500 relés
70.000 resistores – 10.000 capacitores
Peso: 27 ton – Área: 62 m2 – Potência: 150 kW

06/06/2011 11
HISTÓRICO DOS SISTEMAS EMBARCADOS

Décadas de 60:
▪ ApolloGuidance Computer (AGC) –Considerado o
primeiro Sistema EmbarcadoModerno
▪ Projetado e construído pelo MIT Instrumentation
Laboratory
▪ Aprox. 4100 CIs fabricadospela
Fairchild Semiconductors
▪ Cada naveApollo tinha 3AGC:
• Módulo decomando
• Módulo lunar
• AbortGuidanceSystem (AGS)no
Módulo Lunar
HISTÓRICO DOS SISTEMAS EMBARCADOS

▪ AGC montado no
painel de controleda
Apollo.
▪ Interface doAGC
14
15
HISTÓRICO DOS SISTEMAS EMBARCADOS

▪ Autonetics D-17 –Computador


guia do míssil Minuteman -
Primeiro Sistema Embarcado
produzido emmassa.
▪ Desenvolvimento da Indústria de
CI’s. Um CI NAND que custava
US$100 passou a custarUS$3.
HISTÓRICO DOS SISTEMAS EMBARCADOS

Décadas de 70 e80:
▪ Surgimento e expansão dos primeiros
Microprocessadores emicrocontroladores.
Décadas de 90:
▪ Redução dos custos / aumento do poder de
processamento efuncionalidade.
2000 até atualmente:
▪ Expansão no uso demicrocontroladores
▪ Digitalização crescente: Foto / Vídeo / Som /
Internet
HISTÓRICO DOS SISTEMAS EMBARCADOS

▪ Alguns processadores
foram e ainda são
amplamente utilizados,
como o Z80 (8 bits),
Motorola 68000 (16
bits) e os chipsARM (32
bits), em video-games,
DVDs, Palms, injeção
eletrônica, etc.
EXEMPLOS DE SISTEMAS EMBARCADOS

19
EXEMPLOS DE SISTEMAS EMBARCADOS

20
EXEMPLOS DE SISTEMAS EMBARCADOS

21
EXEMPLOS DE SISTEMAS EMBARCADOS

22
EXEMPLOS DE SISTEMAS EMBARCADOS

06/06/2011 23
CARACTERÍSTICAS

» Ao contrário de programas desenvolvidos para computadores de


uso geral, o software de um sistema embarcado não pode ser usado
em outro sistema embarcado sem que antes sejam feitas mudanças
significativas.

O hardware de um sistema eletrônico embarcado é projetado sob


medida para uma determinada aplicação.

O projeto do hardware e do software é feito em conjunto (hardware


& softwareinterdependentes).

26
CARACTERÍSTICAS

Requisitos do engenheiro de sistemas eletrônicos embarcados:


Programação clássica
Noções de controlede processos
Sistemas de temporeal
Tecnologias de aquisição de dados (conversores analógico-
digitais e sensores de um modo geral)
Atuadores (conversores digital-analógicos, PWM, etc.)
Eficiência (estruturação, tamanho e velocidade) do código
produzido.

27
CARACTERÍSTICAS

» Como o sistema embarcado pode estar sujeito às mais severas


condições de temperatura e localização, o projeto deve permitir que
sua inicialização seja feita por meio de diferentes meios físicos:
» Memória flash interna ao processador

Cartão de memória
DVD
Disco rígido convencional
Disco rígido sem partes móveis (flash)
RedeTCP/IP

28
CARACTERÍSTICAS

O sistema operacional para este tipo de dispositivo deve ainda ser


bastante customizável, privilegiando atividades dedicadas ou exclusivas,
envolvendo otimizações específicas no hardware na camada de
aplicação.

29
CARACTERÍSTICAS

30
CARACTERÍSTICAS

06/06/2011 31
PLACAS DE DESENVOLVIMENTO

32
PRESENTE E FUTURO

Atualmenteuma pessoa entra em contato diariamente com


pelo menos 20 processadores
Estimativas apontam que cada pessoa terá contato com 350
processadores por dia em 2030.

33
PRESENTE E FUTURO

Hoje, os sistemas eletrônicos embarcados marcam fortepresença no


nosso dia-a-dia.

Muitas vezes eles estão “transparentes” e nós não


os percebemos.

Têm ganhado cada vez mais espaço em todas as áreas.

Adquiriram uma importânciaindiscutível.


PRESENTE E FUTURO

Apesar da facilidade de desenvolvimento, os projetistas tem se


preocupado com projetos de sistemas eletrônicos embarcados cada
vez maiores.
Ramo muito promissor para os novos profissionais, envolvendo
conhecimentos desde da física de semicondutores até a engenharia
de software.
PRESENTE E FUTURO

Tendência: adição de mais inteligência a processos e produtos Tendência:


maior conectividade, através de tecnologias de rede sem fio, por
exemplo.

O mercado de microprocessadores embarcados éaproximadamente


100 vezes maior que o de computadores (desktops e notebooks) e
deve crescer exponencialmente na próximadécada.
SISTEMAS EMBARCADOS

1.1 Sistema computacional

O que caracteriza um sistema computacional é a possibilidade de ser programado.


Um sistema computacional é composto por hardware (parte física) e software (programa).

A estrutura básica de um sistema computacional (PC) é como a apresentada no diagrama em blocos


abaixo:

Central
Processing
Unit
SISTEMAS EMBARCADOS

1.1.1 Memórias

Memórias são dispositivos que armazenam informações. No caso de um sistema computacional, essa
informação, assim como a memória, pode ser dividida em dois tipos: programa e dados.

1.1.2 Dispositivos de entrada e saída

São responsáveis por realizar a interface do processador com o ”mundo externo”. ´E através deles que um
sistema computacional adquire dados externos e aciona processos. São comumente chamados de
dispositivos de I/O (Input/Output - Entrada/Saída), portais de I/O (no inglês, ports) ou simplesmente portas.
SISTEMAS EMBARCADOS
1.1.3 Periféricos

Esses dispositivos nada mais são do que circuitos destinados a realizar funções especiais, uteis na
aplicação a que se destina o sistema computacional. Esses dispositivos periféricos são particularmente
importantes nos microcontroladores, que os tem uma grande variedade.

Como periféricos mais comuns podemos citar os temporizadores e contadores (Timers), os módulos de
comunicação serial, conversores A/D e D/A, módulos de CCP (Captura, comparação e PWM), drivers de
LCD, comparadores analógicos, etc.

1.1.4 CPU

A CPU (Central Processing Unit - Unidade Central de Processamento) ou processador é parte principal de
um sistema computacional. É comum se referir à CPU dos microcontroladores como core (núcleo). Sua
função é executar as instruções do programa e processar dados. Para tanto ela controla todas as demais
partes do sistema e envia ou recebe dados dessas partes.
Ela também é capaz de interpretar e colocar em execução as instruções que compõe o programa e
realizar operações lógicas e aritméticas.
SISTEMAS EMBARCADOS

1.2 Arquitetura Computacional

Por arquitetura de computador entende-se a forma como as diversas partes do sistema são organizadas e
conectadas entres si.

Sistemas de computação podem ser classificados quanto a sua arquitetura geral de fluxo de dados, a
arquitetura interna do processador e a complexidade das instruções envolvidas. Quantidades maiores de
instruções visam diminuir o tempo e o espaço de desenvolvimento do código. Boa parte dos elementos
que compõem um microcontrolador deriva de portas lógicas básicas e arranjos mais elaborados, como os
flip-flops. A memória serve ao circuito como orientação para o funcionamento e também para manipulação
dos dados.

Usualmente, as arquiteturas se dividem em Harvard, Von-Neumann, RISC e CISC.


Microprocessador × Microcontrolador

Microcontrolador

Microprocessador
Memória de Programa

Unidade Lógica e Aritmética


(ULA)

Unidade de Temporização e
Controle
Memória de Dados

Registro de Instruções e
Decodificador de Instruções

Registradores
Unidade de Entrada e Saída
Microcontrolador
Registradores - São usados para o
Microprocessador
Memória de Programa
armazenamentos internos da CPU. Existem
Unidade Lógica e Aritmética
(ULA) diversos registradores na CPU e o principal
deles é chamado de Acumulador.
Unidade de Temporização e
Controle
Os registradores sãodeconstruídos
Memória Dados com flip-flops,

Registro de Instruções e que podem reter (armazenar) dados.


Decodificador de Instruções

O acumulador contém um dos dados usados na


Registradores operação que se deseja e ainda o resultado da
Unidade de Entrada e Saída

operação, que substitui o dado original.


Unidade Lógica e Aritmética (ULA ou ALU) - realiza funções básicas
de processamento de dados (adição, subtração, funções lógicas, etc.).
Microcontrolador

Microprocessador
Memória de Programa

Unidade Lógica e Aritmética


(ULA)

Unidade de Temporização e
Controle
Memória de Dados

Registro de Instruções e
Decodificador de Instruções

Registradores
Unidade de Entrada e Saída
Microcontrolador
Unidade de Temporização e Controle:
Microprocessador
Memória de Programa
Responsável pela geração dos sinais de controle
Unidade Lógica e Aritmética
(ULA) para todas as unidades, a partir da informação
da Unidade de Decodificação. Os sinais de
controle são sincronizados, de acordo com o
Unidade de Temporização e sinal de clock.
Controle
Memória de Dados

Registro de Instruções e
Decodificador de Instruções
Unidade de Decodificação:
Registrador de Instruções e Decodificador de
Registradores Instruções
Unidade de Entrada e Saída

Responsável pela identificação da instrução a ser


executada, a partir do código de operação
(opcode).
SISTEMAS EMBARCADOS

1.1.1 Memórias

Memórias são dispositivos que armazenam informações. No caso de um sistema computacional, essa
informação, assim como a memória, pode ser dividida em dois tipos: programa e dados.

Programa é a sequencia de instruções que ao CPU deve seguir para desempenhar a função a que se
destina a aplicação. Quando se trata de um programa executado por um microcontrolador são usados
também os termos firmware e software embarcado (embedded software).

Já dados são variáveis que a CPU usa durante a execução do programa.

Existem também Registros (bytes de memória) com funções especiais que trabalham junto ao processador
(CPU). Em alguns casos esses registros estão dentro do próprio processador e em outros eles são
mapeados juntamente com a memória de dados.
SISTEMAS EMBARCADOS

Memória de programa

Sua função é armazenar o software (programa) a ser executado no sistema. Também é utilizada para
guardar tabelas de constantes. Dentre os vários endereços de memória de programa existem alguns com
finalidade específica, chamados vetores.

São endereços para onde o programa desvia quando ocorrem determinados eventos. Assim, sempre
existirá um vetor de reset, que é onde o programa começa (ou recomeça) quando o sistema é inicializado
(ou resetado).

Há também as interrupções que causam desvios no fluxo do programa quando ocorrem determinados
eventos. Os endereços associados às interrupções são chamados de vetores de interrupção. Podemos
encontrar sistemas onde, independentes da causa da interrupção, há apenas um vetor para onde o
programa desvia e sistemas onde cada fonte ou tipo de interrupção possui um vetor.
SISTEMAS EMBARCADOS

Memória de programa

De uma forma geral, a memória de programa é uma memória não volátil. Isto quer dizer que o programa
não é perdido quando se retira a alimentação do sistema; se não fosse assim, o sistema teria que ser
programado a cada vez que fosse colocado em funcionamento.
As diferentes tecnologias usadas para implementação da memória de programa dos microcontroladores
são:

• ROM (read-only memory): somente de leitura. É gravada pelo fabricante do componente, o que em
quantidades muito grandes reduz custos.
• EPROM (erasable programmable read-only memory): apagável através de luz ultra-violeta. Utilizada no
processo de desenvolvimento e algumas vezes no produto acabado, quando há a necessidade de se
poder alterar o software.
SISTEMAS EMBARCADOS

Memória de programa

• OTP (One Time Programmable): programável somente uma vez, utilizada em produção.

• Flash: é uma memória eletricamente apagável (EEPROM - Electrically-Erasable Programmable Read-


Only Memory,) com tempos de acesso para leitura rápido. Oferece uma grande flexibilidade, pois
geralmente é possível reprogramar um equipamento sem retirar o microcontrolador da placa (gravação in-
circuit). Além disso, alguns modelos permitem que o microcontrolador altere sua própria memória de
programa.

Atualmente quase todos os microcontroladores possuem versões em memória Flash, pois a mesma
apresenta muitas vantagens a um custo dos mais baixos.
SISTEMAS EMBARCADOS

Memória de programa

Alguns microcontroladores apresentam a possibilidade de expansão de memória, isto é, permitem


acrescentar mais componentes de memória externamente; outros não.

A quantidade de memória interna é uma das principais diferenças entre microcontroladores de uma
mesma linha, e tem um impacto significativo no preço dos componentes. Esse é um dos motivos porque se
deve otimizar os programas para que tenham o menor tamanho possível, ou seja, ocupem a menor
quantidade de memória possível.
SISTEMAS EMBARCADOS

Memória de Dados

E a memória onde são armazenados os dados a serem processados pelo computador (as variáveis dos
programas e outras informações.). Como esses dados são constantemente alterados, a memória utilizada
para armazená-los é do tipo RAM (Random Access Memory), que pode ser reescrita indefinidamente.

Alguns microcontroladores disponibilizam também memórias EEPROM para armazenar dados que não
devem ser perdidos com a falta de energia.

Da mesma forma que a memória de programa, os microcontroladores já possuem internamente alguma


quantidade de memória RAM de dados. Aqui também alguns permitem expansão de memória e outros
não. A quantidade de RAM também varia de componente para componente.
Memória de Programa:
Microcontrolador
ROM (Read-Only Memory) – Memória que permite
Microprocessador
apenas a leitura, ou seja, as suas informações são Memória de Programa
gravadas pelo fabricante uma única vez e após isso
não podem ser alteradas ou Unidade Lógica e Aritmética
apagadas,
(ULA)
somente
acessadas.

Unidade de Temporização e
Memory) – Podem ser escritas com dispositivos
PROM (Programmable Read-Only Controle
especiais mas não podem mais ser apagadas. Memória de Dados

Registro de Instruções e
EPROM (Erasable Programmable de Instruções Memory) – Podem ser apagadas
Read-Only
Decodificador
pelo uso de radiação ultravioleta permitindo sua reutilização.
Exemplo para o caso do 8051: Microcontrolador 8751
Registradores
Unidade de Entrada e Saída
EEPROM – Permite apagar eletricamente e gravar várias vezes.

FLASH – Equivalente à memória EEPROM. Porém, ocupa menos espaço; menor


consumo de energia; alta durabilidade.
Memória de Programa

Unidade Lógica e Aritmética


(ULA)

Unidade de Temporização e
Controle
Memória de Dados
Memória de Dados:
Registro de Instruções e
Decodificador de Instruções
Memória RAM – Permite a leitura e a gravação de dados.

Registradores
Unidade de Entrada e Saída
Memória Dinâmica (DRAM) – Baixa densidade, mas lenta. Capacitores com circuitos
com “atualização de dados - refresh”.

Memória estática (SRAM) – Alta densidade. Rápida. Baseada em Flip-flops.

Memória CACHE - Pequena quantidade de memória RAM estática (SRAM) usada


para acelerar o acesso à memória principal (RAM dinâmica).
Quando há necessidade de transferir dados da (para) memória dinâmica, estes são
antes transferidos para a memória cache
Unidade de Entrada e Saída (I/O)Microcontrolador
Microprocessador
Memória de Programa
A entrada de dados de um microprocessador (via teclado, mouse ou outros
Unidade Lógica e Aritmética
dispositivos) e a saída de dados (via
(ULA) vídeo, impressora ou outros) exige
circuito integrado adicional como interface.
Unidade de Temporização e
Controle
O microcontrolador já possui essa unidade internamente. Memória de Dados

Exemplos de periféricos usados como unidade de entrada e saída:


Registro de Instruções e
Decodificador de Instruções
• CI 8156 – RAM e porta de entrada e saída

• CI 8355 – ROM e portas deRegistradores


entrada e saída) Unidade de Entrada e Saída
SISTEMAS EMBARCADOS

Microprocessadores são utilizados na construção de computadores para fins diversos. Um


microprocessador pode estar integrado a outros dispositivos dentro de um único circuito integrado para
formar um microcontrolador.

O microcontrolador nada mais é que um pequeno computador desenvolvido para soluções mais
específicas e com demanda de processamento menor que os computadores pessoais, que fazem uso de
sistemas operacionais.

A forma como o processador de um computador acessa a memória e utiliza as informações define sua
arquitetura.

As arquiteturas mais comuns são Harvard e Von-Neumann, e para compreender cada uma delas, se faz
necessário entender a sequência básica de funcionamento de processamento.
SISTEMAS EMBARCADOS

Harvard versus Von-Neumann

O processador está interligado a unidades de memória que lhe fornecem a sequência de instruções a ser
executadas e que servem, também, como unidade de armazenamento para resultados temporários dos
cálculos efetuados pelo computador, como em uma multiplicação que pode ser efetuada pela repetição de
diversas somas.

A função do programador é escrever o código utilizando as regras determinadas no datasheet do


processador para que sejam executadas as operações corretas, cada qual na sua ordem. Este código será
traduzido pelo compilador para a linguagem compreendida pela máquina e gravada na ordem adequada
em sua memória.

Assim, o processador deverá acessar periodicamente a memória em busca da próxima instrução a ser
executada, processar as informações e armazenar os resultados, conforme as ordens que lhe foram
dadas.
SISTEMAS EMBARCADOS

Harvard versus Von-Neumann

Na arquitetura Von-Neumann (Figura 1a) há um único barramento de acesso à memória, tanto para os
dados quanto para as instruções.
Dessa forma, as conexões são reduzidas, mas o tempo de processamento é prejudicado pelo
compartilhamento do barramento para buscar o código do programa e os dados a ser processados.

Já na arquitetura Harvard (Figura 1b) existem dois barramentos de acesso à memória, um apenas para os
dados e outro para as instruções. Assim, enquanto o processador executa uma instrução, outra pode ser
buscada na memória, sem interferências, o que torna o processo mais rápido.

A opção pelo tipo de arquitetura decorre das limitações e das necessidades comerciais do dispositivo.
Enquanto a arquitetura Von-Neumann pode ser reduzida em termos de volume, a arquitetura Harvard
oferece maior capacidade de processamento.
SISTEMAS EMBARCADOS
SISTEMAS EMBARCADOS

1.2.1 Arquitetura von-Neumann

Na arquitetura von-Neumann, as memórias tanto de dados quanto de programa, são acessadas usando-se
o mesmo barramento de dados; as portas de I/O também fazem uso do barramento de dados.

Vale lembrar aqui que uma instrução é como uma operação matemática, isto é, composta de operadores,
que indicam o que será feito, e operandos, que são os parâmetros envolvidos na operação. Desta forma, o
processo de execução de cada instrução é dividido em dois momentos: a leitura da instrução e dos
operandos (fetch) e a execução da instrução propriamente dita.
SISTEMAS EMBARCADOS

1.2.1 Arquitetura von-Neumann

A arquitetura von-Neumann consome muito tempo de processamento com a leitura da instrução e dos
operandos. Conclui-se também que instruções diferentes ocupam quantidades diferentes de memória e
são executadas em tempos diferentes.
SISTEMAS EMBARCADOS

1.2.1 Arquitetura von-Neumann

Devido à inexistência de limitações a complexidade das instruções, os sistemas de arquitetura von-


Neumann geralmente tem conjuntos de instruções complexos, o que equivale a dizer que possuem um
grande numero de instruções e cada instrução realiza uma grande sequencia de ações (instruções
complexas).

Processadores desse tipo são chamados CISC (Complex Instruction Set CPU - CPU com Set de
Instruções Complexo).
SISTEMAS EMBARCADOS

1.2.2 Arquitetura Harvard

Já a arquitetura chamada de arquitetura Harvard, que é utilizada nos microcontroladores PIC, tem como
principal característica acessar a memória de dados separadamente da memória de programa.

A principal vantagem dessa arquitetura é a leitura de instruções e de alguns tipos de operandos pode ser
feita ao mesmo tempo em que a execução das instruções.
Isso significa que o sistema fica todo o tempo executando instruções, o que acarreta um significativo
ganho de velocidade. Enquanto uma instrução está sendo executada, a seguinte está sendo lida. Esse
processo é conhecido como pipelining (canalização) e é ilustrado pela figura a seguir:
SISTEMAS EMBARCADOS

1.2.2 Arquitetura Harvard


SISTEMAS EMBARCADOS

1.2.2 Arquitetura Harvard

No caso específico dos microcontroladores PIC da família 16Xxxx, o processador foi projetado para que
cada instrução ocupe um endereço de memória e seja executada em um ciclo de máquina (que leva 4
períodos de clock para ocorrer), com exceção das instruções de chamada e desvio, que são executadas
em dois ciclos. Dessa forma, tem-se um controle do tamanho e, principalmente, do tempo de execução do
programa simplesmente contando o numero de instruções.

Pode-se notar então que os tempos de execução e de leitura estão atrelados e são os menores possíveis.
Isso acarreta em as instruções não poderem executar uma grande sequencia de ações, ou seja, não
existem instruções complexas.
SISTEMAS EMBARCADOS

1.2.2 Arquitetura Harvard

Por isso, os PIC´s são considerados processadores RISC (Reduced Instruction Set CPU - CPU com Set
de Instruções Reduzido). O numero de instruções é reduzido, o que não significa que não se possa
executar programas complexos, mas sim que sequencias complexas de ações devem ser construídas por
sequencias de instruções básicas.
SISTEMAS EMBARCADOS

RISC versus CISC

Além da arquitetura geral de computadores, os microprocessadores são classificados quanto à sua


arquitetura interna. Um processador do tipo RISC (reduced instruction set computer, ou computador com
conjunto de instruções reduzido) é mais enxuto e de aprendizado simplificado, isto porque sendo a
quantidade de instruções existentes menor, também será menor o tempo para entender seu
funcionamento.

Já os modelos CISC (complex instruction set computer, ou computador com conjunto de instruções
complexo) têm à disposição instruções que, de outro modo, necessitariam de várias instruções para
resolver o mesmo problema com um processador RISC. Esta arquitetura tem um preço mais elevado,
assim como um tempo de aprendizado maior. A vantagem dos processadores CISC está na redução de
memória de programa, uma vez que a quantidade de instruções poderá ser reduzida, resultando em menor
tempo de compilação e em menor quantidade de memória de dados.
SISTEMAS EMBARCADOS
SISTEMAS EMBARCADOS

Como as arquiteturas RISC visam Unidades de Controle mais simples, rápidas e baratas, elas geralmente
optam por instruções mais simples possível, com pouca variedade e com poucos endereços.

A pouca variedade dos tipos de instrução e dos modos de endereçamento, além de demandar uma
Unidade de Controle mais simples, também traz outro importante benefício, que é a previsibilidade.

Como as intrusões variam pouco de uma para outra, é mais fácil para a Unidade de Controle prever
quantos ciclos serão necessários para executa-las.

Esta previsibilidade traz benefícios diretos para o ganho de desempenho com o Pipeline. Ao saber quantos
ciclos serão necessários para executar um estágio de uma instrução, a Unidade de Controle saberá
exatamente quando será possível iniciar o estágio de uma próxima instrução.
SISTEMAS EMBARCADOS

Já as arquiteturas CISC investem em Unidades de Controle poderosas e capazes de executar tarefas


complexas como a Execução Fora de Ordem e a Execução Superescalar.

Na execução Fora de Ordem, a Unidade de Controle analisa uma sequência de instruções ao mesmo
tempo. Muitas vezes há dependências entre uma instrução e a seguinte, impossibilitando que elas sejam
executadas em Pipeline. Assim, a Unidade de Controle busca outras instruções para serem executadas
que não são as próximas da sequência e que não sejam dependentes das instruções atualmente
executadas. Isso faz com que um programa não seja executado na mesma ordem em que foi compilado.

A Execução Superescalar é a organização do processador em diversas unidades de execução, como


Unidades de Pontos Flutuante e Unidades de Inteiros. Essas unidades trabalham simultaneamente.
Enquanto uma instrução é executada por uma das unidades de inteiros, outra pode ser executada por uma
das unidades de Pontos Flutuantes.
SISTEMAS EMBARCADOS

Afinal, qual a melhor abordagem? Sempre que este assunto é apresentado, surge a pergunta crucial sobre
qual é a melhor abordagem, a RISC ou a CISC? Esta é uma pergunta difícil e sem resposta definitiva.

A melhor resposta é de que depende do uso que se quer fazer do processador.

Processadores RISC geralmente resultam em projetos menores, mais baratos e que consumem menos
energia. Isso torna-os muito interessante para dispositivos móveis e computadores portáteis mais simples.
Já os processadores CISC trabalham com clock muito elevado, são mais caros e mais poderosos no que
diz respeito a desempenho. Entretanto, eles são maiores e consomem mais energia, o que os torna mais
indicados para computadores de mesa e notebooks mais poderosos, além de servidores e computadores
profissionais.
SISTEMAS EMBARCADOS

Os processadores CISC iniciaram com processadores mais simples e depois foram incorporando mais
funcionalidades. Os fabricantes, como a Intel e a AMD, precisavam sempre criar novos projetos mas
mantendo a compatibilidade com as gerações anteriores. Ou seja, o Conjunto de Instruções executado
pelo 486 precisa também ser executado pelo Pentium para os programas continuassem compatíveis.

O Pentium IV precisou se manter compatível ao Pentium e o Duo Core é compatível com o Pentium IV.
Isso tornou o projeto dos processadores da Intel e AMD muito complexos, mas eficientes. Os
computadores líderes mundiais em competições de desempenho computacional utilizam processadores
CISC.
SISTEMAS EMBARCADOS

Já o foco dos processadores RISC está na simplicidade e previsibilidade.

Além do benefício da previsibilidade do tempo de execução ao Pipeline, ele também é muito interessante
para aplicações industriais. Algumas dessas aplicações são chamadas de Aplicações de Tempo Real.
Essas aplicações possuem como seu requisito principal o tempo para realizar as tarefas. Assim, o Sistema
Operacional precisa saber com quantos milissegundos um programa será executado. Isso só é possível
com processadores RISC, com poucos estágios de Pipeline, poucos tipos de instrução, execução em
ordem etc.

Mesmo que os processadores RISC sejam mais lentos do que os CISC, eles são mais utilizados nessas
aplicações críticas e de tempo real, como aplicações industriais, de automação e robótica.
SISTEMAS EMBARCADOS

Atualmente não se pode afirmar com 100% de certeza que um processador utiliza apenas a arquitetura
CISC ou RISC, pois os modelos atuais de processadores abrigam as características de ambas as
arquiteturas. Processadores ARM usados em celulares são um com exemplo de uso da arquitetura RISC,
outro exemplo de uso dessa arquitetura é em consoles como o Nintendo 64 e o Playstation.

Com o passar dos anos, tanto a Intel quanto a AMD perceberam que usar alguns conceitos da arquitetura
RISC em seus processadores poderia ajudá-las a criar processadores mais rápidos. Porém, ao mesmo
tempo, existia a necessidade de continuar criando processadores compatíveis com os antigos.

A ideia então passou a ser construir chips híbridos, que fossem capazes de executar as instruções x86
(vindas do microprocessador 8086, da Intel – mesma família do 80486), sendo compatíveis com todos os
programas, mas ao mesmo tempo comportando-se internamente como chips RISC, quebrando estas
instruções complexas em instruções simples, que podem ser processadas por seu núcleo RISC.

A partir do “Pentium”, a Intel abandonou a nomenclatura dos microprocessadores com números, uma vez
que não era possível patentear números.
SISTEMAS EMBARCADOS
SISTEMAS EMBARCADOS

Arquitetura de microcontroladores
Um microcontrolador se divide basicamente em elementos de processamento e memória. Cada um destes
é dividido e organizado conforme as funções desempenhadas para o restante do sistema. Na memória são
armazenadas as instruções que serão lidas pelo processador, assim como os dados utilizados durante o
processo.
A unidade principal de processamento é conhecida como unidade de lógica e aritmética (ULA) e contém o
hardware necessário para desempenhar cada uma das funções descritas na lista de instruções do
datasheet do microcontrolador. Assim, para que o processador seja capaz de efetuar uma operação de
soma é necessário um circuito para desenvolver este procedimento ou uma combinação deles, caso esteja
presente nesta unidade. A Figura 2 apresenta um somador completo de 1 bit,
SISTEMAS EMBARCADOS

Arquitetura de microcontroladores

Somas maiores que 1 bit podem utilizar vários circuitos de somador completo interligados, cada qual
recebendo o bit de uma posição das variáveis a serem somadas e a sobra do circuito imediatamente
anterior.

Circuitos como o somador completo e outras funções estão presentes na ULA e podem ser combinados e
sequenciados para obter operações ainda mais complexas.

A ULA deve ser alimentada com os dados corretos para desempenhar adequadamente suas funções. Com
esta finalidade é utilizada a unidade de controle (UC), que comanda o fluxo de dados entre as memórias,
periféricos e a unidade de lógica e aritmética. Na Figura 3 é possível ver uma pequena ULA, composta por
quatro funções/circuitos diferentes: somador de 1 bit, operação lógica AND, OR e NOT. A entrada de
dados é um barramento comum a todos os circuitos;
SISTEMAS EMBARCADOS
SISTEMAS EMBARCADOS

Apesar de a eletrônica digital trabalhar com níveis lógicos rígidos, a transição de um estado para o outro
demanda a movimentação de cargas elétricas e, consequentemente, um tempo de acomodação.

Esse tempo pode se acumular ao interligar diversos circuitos digitais em cascata, criando um atraso de
propagação do sinal/dado. Devido a esta limitação, é necessário que os dispositivos sejam sincronizados
para atuar no mesmo instante de tempo e permitir a acomodação dos sinais antes de proceder com a
próxima instrução.

Este tempo é conhecido como clock e pode estar integrado ao microcontrolador ou utilizar um circuito
externo para fornecer um sinal periódico e estável. Uma instrução demanda mais que um pulso de clock
para ser executada. A instrução deve ser buscada e os circuitos demandados no processo deverão ser
ajustados, já que todos têm acesso ao barramento. Só então o processamento será de fato executado e,
ao final deste, o resultado poderá retornar à memória.

Dessa forma, muitos microcontroladores em arquitetura Harvard, como é o caso da família PIC,
demandam quatro pulsos de clock para a execução completa de uma única instrução, o que recebe o
nome de ciclo de máquina.
Arquitetura RISC x Arquitetura CISC
Arquitetura RISC

Memória de
Unidade de Controle Memória de Dados
Programa

Arquitetura CISC

Memória de Unidade de
Programa Entrada e Saída

Unidade de Controle

Memória de Dados Registradores


Arquiteturas em uso nos computadores atuais:

• CISC – Complex Instruction Set Computing (Computador com Conjunto Complexo


de Instruções) Exemplos: Intel e AMD

• RISC – Reduced Instruction Set Computing (Computador com Conjunto Reduzido


de Instruções) Exemplos: PowerPC (da Apple, Motorola e IBM), SPARC (SUN) e
MIPS R2000

• Híbrida – Combinação de ambas arquiteturas. Exemplo: Pentium Pro. O núcleo


mais interno usa filosofia RISC.
Algumas Características RISC X CISC:

RISC CISC

Instruções básicas executadas em apenas 1ciclo – uso intenso No mínimo 4 ciclos de clock (8085) para executar uma instrução.
de superposição na execução de instruções (através de pipeline) Tem pouca ou nenhuma superposição na execução de instruções

Uso reduzido da memória – basicamente 2 instruções de acesso Muitas instruções com acesso à memória. Uso intenso da
à memória (load/store). memória (load, store, mov... )
Instruções de tamanho fixo. Instruções de tamanho variável.
Exemplo: as instruções do PIC 16F628 têm tamanho fixo de 14 Exemplo: 8085 tem instruções de 1, 2 e 3 bytes.
bits.
Muitos registradores. Poucos registradores.
Exemplo: PIC típico possui de 32 a 128 registradores. Exemplo: 8085 possui 7 registradores de propósito geral (A, B, C,
D, E, H e L)
Não há necessidade de decodificação das instruções antes de Ciclo de busca inclui busca na memória e identificação em
executá-las. decodificadores.
As instruções são semelhantes às micro-instruções da arquitetura Uso de micro-instruções gravadas no processador.
CISC. Necessidade de interpretação das instruções
As instruções são executadas diretamente no hardware
Algumas Características RISC X CISC:

RISC CISC

Número pequeno (ou médio de instruções). Número elevado de instruções.


Exemplo: PIC 12 e PIC 16 possuem 32 instruções. Exemplo: 8085 possui cerca de 74 instruções, que resultam em
cerca 255 códigos de operação (opcodes)
Instruções simples – 1 ciclo para execução Instruções complexas – múltiplos ciclos para execução.

Programa compilado tem maior número de instruções em Menor número de instruções assembly, comparado com mesmo
assembly, comparado com mesmo programa implementado em programa implementado em arquitetura RISC.
arquitetura CISC. No entanto, é mais lento na execução.
Uso maior de memória Uso de uma quantidade menor de memória.
Algumas Características RISC X CISC:

𝑡𝑒𝑚𝑝𝑜 𝑛ú𝑚𝑒𝑟𝑜 𝑑𝑒 𝑐𝑖𝑐𝑙𝑜𝑠 𝑖𝑛𝑠𝑡𝑟𝑢çõ𝑒𝑠


𝑇𝑒𝑚𝑝𝑜 𝑑𝑒 𝑝𝑟𝑜𝑐𝑒𝑠𝑠𝑎𝑚𝑒𝑛𝑡𝑜 = × ×
𝑐𝑖𝑐𝑙𝑜 𝑖𝑛𝑠𝑡𝑟𝑢çã𝑜 𝑝𝑟𝑜𝑔𝑟𝑎𝑚𝑎

Na arquitetura RISC, esse é


Na arquitetura CISC, esse é
um item fundamental para
um item fundamental para
aumento do desempenho – a
aumento do desempenho – o
execução em paralelo de
número de instruções por
instruções (com pipeline)
programa pode ser reduzido,
reduz o número de ciclos na
uma vez que cada instrução
execução de cada instrução.
executa várias tarefas.
Etapas de execução de uma instrução:
CONJUNTO DE INSTRUÇÕES:

Grupos de instruções mais comuns em processadores de qualquer arquitetura:


Instruções de desvio (No CISC o valor de retorno é guardado na pilha; no
RISC é guardado em um registrador.
Instruções de transferência entre registradores e memória
(No RISC: load/store; no CISC: load, store, mov etc)

Instruções de transferência entre registradores

Instruções de transferência entre posições de memória

Operações aritméticas (soma, subtração ...)

Operações lógicas (and, or, not, rotação ...)


CICLO DE EXECUÇÃO:

RISC → As instruções são executadas em um único ciclo de via de dados.


São instruções muito parecidas com as micro-instruções da arquitetura CISC.
Não precisam de decodificação.

Não é possível ter instruções de multiplicação e divisão, por exemplo, por


exigir muitos ciclos para execução. Multiplicações são resolvidas com adições
e deslocamentos.

CISC → Antes de executar uma instrução, há necessidade de busca da


instrução na memória e de decodificação. Utiliza-se micro-códigos gravados
no processador, para a execução das instruções.
MEMÓRIA E REGISTRADORES:

RISC → Possui uma quantidade muito grande de registradores (em média 512 –
com 32 visíveis por vez: 8 para variáveis globais e ponteiros, 8 para parâmetros
de entrada, 8 para variáveis locais e 8 para parâmetros de saída).
Número reduzido de acesso à memória
(o acesso à memória torna o processamento mais lento).
Alocação de variáveis em registradores.
Um ou dois modos de endereçamento para acesso à memória

CISC → Possui um número reduzido de registradores, comparado com o RISC.


Alocação de variáveis em posições de memória, ao invés de registradores.
Vários modos de endereçamento para acesso à memória.
MICRO-CÓDIGOS:

RISC → As instruções geradas por um compilador para uma máquina RISC


são executadas diretamente no hardware, sem o uso de micro-códigos.
A ausência de interpretação contribui para o aumento da velocidade de
execução.

CISC → As instruções básicas são gravadas na forma de micro-códigos, que


atuam no hardware estabelecendo os passos de cada instrução.
Há necessidade de busca e decodificação das instruções.
O programa compilado tem uma quantidade menor de instruções assembly do
que um programa RISC, mas é mais lento na execução.
PIPELINE:

Técnica usada para acelerar a execução de instruções. A cada ciclo de clock,


enquanto uma instrução está na etapa de execução, a instrução seguinte está
sendo buscada.
O resultado global é que, a cada ciclo, uma nova instrução é iniciada e uma
instrução é encerrada.
No caso mostrado a instrução B faz referência à memória.

Ciclos 1 2 3 4 5

Busca da instrução A B C D E

Execução da instrução A B C D

Referência à memória B
PIPELINE:

Enquanto a instrução A precisa de apenas um ciclo para busca e um para


execução, a instrução B precisa de dois ciclos para execução.
Caso a instrução B interfira na etapa de execução da instrução C (por
exemplo, usando o mesmo registrador ou quando a instrução C precisa do
resultado da instrução B) é necessário aguardar o término da instrução B
antes de executar a instrução C.

Ciclos 1 2 3 4 5 6

Busca da instrução A B C NOP D E

Execução da instrução A B NOP C D

Referência à memória B
VANTAGENS RISC:

• Velocidade de execução
• O uso de pipeline torna os processadores RISC duas a quatro vezes
mais rápidos que um CISC de mesmo clock
• Simplicidade de Hardware
• Ocupa menos espaço no chip, devido ao fato de trabalhar com
instruções simples.
• Instruções de máquina simples e pequenas, o que aumenta sua
performance.
DESVANTAGENS RISC:

• O desempenho de um processador RISC depende diretamente do


código gerado pelo programador. Um código mal desenvolvido pode
resultar em tempo de execução muito grande.
• Um programa originalmente compilado para uma máquina CISC tem
um equivalente compilado para máquina RISC com uma quantidade
muito maior de códigos assembly, ocupando um espaço maior na
memória.
• A arquitetura RISC requer sistema de memória rápida para alimentar
suas instruções. Normalmente possuem grande quantidade de
memória cache interna, o que encarece o projeto.
SISTEMAS EMBARCADOS

LINGUAGEM C PARA MICROCONTROLADORES

Na tabela a seguir se pode observar uma comparação entre as linguagens C e Assembly:


SISTEMAS EMBARCADOS

Diretivas

Diretivas podem ser descritas como comandos/dados ao compilador, indicado as ações que devem ser
feitas no momento da compilação. Elas podem ou não gerar código que efetivamente vai ser executado
pelo microcontrolador, já que sua função é orientar a compilação do programa. O padrão ANSI C
(American National Standard for Information) prevê uma grande variedade de diretivas. Compiladores que
seguem este padrão tem grande portabilidade entre si.

Além disso, o padrão prevê uma diretiva para criação de novas diretivas, chamada #pagrma , de forma
que diferentes compiladores possam oferecer a seus usuários opções que não estão previstas no padrão
ANSI. Das diversas diretivas disponíveis enfocaremos apenas as quem tem maior, apresentadas a seguir:
SISTEMAS EMBARCADOS

#include

A diretiva #include permite incluir arquivos de cabeçalho e bibliotecas de funções. Exemplo:

#include <P18F4550.h> // inclui um arquivo de definição do PIC


#include <spi.h> // inclui a biblioteca de funções SPI.c (Serial Peripherical Interface)

É como se, ao se chegar a essa diretiva, o compilador ”colasse”(incluísse) o conteúdo do arquivo


apontado.
SISTEMAS EMBARCADOS

#define

Esta diretiva é muito útil pois permite ”apelidar” um trecho de texto por um nome. #define define que um
nome representa o texto imediatamente a seguir, de forma que quando da compilação, toda ocorrência
desse nome seja substituído pelo texto. Vejamos os exemplos a seguir:

Exemplo:
#define VALOR MAXIMO 125
#define LED POTRDbits.RD0
#define ACENDE LED LED = 1;
SISTEMAS EMBARCADOS

Exemplo:
#define VALOR_MAXIMO 125
#define LED POTRDbits.RD0
#define ACENDE_LED LED = 1;

No primeiro exemplo, o valor 125 foi chamado de VALOR_MAXIMO. Esse tipo de construção é útil quando
temos um limite ou constante que queremos usar em diferentes partes do código, mas que pode mudar
seu valor devido a alguma necessidade do projeto.

No segundo caso, usamos #define para atribuir um nome a um pino do microcontrolador. Dessa forma,
não precisamos fazer sempre referencia ao pino, mas sim o chamar por seu apelido “LED”. Isto facilita o
entendimento do código e possíveis alterações na configuração do hardware.

No ultimo caso usamos #define para apelidar um trecho de código, criando o que é conhecido como
macro.
SISTEMAS EMBARCADOS

Tipos de dados

O padrão ANSI define diversos tipos de dados para os compiladores C: char, int, float, double e void.

O tipo void serve para indicar que o tipo parâmetro é nulo nas funções, ou seja, que o parâmetro não
existe.

O tipo char é capaz de armazenar um caracter simples. O tipo int armazena um dado do tipo inteiro,
tipicamente do tamanho de barramento de dados do processador, mas não deve ser menor que 16 bits.
Float armazena dados do tipo ponto flutuante (fracionários) de precisão simples e double armazena dados
de ponto flutuante de dupla precisão.
SISTEMAS EMBARCADOS

Tipos de dados

Além dos tipos de dados padrão existem também modificadores que permitem alterar as características de
cada tipo de dado. São eles:

• signed: informa que o dado é do tipo sinalizado (valores positivos e negativos);


• unsigned: informa que o dado é do tipo não sinalizado (somente valores positivos);
• long: informa que o inteiro é uma variação maior que o padrão;
• short: informa que o inteiro é uma variação menor que o padrão
SISTEMAS EMBARCADOS

Tipos de dados
SISTEMAS EMBARCADOS

Declaração de variáveis e constantes

A declaração de variáveis é feita conforme o exemplo a seguir:


char x,y;
short long medida;
unsigned int dado = 0x35;
float pi = 3.1415;

Coloca-se primeiro o identificador de tipo, acompanhado ou não do modificador, seguido pela lista de
variáveis desse tipo, separadas por ”,”. Ao final da declaração é necessário acrescentar o sinal ”;”. Além
disso, é possível definir um valor inicial para a variável, conforme é apresentado na terceira e quarta linhas
do exemplo.
SISTEMAS EMBARCADOS

Declaração de variáveis e constantes


SISTEMAS EMBARCADOS

Variáveis locais e globais

Uma variável pode ser declarada de forma global ou local. Variáveis locais são declaradas dentro de
funções ou blocos de instruções (delimitados por chaves) e são reconhecidas somente dentro da função
ou do bloco.
Variáveis globais são declaradas fora das funções e são reconhecidas por todas as funções do programa.
O uso de variáveis globais é necessário em algumas situações quando determinada variável deve ser
vista e alterada por diversas funções, como, por exemplo, na troca de dados entre funções de tratamento
de interrupção e outras funções.
Contudo, seu uso deve ser restrito, pois ocupam uma posição de memória constantemente.

Já as variáveis locais são criadas quando a função é executada e ”destruídas” quando a função retorna.
Isso significa que o mesmo endereço de memória pode ser usado por diversas variáveis no decorrer do
programa, o garante um melhor uso de memória. Caso variáveis locais tenham o mesmo nome de
variáveis globais, as globais serão ignoradas naquela função (ou bloco).
SISTEMAS EMBARCADOS

Vetores e matrizes

int Medidas[16];
const char nome[] = ”Domingos”;
char Empresa[] = ”Tecnologia”;
unsigned int InitLCD[6] = 0x33,0x32,0x28,0x06,0x0C,0x01;

O acesso a dados em vetores e constantes é feitas através do uso de índice, conforme mostrado no
exemplo abaixo:
unsigned char i;
int x;
int Medidas[10];
const int Valores[5] = 0x25, 0x31, 0x33, 0x02, 0x55;
Medida[i] = 15;
x = Valores[3];
SISTEMAS EMBARCADOS

Ponteiros

Um tipo especial de variáveis é o tipo ponteiros. Ponteiros são variáveis que contém o endereço de outras
variáveis. Sua função é ”apontar” onde a variável está na memória, daí seu nome. Ponteiros são muito
usados em C e um dos motivos é que permitem a implementação do código de forma bastante otimizada.

Para declarar um ponteiro usamos uma sintaxe parecida com a declaração de variável, porém com
significado diferente. Deve ser colocado o tipo de dado que o ponteiro aponta e o nome do ponteiro,
precedido por ”*”.

Por exemplo, na declaração a seguir x é uma variável do tipo inteiro enquanto ip é um ponteiro que aponta
para variáveis do tipo inteiro.

int x; // x é um inteiro
int *ip; // ip é um ponteiro que aponta inteiros
SISTEMAS EMBARCADOS

Ponteiros

Para atribuir a um ponteiro o endereço de uma variável usamos o operador ”&”. Para manipular o conteúdo
da variável apontada pelo ponteiro usamos o operador ”*”. O exemplo a seguir ilustra alguns usos de
ponteiros:

int x = 1, y = 2, z[10]; // x e y são inteiros, z é um vetor de inteiros

int *ip, *iq; // ip e iq são ponteiros que apontam inteiros


SISTEMAS EMBARCADOS

Ponteiros

ip =&x; // ip aponta para x (através do endereço de x)


iq = &y; // iq aponta para y (através do endereço de y)
y = ip; // y agora vale 1

ip = 0; // x agora vale 0
ip = &z[0]; // ip agora aponta para z[0]
iq = ip; // iq agora aponta para Z[0] também
SISTEMAS EMBARCADOS

Ponteiros - Exemplos
#include <stdio.h>
void main()
{
int a;
int b;
int c;
int *ptr; // declara um ponteiro para um inteiro
a = 90;
b = 2;
c = 3;
ptr = &a;
printf(“Endereço de ptr: %p, Conteúdo de ptr: %d\n", ptr, *ptr);
printf("B: %d, C: %d"), b, c);
}
SISTEMAS EMBARCADOS

Qualificadores

Existem alguns qualificadores que indicam como os dados devem ser alocadas na memória. São naturais
da linguagem C os qualificadores static e auto.

O qualificador auto indica que a variável é valida somente naquele bloco de instruções (bloco delimitado
por chaves ou função), sendo alocada quando o bloco começa e desalocada quando terminar. Desalocar,
ou destruir, significa que aquele endereço de memória pode ser usado por outras variáveis do programa.

O qualificador static informa que a variável não pode ser desalocada, portanto seu endereço de memória
não será ocupado por outras variáveis e seu conteúdo não será alterado após a finalização do bloco. Seu
comportamento é semelhante ao de variáveis globais, porém só são reconhecidas dentro do bloco ao qual
pertencem.
SISTEMAS EMBARCADOS

Qualificadores

Quando não especificado, as variáveis são consideradas como auto. O compilador C18 introduz 4
qualificadores: ram e rom, near e far.

Os qualificadores ram e rom definem se o dado (variável ou constante) deve ser alocado na memória de
dados (RAM) ou de programa (ROM). A principio isso parece não fazer sentido, pois imagina-se que
variáveis devam ser alocadas na RAM e constantes na memória de programa. Contudo, para aumentar a
velocidade da manipulação de dados, constantes podem ser carregadas na memória de dados quando o
programa é iniciado.

Em outras situações, pode ser desejável que garantir que grandes tabelas de constantes estejam
armazenadas na FLASH para reduzir o consumo de memória RAM.
SISTEMAS EMBARCADOS

Qualificadores

Quando não especificado, o compilador assume que os dados devem ser alocados na RAM. Isso é válido
tanto para variáveis como para constantes.

Os qualificadores near e far (perto e longe em inglês, respectivamente) informam em que região da
memória os dados devem ser alocados. Para dados na memória de programa, near (perto) significa nos
primeiros 64 kbytes de memória. Para memória de dados, near significa na RAM de acesso.

Em ambos os casos, far significa em qualquer região da memória, inclusive nas regiões abrangidas por
near. Quando não especificado, o compilador trata os dados como qualificados com far.

Seguem alguns exemplos de usos dos qualificadores:


SISTEMAS EMBARCADOS

Qualificadores

Exemplo:

rom static char Senha[4] // variável alocada na memória ROM

const char Nome[] = ”João”; // constante alocada na RAM (não especificado)

near int Resultado; // resultado é alocado na RAM de Acesso

static int cont; // Cont é do tipo estático


SISTEMAS EMBARCADOS

Alocação Dinâmica de Memória

#include <iostream>
using namespace std;
void main()
{
int *ptr_a;
ptr_a = new int;
// cria a área necessária para 01 inteiro e coloca em 'ptr_a' o endereço desta área.
if (ptr_a == NULL)
{
cout << "Memória insuficiente!" << endl;
exit(1);
}
*ptr_a = 90;
delete ptr_a;
}
SISTEMAS EMBARCADOS

Alocação Dinâmica de Memória


#include <iostream>
using namespace std;
void main()
{
int i;
int *v;
v = new int[10]; // 'v' é um ponteiro para uma área que tem 10 inteiros.
v[0] = 10;
v[1] = 11;
v[2] = 12;
// continua...
v[9] = 19;
for(i = 0; i < 10; i++)
cout << "Endereço de 'v': " << v[i] << endl; // imprime o endereço da área alocada para 'v'
delete[] v;
}
SISTEMAS EMBARCADOS

Decisão
As estruturas de decisão permitem ao programa tomar decisões baseadas na avaliação de uma condição. É avaliado se
essa condição é verdadeira ou falsa. Em C temos as seguintes estruturas de decisão:

If
A estrutura if (se) executa um bloco de comandos se a condição for verdadeira.
Caso contrário segue a execução do programa. Seu aspecto geral é apresentado abaixo:
{
if (<condição>)
<Bloco verdadeiro> }

Exemplo:
{
if(x > 5)
printf(”\n x maior que 5”); }
SISTEMAS EMBARCADOS

Uma condição é considerada falsa se é igual a 0. Caso contrário é considerada verdadeira. Isso se aplica
não só ao resultado de operadores relacionais como também na avaliação de variáveis e bits, conforme
mostrado a seguir.
Exemplo:
if (TMR0){ // verdadeiro se TMR0 diferente de 0
printf(”TMR0 é diferente de 0”)
}

if(!PORTBbits.RB0){ //verdadeiro se RB0 for ’0’ (note o ’!’)


LigaMotor();
}

if(PIR1bits.TMR1IF)
{ RTITimer1(); // chama a função se TMR1IF for ’1’
}
SISTEMAS EMBARCADOS

ROTEIRO DE ESTUDO DIRIGIDO

SEMANA 1: Leitura
SISTEMAS EMBARCADOS

ROTEIRO DE ESTUDO DIRIGIDO

SEMANA 3: Leitura
SISTEMAS EMBARCADOS

ROTEIRO DE ESTUDO DIRIGIDO

SEMANA 4: Leitura

Você também pode gostar