Topico 4
Topico 4
Microprocessadores
Vale ressaltar que, sob o ponto de vista de projetos de sistemas embarcados, não é
necessário projetar ou construir um microprocessador. Há no mercado uma
variedade de famílias e modelos disponíveis como circuitos integrados
completamente encapsulados, a um custo bem acessível. Porém, uma boa
compreensão da organização e arquitetura de cada um deles permite uma melhor
escolha de um microprocessador para a aplicação em foco, um melhor projeto dos
circuitos de interface do selecionado com os outros módulos mostrados na Figura
4.1, e uma melhor programação deste cérebro eletrônico para execução das tarefas
em questão. Certamente, como já comentamos no Capítulo 1, isso é uma atividade
que demanda conceitos e habilidades de diversas áreas de conhecimento, como
eletrônica, circuitos elétricos, processamento de sinais, controle, arquitetura e
organização dos sistemas computacionais, programação e leitura de folhas técnicas
dos componentes. Vamos começar com alguns conceitos relevantes sobre os
microprocessadores.
4.1 Arquitetura
A arquitetura de um processador, ou mais precisamente a arquitetura do jogo de
instruções, em inglês instruction set architecture ISA, inclui o jogo de instruções,
quantidade de bits usados para representar as instruções, os operadores e os tipos
de operandos, as técnicas de endereçamento dos operandos, e interface de entrada
e saída.
Figura 4.4 ilustra um campo de 5 bits reservados para o códigos de operação ADD
(soma) entre um operando armazenado no registrador Rdn e o outro operando
codificado no campo imm8 (bits 0 -7) da instrução para um microprocessador da
arquitetura ARM Thumb-2 [7].
Figura 4.4: Campo de código de operação numa instrução ARM Thumb-2 (Fonte: [7]).
4.1.3 Operandos
Cada microprocessador possui uma unidade de processamento natural,
denominada a sua palavra, em inglês word. Há microprocessadores de 8, 16, 32 e
64 bits. Um microprocessador de 16 bits acessa, por exemplo, sempre em cada
acesso 2 bytes em endereços pares. Um microprocessador de 32 bits acessa 4
bytes em endereços múltiplos de 4. Um microprocessador de 64 bits acessa 8 bytes
em endereços múltiplos de 8. Quando a CPU faz acessos à memória com os
endereços que sejam múltiplos do tamanho da sua palavra, dizemos que é um
acesso alinhado, como ilustra a Figura 4.5. Quando os dados que queremos
acessar não tem o tamanho alinhado com o tamanho da palavra do
microprocessador, o microprocessador lê uma quantidade de palavras que abrange
os dados desejados para depois extraí-los das palavras lidas, ou seja, o
microprocessador preenche automaticamente os dados com campos adicionais para
que fique com um tamanho que seja um múltiplo do tamanho da sua palavra
(unidade natural).
Valor dos três bits menos significativos do endereço
Largura do dado 0 1 2 3 4 5 6 7
Desalinhado Desalinhado
Desalinhado Desalinhado
Desalinhado Desalinhado
Double-word Alinhado
Desalinhado Desalinhado
Desalinhado
1
Danny Cohen introduziu os termos Little-Endian e Big-Endian para ordenamento de bytes em um
artigo publicado pelo IETF (Internet Engineering Task Force) de 1980. No artigo “On Holy Wars and a
Plea for Peace” ele faz um exame técnico e político das questões de ordenação de bytes, os nomes
"endian" foram extraídos da sátira de Jonathan Swift de 1726, “As Viagens de Gulliver”, na qual uma
guerra civil eclode a partir da discussão se a parte maior (big end) ou a parte menor (little end) de um
ovo cozido é o lado apropriado para rachar e abrir. Cohen fez uma analogia desta discussão àquela
de qual o final que contém o bit mais significativo ou o bit menos significativo.
● ordenação maior primeiro, em inglês big-endian: na ordem decrescente dos
“pesos numéricos”, do byte mais significativo para o menos, em endereços
sucessivos crescentes da memória.
(a) Arquitetura de von Neumann (Fonte: (b) Arquitetura de Harvard (Fonte: [39])
[38])
Figura 4.7: Arquiteturas com diferentes abstrações do sistema de memória.
A busca de uma instrução em paralelo com a execução de uma outra instrução pode
causar alguns perigos, em inglês hazards, classificados em:
● estruturais: surgem de conflitos de recursos quando o circuito não pode
suportar todas as combinações possíveis de instruções simultaneamente em
execução. Nos processadores modernos, estes hazards estruturais ocorrem
principalmente em unidades funcionais de propósito específico que são
menos usadas, como divisão em ponto flutuante ou outras instruções
complexas de longa duração. Eles não são o principal fator que afeta o
desempenho. Assume-se, regra geral, que os programadores e os
desenvolvedores de compiladores (Seção 4.7.2) estejam cientes do menor
throughput dessas instruções.
● de dados: surgem quando uma instrução depende dos resultados de uma
instrução de uma forma que é exposta pela sobreposição de instruções no
fluxo.
● de controle: surgem da segmentação de instruções de desvio e de outras
instruções que mudam o conteúdo do registrador PC.
4.4 Coprocessadores
Vimos na lista dos grupos de instruções um grupo de instruções de acesso às
instruções de coprocessadores. Um coprocessador é um circuito de processamento
de funções bem específicas, usualmente complementares às funções do
processador ao qual ele está conectado. Sendo um módulo complementar, é
necessário que os seus sinais sejam compatíveis com o processador que ele
complementa elétrica, temporal e funcionalmente. Figura 4.17 mostra o diagrama de
blocos de um sistema constituído por um processador e um co-processador.
Coprocessadores mais conhecidos são as unidades de ponto flutuante aritmético,
em inglês floating-point unit (FPU), e unidade de processamento gráfico, em
inglês graphics processing unit ( GPU).
4.7 Chipsets
Tanto na arquitetura de von Neumann quanto na arquitetura de Harvard, um
microprocessador só tem mesmo utilidade se ele estiver se comunicando com uma
memória, de onde ele obtém a sequência de instruções que ele precisa executar, e
com um periférico, através do qual ele consegue interagir como o mundo físico que
o cerque. O circuito integrado que o permite fazer estas comunicações é o chipset.
Um chipset é um circuito dedicado ao gerenciamento de fluxo de dados entre
microprocessadores, sistema de memória e periféricos. É normalmente encontrado
na placa-mãe e projetado para operar em conjunto com uma família específica de
microprocessadores. Uma divisão tradicional é considerar que um chipset seja
constituído por duas pontes: a ponte norte, em inglês northbridge, que controla o
fluxo de alta velocidade entre a CPU e a memória primária; e a ponte sul, em inglês
southbridge, que controla fluxos de velocidade menor entre as conexões do sistema
com os periféricos. Figura 4.22 ilustra estas conexões com um processador Athlon.
4.8.3 Aplicativos
Com o suporte dos softwares de desenvolvimento, os projetistas de aplicativos de
porte médio para cima utilizam, regra geral, linguagens de alto nível. Com o intuito
de mostrar as correspondências entre as instruções de uma linguagem de alto nível
e de uma linguagem de máquina, faremos uma breve introdução a algumas
instruções mais utilizadas da linguagem C, com foco na sua tradução para a
linguagem de máquina ARM Thumb. Mesmo que esta tradução seja feita de forma
otimizada e transparente pelos compiladores modernos, ter uma melhor
compreensão de como ela é feita pode ajudar na escolha das instruções
apropriadas para um programa em que a eficiência temporal seja crítica. Vale
também comentar que, sendo ARM Thumb uma arquitetura RISC, um comando
complexo tem que ser desdobrado em instruções simples. Se o microprocessador
for da arquitetura CISC, a tarefa de tradução seria mais simples.
Atribuição em C Equivalência
a = b; a=b;
a+=b; a = a+b;
a-=b; a = a-b;
a*=b; a = a*b;
a/=b; a = a/b;
a%=b; a = a%b;
a&=b; a = a&b;
a|=b; a = a|b;
a^⁼b; a = a^b;
a<<=b; a = a<<b;
a>>=b. a = a>>b;
Tabela 4.2: Junção de operadores.
● switch
switch( expressão lógico-artitmética)
{
case valor1: sequência de instruções quando a expressão assume valor1;
break;
case valor2: sequência de instruções quando a expressão assume valor2;
break;
:
:
case valorN: sequência de instruções quando a expressão assume
valorN;
break;
default : sequência para casos não contemplados;
}
Figura 4.25 e Figura 4.16 ilustram a tradução de uma instrução condicional,
destacada pela cor vermelha, em instruções da arquitetura ARM Thumb, em azul,
pelo compilador do GNU ARM toolchain.
Os fluxos de controle conhecidos como laços são aqueles que permitem não só
repetir uma sequência de instruções como também controlar a quantidade de
iterações desejada explicitamente ou condicionada a uma expressão
lógico-aritmética. A linguagem C dispõe dos seguintes comandos para controlar
estes fluxos:
● while
while (expressão lógica) {
sequência de instruções
}
● do
do {
sequência de instruções
} while (expressão lógica-aritmética);
● for
for (inicialização; expressão lógica-aritmética; condição) {
sequência de instruções
}
Finalmente, há dois comandos de quebra de fluxo que é muito útil em programas de
sistemas embarcados, embora os seus usos não sejam recomendados para um
programa bem estruturado [3]:
● goto: desvio incondicional para o endereço do rótulo
inicio: while (1) {
sequência de instruções 1
if (entrada) goto inicio;
sequência de instruções 2
}
● continue: interrompe o laço de iterações em que se encontra
while (1) {
sequência de instruções 1
if (entrada) continue;
sequência de instruções 2
}
4.9 Exercícios
1. Seja uma máquina de 32 bits cujas instruções tem tamanho de 4 bytes. Na
execução de uma sequência de instruções, como o contador de programa PC é
incrementado após a busca de uma instrução?
2. Quais dos seguintes microprocessadores tem a arquitetura CISC: x86, ARM,
Krait, MIPS, Motorola 68000, PDP-11? E quais são da arquitetura RISC?
3. Uma mesma instrução de uma linguagem assembly é traduzida em um mesmo
conjunto de sinais de controle em todas as máquinas que suportam o jogo de
instruções correspondente? Justifique.
4. Seja uma CPU de 32 bits. Qual seria a forma mais eficiente, em termos de
quantidade de acessos, para armazenar uma string de 51 caracteres? E se for
uma máquina de 8 bits?
5. O valor representado pelo número 0x5249 5343 5643 5055 (hexadecimal) deve
ser armazenado em uma palavra dupla alinhada de 64 bits.
a) Considerando que este valor armazenado seja lido byte a byte, escreva o
valor a ser armazenado usando a ordenação Big Endian.
b) Usando o mesmo arranjo físico da parte (a), escreva o valor para ser
armazenado usando a ordem de byte Little Endian.
c) Quais são os valores hexadecimais de todas as palavras desalinhadas de
2 bytes que pode ser lido a partir da palavra dupla de 64 bits fornecida
quando armazenado em ordem de byte Big Endian?
d) Quais são os valores hexadecimais de todas as palavras desalinhadas de
2 bytes que pode ser lido a partir da palavra dupla de 64 bits quando
armazenado em ordem de byte Little Endian?
e) Quais são os valores hexadecimais de todas as palavras de 4 bytes
desalinhadas que podem ser lidos a partir da palavra dupla de 64 bits
quando armazenado em ordem de byte Little Endian?
6. Seja um jogo de instruções ARM Thumb onde 8 registradores são endereçáveis e
de organização register-register. Sabendo que são
a) 5 bits reservados para opcode de deslocamento de n bits para esquerda
pelo modo imediato, qual é a quantidade máxima de bits que se pode
programar com a instrução?
b) 6 bits reservados para opcode de soma de três operandos, dois
armazenados nos registradores e um terceiro endereçável por um dos
modos definido por um bit reservado para o modo de endereçamento.
Qual é o tamanho do terceiro operando se o modo de endereçamento for
por registrador? E se for endereçado pelo modo imediato?
7. Dada uma sequência de instruções, entre as quais temos uma instrução de
desvio condicional. O que pode acontecer de segmentarmos esta instrução e
paralelizar os seus segmentos com segmentos de outras instruções?
8. Qual é a função dos registradores entre os segmentos de uma instrução
lógico-aritmética na Figura 4.15?
9. Sendo a GPU uma unidade processadora, dedicada ao processamento gráfico,
podemos remover o microprocessador da placa-mãe, passando o controle do
sistema computacional integralmente para ela? E em relação a um processador
DSP32C da Lucent, o DPS32C pode assumir o controle de um sistema
computacional? Justifique suas respostas.
10. Interrupções são eventos que podem acontecer de forma assíncrona ao fluxo de
controle pré-programado. É possível predizer os instantes em que ocorrem tais
eventos e inserir as suas chamadas nos pontos apropriados de um programa
sequencial? Qual é a solução mais aplicada para tratá-los nos sistemas atuais?
11. Condições de corrida, impasse e inanição de recursos são três situações que
podem ocorrer numa execução concorrente de processos. Vimos na Seção 4.7
que o chipset é responsável pelo fluxo de dados entre a CPU e o restante do
sistema computacional. Se conectarmos, através do chipset, à CPU uma
impressora e um led cujo estado alterna a uma frequência de 1KHz quando se
inicia um processo de impressão e vá para o estado apagado quando se conclui
uma impressão. Podem ocorrer condições de corrida, impasse e inanição de
recursos numa impressão de um arquivo? Explique.
12. Qual configuração você escolheria na compra de um novo PC com SO Windows?
Um PC com um processador dual- ou quad-core 2.8GHz ou um com um
processador single-core 3.4GHz? Justifique.
13. A velocidade da execução da BIOS reduz com o aumento da velocidade da CPU?
Justifique.
14. Para emitir os sinais sonoros de alerta pelos erros detectados na inicialização de
um sistema computacional, não seria mais simples usar uma das funções de
tempo disponíveis em sistemas operacionais? Justifique.
15. Entre os circuitos eletrônicos integrados e um aplicativo há vários níveis de
abstração de um sistema operacionais tanto na camada de hardware quanto na
camada de software. Quais são os níveis na camada de hardware? E quais na
camada de software?
16. Uma mesma instrução de controle da linguagem C é traduzida sempre para uma
mesma sequência de instruções em linguagem de máquina quando as máquinas
tiverem a mesma CPU?
17. Analise as traduções das instruções de controle em linguagem C para linguagem
de máquina ARM Thumb mostradas na Seção 4.8.3. Quais são as instruções
usadas na linguagem de montagem para controlar desvios de um fluxo de
controle sequencial?
4.10 Referências