Baixe o app para aproveitar ainda mais
Prévia do material em texto
MICROPROCESSADORES Maikon Lucian Lenz Arquitetura computacional básica Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Analisar as arquiteturas Harvard, Von-Neumann, RISC e CISC. � Caracterizar a arquitetura básica de microcontroladores. � Descrever dispositivos de memórias. Introdução Sistemas de computação podem ser classificados quanto a sua arquitetura geral de fluxo de dados, a arquitetura interna do processador e a com- plexidade 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. Neste capítulo você conhecerá as arquiteturas Harvard, Von-Neumann, RISC e CISC. Além disso, você aprenderá a caracterizar a arquitetura básica de microcontroladores e a descrever dispositivos de memórias. Arquiteturas de computadores 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 (TOKHEIM, 2013). 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 Har- vard e Von-Neumann, e para compreender cada uma delas, se faz necessário entender a sequência básica de funcionamento de processamento. 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. 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 (SOUZA, 2003). 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 (SOUZA, 2003). 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. Arquitetura computacional básica2 Figura 1. (a) Arquitetura Von-Neumann. (b) Arquitetura Harvard. Fonte: (a) Weber (2012, p. 38). RISC versus CISC Além da arquitetura geral de computadores, os microprocessadores são clas- sificados quanto à sua arquitetura interna. Um processador do tipo RISC (reduced instruction set computer, ou com- putador 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. 3Arquitetura computacional básica Outras características podem ser consultadas no comparativo do Quadro 1. RISC CISC Acesso à memória Poucos comandos referenciam a memória diretamente. Qualquer comando pode referenciar a memória. Programa Grande e com instruções simples. Pequeno com instruções complexas. Formato de instruções Apenas um ciclo de máquina e tamanho fixo. Pode levar vários ciclos de máquina e tem tamanhos variáveis. Endereçamento Poucas formas de endereçamento. Muitas formas de endereçamento. Pipeline (busca de mais de uma instrução) Bastante utilizado. Pouco utilizado. Complexidade Na compilação. No hardware. Resposta à interrupção Rápida. Lenta. Quadro 1. RISC versus CISC Uma simples soma entre dois valores de endereços de memória distintos pode ne- cessitar quatro vezes mais instruções para um processador RISC quando comparado a um processador CISC. O RISC dispõe apenas de instruções simples e não consegue acessar a memória diretamente na maioria delas. A soma entre os valores de endereço M1 e M2 e posterior armazenamento no endereço M1 teria o aspecto para um processador CISC como descrito abaixo: SOMA M1, M2 Arquitetura computacional básica4 Já para um processador RISC, o mesmo procedimento demandaria o carregamento dos valores da memória para registradores antes da operação e se pareceria com as linhas de instrução que seguem: CARREGAR M1, A CARREGAR M2, B SOMA A, B SALVAR A, M1 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 proces- sador, 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 microcon- trolador. 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, em que as portas XOR retornam 1 se qualquer um dos bits de entrada for 1 ou todos os três forem 1; do contrário o resultado da soma deverá ser 0. Já a saída denominada carry out (Co) apresenta a sobra decorrente da soma e será 1 sempre que duas ou mais entradas forem iguais a 1. Assim, é possível efetuar a soma entre dois bits A e B, considerando a sobra de uma soma anterior (carry in) e fornecendo como resposta o resultado da soma para aquela posição binária e a sobra para posições seguintes. 5Arquitetura computacional básica Figura 2. Circuito lógico de um somador completo. Fonte: Weber (2012, p. 155). Somas maiores que 1 bit podem utilizar vários circuitos de somador com- pleto 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 paradesempenhar 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; todos recebem A e B em suas entradas (exceto a lógica NOT, que só requer uma entrada). É selecionada a saída de apenas um circuito com o uso de um multiplexador. O multiplexador da Figura 3 conecta a saída S a saída do circuito a ser escolhido pela combinação binária presente no barramento denominado Sel. Uma vez que o multiplexador seleciona quatro entradas diferentes para uma única saída, serão necessários dois bits para selecionar entre as quatro opções possíveis. Cada uma das combinações 00, 01, 10 e 11 fará com que o multi- plexador conecte a saída a um dispositivo diferente. Arquitetura computacional básica6 Figura 3. Unidade de lógica e aritmética de quatro funções com multiplexador para compartilhar o barramento de saída. Fonte: Weber (2012, p. 156). A UC faz uso de registradores, partes reservadas de memória que a au- xiliam no sequenciamento das funções. Para que seja possível executar uma instrução e ao final avançar para o endereço de memória seguinte, executando assim a próxima instrução da sequência, é necessário que um hardware seja dedicado a contagem desta posição de memória. Este elemento é normalmente conhecido como PC (program counter, ou contador de programa) e aponta para o endereço de memória da instrução que se deve executar a cada momento. Quem ordena o incremento da posição de memória é a própria UC ao sinalizar a conclusão de mais uma instrução. 7Arquitetura computacional básica 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 execu- tada. 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. Existem situações em que é necessário saltar para outras posições do código, por exemplo, quando existe uma condição a ser verificada que decidirá qual instrução será executada na sequência. Imagine que você esteja utilizando um microcontrolador para acender um LED sempre que um botão estiver pressionado. Ambos os elementos estarão conectados a algum terminal do microcontrolador e terão seus estados lógicos (ligado/desligado) representados em um endereço de memória conhecido. O código deverá ser escrito de modo que, se o valor encontrado no endereço de memória correspondente ao botão for nível lógico alto, o endereço de memória correspondente ao LED também será. O compilador não é capaz de alterar a ordem do código em tempo real e cada instrução terá uma posição fixa na memória do programa, seja para ligar ou desligar o LED. Entretanto, existem instruções que servirão para alterar o valor do contador de programa de forma direta. Assim, neste teste, caso o botão seja verdadeiro, o programa poderia seguir para a instrução seguinte e acionar o LED, do contrário teria que saltar para uma posição mais distante, ignorando o acionamento do LED. Instruções que envolvem mudanças na sequência de execução do código são definidas como instruções de salto, como o comando GOTO, por exemplo. Arquitetura computacional básica8 Um programa simples deve optar entre duas execuções: ACAO_1 ou ACAO_2. Caso a CONDICAO (endereço 1) seja verdadeira, a ACAO_1 deverá ser executada; caso contrário, deve-se executar a ACAO_2. O código poderia ser escrito desta maneira: SE CONDICAO = VERDADEIRA ENTÃO ACAO _ 1 CASO CONTRARIO ACAO _ 2 O compilador, reconhecendo a sintaxe, traduziria para algo em um microcontrolador PIC como: BTFSC 1, 0 CALL ACAO _ 1 BTFSS 1, 1 CALL ACAO _ 2 em que a função BTFSC testa o bit 0 do endereço de memória 1. Caso seja 0 (falso), salta uma linha na ordem de execução. O teste é feito agora para saber se é verdadeiro, executando a linha seguinte e, portanto, a instrução CALL, que chamará a função ACAO_2. Caso para BTFSC o endereço de memória 1 seja 1 (verdadeiro), a linha imediatamente a seguir será executada, chamando pelo comando CALL a ACAO_1 e na próxima instrução BTFSS falhará e saltará a chamada da ACAO_2. No entanto, alguns saltos de memória podem ser mais complexos, como a execução de uma função. A função é um trecho de código que pode ser executado ou utilizado em momentos e partes diferentes da execução. É muitas vezes utilizada para evitar que um procedimento que é utilizado muitas vezes não precise ser programado novamente, reduzindo a quantidade de memória necessária. 9Arquitetura computacional básica Um salto por chamada de função deve retornar ao ponto original em que foi chamado ao terminar sua própria execução. Logo, o microcontrolador deverá não apenas mudar de posição de memória, mas lembrar de onde vem, pois uma vez alterado o endereço de memória do contador de programa, ele seguirá incrementando daquele endereço em diante. Para estas situações, os processadores fazem uso da pilha (ou stack). A pilha corresponde a um grupo de endereços de memória reservados, ou como é o caso dos microcontroladores PIC, uma memória separada do restante, dedicada a utilização pela unidade de controle durante as chamadas de função. Nela são armazenados o endereço atual do contador de programa, toda vez que uma chamada de função é invocada. Como a pilha opera no modo LIFO (last in first out, ou último a entrar, primeiro a sair), ao término da execução da função, a unidade de controle buscará na pilha o endereço de memória mais recente desde seu último salto de memória e ordenará o retorno do contador de programa para este endereço antes do próximo incremento de posição (PEREIRA, 2007). Os microcontroladores possuem uma quantidade de memória finita. Ultra- passar este limite impossibilitará o desenvolvimento adequado do programa. O mesmo é válido para os endereços de memória dedicados à pilha. O resultado prático de tentar armazenar mais informação na pilha que o suportado será o de sobrescrever os valores mais antigos resultantes das primeiras chamadas de função que ainda não retornaram. Neste caso, o processador será incapaz de seguir a sequência determinada pelo programador e a execução seguirá outros rumos com resultados inesperados. Dispositivos de memória Assim como o processador, as memórias também derivam de portas lógicas ou de outros componentes que operem de forma discreta. O dispositivo mais básico de memória é o flip-flop do tipo D (TOKHEIM, 2013). Um flip-flop simples pode ser construído a partir de portas lógicas NAND, como o flip-flop do tipo D da Figura 4. Trata-se de um sistema sequencial, já que a definição dos estados de entrada de um componente não é mais sufi- ciente para determinar a saída do dispositivo. Repare que existem pontos de realimentação, em que o próprio sinal de saída de um circuitoretorna para a entrada. Em outras palavras, a sequência com a qual as entradas são alteradas importa não somente o valor presente de cada uma delas, como ocorria com a combinação de portas lógicas sem retorno nos sistemas de combinação. Arquitetura computacional básica10 Figura 4. Flip-flop do tipo D construído a partir de portas lógicas. Fonte: Weber (2012, p. 150). Uma porta NAND resultará em 1 na saída sempre que uma de suas entradas for 0. Caso o pino D receba 1 e o pino C (clock) também, a primeira porta NAND alimentará a porta seguinte com uma entrada igual a 0, forçando a saída (Q) para 1. A saída Q, por sua vez, retroalimenta a porta de saída Q’, que receberá na outra entrada também o valor 1 da NAND anterior, resultando em uma saída igual a 0. O 0 da saída Q’, por sua vez, garantirá que a porta NAND de saída Q se mantenha em 1 até que um novo pulso de C habilite uma eventual mudança de estado. Pode-se observar que, sempre que houver um pulso de C, o estado da saída Q será o mesmo do pino D. O pino de C, neste caso, pode ser utilizado pelo circuito oscilado do sistema, ou como um pino de habilitação, o que será muito útil para criar unidades de memória maiores com endereçamento de palavras (WEBER, 2012). Vários desses flip-flops D podem ser ligados a um mesmo terminal de dados e selecionados a partir do pino de C que habilite a recepção do sinal presente na entrada deste, de modo que somente o flip-flop habilitado receberá o dado presente no barramento. A memória será organizada a partir de um tamanho fixo de palavra, que pode variar de um microcontrolador para outro, sendo mais comum os tamanhos de 8, 16 e 32 bits. Outros padrões menos comuns podem ser observados, como a estrutura de memória de programa de 14 bits em alguns microcontroladores PIC para atender de forma eficiente a quantidade de instruções demandadas. Cada palavra de memória corresponderá a um endereço, sendo estes en- dereços acessados com o auxílio de multiplexadores e demultiplexadores para reduzir a quantidade de conexões e compartilhar o mesmo barramento 11Arquitetura computacional básica de dados a todos eles. Estes dispositivos irão direcionar o barramento a um grupo ou endereço específico de memória (Figura 5). Figura 5. Memória distribuída em forma de matriz para diminuir a quantidade de barra- mentos de dados e endereços. Fonte: Weber (2012, p. 178). Outros mecanismos podem ser utilizados para criar unidades de memória voláteis, com o auxílio de capacitores, amplificadores operacionais, divisores de corrente, entre outros. Também existem mecanismos que não demandam o fornecimento de energia elétrica constante, que são memórias não voláteis normalmente utilizadas para armazenar o código do programa. Técnicas de armazenamento de informação persistente incluem fitas mag- néticas, CDs, DVDs, FLASH e outros. Segundo Pereira (2007), os tipos de memória de programa mais utilizadas em microcontroladores são: � ROM, em que o código é gravado durante a produção do dispositivo e não pode ser apagado; � PROM, que permite a gravação pelo programador, mas não é apagável; Arquitetura computacional básica12 � EPROM, que permite apagar os dados, mas com intervenção diferente da utilizada para gravá-los; � FLASH, o tipo mais maleável, já que permite gravar e apagar utilizando os mesmos mecanismos. Memórias do tipo EEPROM se assemelham muito à condição da memória FLASH, com a diferença de que as memórias FLASH são capazes somente de apagar a informação em blocos, ao contrário da EEPROM. O tamanho das instruções em alguns modelos de microcontroladores pode não ser suficiente para cobrir todos os endereços de memória existentes no modelo. Na família PIC este problema pode ser contornado ao dividir a me- mória em bancos. Assim, antes de acessar um determinado endereço, deve-se selecionar ou confirmar qual o banco de memória que se está manipulando (PEREIRA, 2007). Devido à paginação, ou divisão da memória em bancos, alguns registradores de uso frequente terão endereços replicados em cada página da memória para evitar a mudança excessiva, seja para leitura ou gravação desta. A memória de dados, apesar de volátil, pode ter endereços reservados para finalidades específicas do próprio microcontrolador. Estes endereços podem ou não ser acessíveis ao programador. A diferença é que manipular os dados de um endereço reservado pode alterar o funcionamento do microcontrolador. Estes endereços são normalmente tratados como registradores e aqueles que possuem algum vínculo determinado com alguma função ou elemento do componente são conhecidos como registradores de funções especiais. Os demais estão livres para finalidades diversas. Um microcontrolador pode, por exemplo, disponibilizar um hardware de temporização para evitar que o próprio processador tenha que calcular a temporização, o que demandaria mais processamento. A forma como o microcontrolador interage com o hardware dedicado é compartilhando um endereço de memória para sua configuração e respostas geradas. Uma tem- porização irá demandar informações como frequência de contagem, valor 13Arquitetura computacional básica inicial, borda do sinal de clock a ser usada como referência, se subindo, ou descendo, entre outros. Cada uma dessas informações corresponde a algum bit de um registrador ou registrador inteiro, que nada mais é que um endereço de memória alocado para aquela funcionalidade específica. Na lista de instruções, a estrutura do comando costuma denominar os dígitos em f como referentes ao endereço na memória do registrador que se deseja atribuir ou receber algum valor. Registradores de funções especiais Podem existir diversos registradores, alguns mais comuns e de uso mais amplo que outros. Os mais utilizados para os microcontroladores são acumulador, status/flag, interrupções e dispositivos de entrada e saída. O registrador acumulador, também conhecido como registrador de trabalho, ou simplesmente W (de work, trabalho em inglês), é utilizado regularmente como entrada para alguma operação, resultado completo da operação até que alguma outra instrução ordene a gravação do conteúdo do registrador W em um endereço não volátil de memória. Na operação de multiplicação mais simples, repetindo somas, o registrador W deveria armazenar o resultado de cada soma, ao mesmo tempo em que alimenta também a entrada do circuito de soma. Um registrador de STATUS pode ter uma linguagem e um funcionamento bastante divergente de um para o outro. Em geral, este registrador atua em conjunto com a ULA para determinar quando algum evento inesperado ou limite de alguma operação foi atingido. Isto é válido para sinalizar que a soma resultante extrapolou o valor máximo identificável, que uma subtração resultou em um número negativo (o que indicaria que o subtraendo é menor que o minuendo), para a detecção de verdadeiro (1) ou falso (0). O registrador INTCON controla e monitora as interrupções, que nada mais são do que um hardware paralelo, de algum periférico, alertando que concluiu seu serviço e que os dados obtidos pelo módulo já estão adequadamente salvos na memória RAM. Por fim, alguns endereços reservados têm vínculo prático direto com o ambiente externo. É o caso dos módulos PORT, na família PIC. Modificar o valor do endereço de memória vinculado a algum pino de saída digital fará com que o nível lógico observado nesse pino acompanhe a memória. O processo inverso também é verdadeiro, ou seja, pode-se identificar o nível lógico existente em um terminal qualquer. Arquitetura computacional básica14 Mesmo reservados para finalidades específicas, alguns destes registradores poderão ser acessados ou não pelo usuário, dependendo da finalidade. Muitos deles armazenam informações de configuração do funcionamento do módulo e necessitam que o programador informe as condições. Outros, no entanto, são manipulados exclusiva- mente pelo módulo e são bloqueados para acesso direto do programadorpara evitar instabilidades e outros problemas. PEREIRA, F. Microcontroladores PIC: técnicas avançadas. 6. ed. São Paulo: Érica, 2007. 368 p. SOUZA, D. J. Desbravando o PIC: ampliado e atualizado para PIC16F628A. 6. ed. São Paulo: Érica, 2003. 268 p. TOKHEIM, R. Fundamentos de eletrônica digital: sistemas sequenciais. Porto Alegre: AMGH; Bookman, 2013. v. 2. 274 p. (Série Tekne). WEBER, R. F. Fundamentos de arquitetura de computadores. 4. ed. Porto Alegre: Bookman, 2012. 424 p. (Série Livros Didáticos Informática UFRGS). Leituras recomendadas PEREIRA, F. Microcontrolador PIC 18 detalhado: hardware e software. São Paulo: Érica, 2010. 304 p. PINHEIRO, F. A. C. Elementos de programação em C: em conformidade com o padrão ISO/IEC 9899. Porto Alegre: Bookman, 2012. 548 p. 15Arquitetura computacional básica
Compartilhar