Escolar Documentos
Profissional Documentos
Cultura Documentos
AUTOMAÇÃO
SISTEMAS EMBARCADOS
3 Placa de Desenvolvimento
3.1 Características Gerais;
3.2 Diagrama Esquemático
3.3 Conexões com Periféricos.
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).
2
SISTEMAS ELETRÔNICOS EMBARCADOS
3
SISTEMAS ELETRÔNICOS 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
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
26
CARACTERÍSTICAS
27
CARACTERÍSTICAS
Cartão de memória
DVD
Disco rígido convencional
Disco rígido sem partes móveis (flash)
RedeTCP/IP
28
CARACTERÍSTICAS
29
CARACTERÍSTICAS
30
CARACTERÍSTICAS
06/06/2011 31
PLACAS DE DESENVOLVIMENTO
32
PRESENTE E FUTURO
33
PRESENTE E FUTURO
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.
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
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.
Microcontrolador
Microprocessador
Memória de Programa
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,
Microprocessador
Memória de Programa
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
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).
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.
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
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.
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.
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”.
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
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.
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
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
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
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
Processadores desse tipo são chamados CISC (Complex Instruction Set CPU - CPU com Set de
Instruções Complexo).
SISTEMAS EMBARCADOS
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
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
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
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
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.
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.
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
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
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
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:
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
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:
Ciclos 1 2 3 4 5 6
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:
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
#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:
Tipos de dados
SISTEMAS EMBARCADOS
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
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:
Ponteiros
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.
Qualificadores
Exemplo:
#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
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(PIR1bits.TMR1IF)
{ RTITimer1(); // chama a função se TMR1IF for ’1’
}
SISTEMAS EMBARCADOS
SEMANA 1: Leitura
SISTEMAS EMBARCADOS
SEMANA 3: Leitura
SISTEMAS EMBARCADOS
SEMANA 4: Leitura