Skip to content. Skip to navigation

Eletronica.org

Sections
Personal tools
You are here: Home Artigos Eletrônica Digital e Sistemas Embarcados Interrupções e DMA

Document Actions

Interrupções e DMA

by Suporte Eletronica .org last modified 05/05/2008 01:00

Interrupções e DMA são muito importantes para a operação de sistemas microprocessados, pois possibilitam ao microprocessador responder rapidamente a seus dispositivos de entrada e saída (E/S).

Interrupções e DMA são muito importantes para a operação de sistemas microprocessados, pois possibilitam ao microprocessador responder rapidamente a seus dispositivos de entrada e saída (E/S).

A importância dessas abordagens pode ser entendida comparando-as a uma campainha. Se uma porta não tiver nenhum dispositivo para chamar a atenção (como uma campainha), é necessário ir até a porta para verificar se não existe ninguém à porta. Com uma campainha, precisa-se ir até a porta apenas quando a campainha toca. Caso tenha-se um mordomo, nem é necessário ir até a porta. Do mesmo modo, não é eficiente esperar que o microprocessador verifique se seus periféricos requerem atenção. Para isto existem as interrupções, que são como campainhas que avisam ao microprocessador que algum dispositivo necessita dele. Assim, o DMA pode ser comparado ao mordomo que vai abrir a porta deixando o microprocessador livre para outras tarefas. Ambas as abordagens têm vantagens e desvantagens, por isso é necessário conhecer-se bem cada uma delas.

Interrupções
Durante a execução normal do programa, as instruções são lidas da memória e executadas de acordo com o fluxo normal do programa. O processador usa um registrador especial chamado de apontador de instrução (IP) para sinalizar a próxima instrução a ser executada. Um conjunto de registradores de propósito geral é usado para manipular e armazenar temporariamente algum dado usado pelo programa.

Quando o microprocessador recebe um sinal de interrupção, o processador executa a corrente instrução e salva o IP, juntamente como todos os outros registradores, na pilha. Em seguida, vai para uma rotina especial chamada de “rotina de tratamento de interrupção”. Nesta rotina encontra-se todas as instruções necessárias para atender as necessidades do dispositivo que requisitou a interrupção. A última instrução executada por esta rotina é uma instrução de retorno (RTI). Esta instrução força o microprocessador a restaurar o IP e todos os demais registradores, com os valores salvos na pilha. Dessa forma, após atender a interrupção, o microprocessador volta ao estado que estava antes da requisição de interrupção (IRQ).

Como pode ser notado, a interrupção requer um certo tempo de processamento. Este tempo é necessário para que a CPU salve os registradores na pilha e vá para a rotina de tratamento de interrupção. Por isso, durante o projeto do sistema o tempo de sobre carga, conhecido também como tempo de latência, precisa ser estimado. Se o tempo de latência for muito elevado para a aplicação, outro método tem que ser estudado.

Interrupções na família 80x86
Todas as pastilhas Intel possuem dois níveis de interrupção, mascarável e não-mascarável. As interrupções não-mascaráveis são usadas para sinalizar “quase catástrofes”, como um erro de paridade de memória. Todos os dispositivos de E/S utilizam interrupções mascaráveis.

As interrupções de “hardware” são coordenadas através do chip 8259A, que permite até 8 interrupções com prioridade. Quando um dispositivo necessita efetuar alguma operação (geralmente de entrada/saída) ele envia um sinal (IRQ), em seguida o 8259A põe sua saída (INT) em nível alto. Esta saída é conectada ao microprocessador no pino INTR, este pino é usado pelo microprocessador para sinalizar uma interrupção mascarável. Se o bit de interrupção (IF) do registrador FLAGS estiver setado, o microprocessador envia um sinal (INTA) de volta ao 8259A. Ao receber este sinal, o controlador coloca um número inteiro no barramento, este número é usado para identificar o tipo de dispositivo e é chamado de vetor de interrupção. A CPU então usa este número para indexar uma tabela de 256 entradas para encontrar o endereço da rotina de tratamento de interrupção.

Um chip 8259A possui 8 níveis de prioridade (IRQ0 até IRQ7). Com este controlador de interrupção, quando a primeira interrupção acontece, por exemplo, a IRQX, a CPU é interrompida. Se uma interrupção subseqüente de maior prioridade ocorrer, o 8259A interrompe a CPU pela segunda vez. Se a interrupção tiver prioridade menor, ela é suspensa até a primeira terminar. Para isto, a rotina de interrupção deve enviar explicitamente um comando para o 8259A para informar quando terminar.

DMA
O DMA (Acesso Direto à Memória) é um dispositivo útil e poderoso para transferir dados entre dispositivos de E/S, ou entre dispositivo de E/S e a memória. Esta transferência ocorre muito rapidamente porque uma peça de “hardware” dedicada transfere dados de uma parte do computador para outra em apenas um ou dois ciclos de E/S por dado transferido. O DMA também minimiza a latência em atender um dispositivo de E/S, pois um “hardware” dedicado responde mais rapidamente que interrupções, e o tempo de transferência é curto. Logo, a quantidade de memória temporária necessária nos dispositivos de E/S é reduzida. Além disso, o DMA também diminui a carga da CPU, pois ela não tem que executar instrução alguma para transferir dados. Portanto, o processador não é usado para gerenciar a transmissão e fica disponível para outras atividades. Isto é ainda mais importante em sistemas nos quais o microprocessador opera primariamente na sua memória “cache”, neste caso a transferência ocorre em paralelo, logo a performance geral do sistema é melhorada.

Como o DMA funciona
Um controlador de DMA gerencia vários canais de DMA, cada canal pode ser programado para realizar uma seqüência de transferências. Dispositivos, normalmente periféricos de E/S, que necessitam enviar ou receber dados sinalizam para o controlador de DMA enviando um sinal de requisição de DMA (DRQX, com X igual ao número do canal). Um sinal de DRQX para cada canal é roteado para o controlador. Este sinal é monitorado e respondido da mesma forma que o processador gerencia interrupções. Quando o controlador de DMA recebe o sinal de requisição de DMA (DRQX), o controlador responde realizando uma ou mais transferências do dispositivo de E/S para a memória ou vice versa. Os canais do DMA precisam ser habilitados pelo processador para que o controlador de DMA responda aos sinais de DRQX. O número de operações efetuadas, modos de transferências usados, e locações de memória possíveis dependem de como os canais de DMA são programados.

Um controlador de DMA tipicamente compartilha a memória do sistema com a CPU e pode operar como mestre ou escravo. Operando como mestre, o controlador assume o comando do barramento do sistema (linhas de endereço, dados e controle) para realizar as transferências.

Operando como escravo, o controlador de DMA é acessado pela CPU, que programa os registradores internos ao controlador para configurar a transferência. Estes consistem dos registradores de endereço fonte e destino e contador de transferências, para cada canal de DMA, assim como um registrador de status para configuração e monitoramento da operação do controlador.

Tipos e modos de transferências
Controladores de DMA variam de acordo com os tipos de transferências e modo suportados. Os dois tipos de transferência são o “flyby” e o “fetch-and-deposit”. Os três modos mais comuns são o “sigle”, “block”, e “demand”. Todos esses tipos e modos são descritos a seguir.

O tipo de transferência mais rápida é o “flyby”. Neste caso, uma única operação de barramento é usada para a transferência, com os dados lidos da fonte e escritos no destino simultaneamente. O dispositivo envia um sinal de DRQX para o canal apropriado, em seguida o controlador toma o controle do barramento e envia um sinal para o dispositivo (sinal DACKX, com X igual ao número do canal). Este sinal avisa-o para ler o dado do barramento ou coloca-lo no barramento, dependendo da direção da transferência. Em outras palavras, este tipo de transferência ocorre como uma operação de E/S na memória, e apenas um ciclo de memória é utilizado. Apesar de muito eficiente, este tipo de operação não pode transferir dados da memória para a memória.

O segundo tipo de transferência é chamado de “fetch-and-deposit”. Neste caso, são envolvidos dois ciclos de memória ou de E/S. Os dados são inicialmente lidos dos dispositivos ou da memória e são armazenados em registradores internos ao controlador de DMA. Os dados são então escritos na memória ou no dispositivo de E/S no próximo ciclo. Apesar de ineficiente, pois utiliza dois ciclos de memória, este tipo de transferência é útil para transferir dados entre dispositivos incompatíveis. Por exemplo, um controlador de DMA pode efetuar duas leituras de 16 bits em um local seguida de uma escrita de 32 bits. Diferente do tipo “flyby”, o “fetch-and-deposit” pode ser usado para operações entre a memória e a memória.

Além dos tipos de transferência, um controlador de DMA pode suportar um ou mais modos de transferência. Os mais comuns são o “sigle”, “block”, e “demand”. O modo “sigle” é o mais lento, pois, neste caso, o DMA transfere um único dado para cada sinal de DRQX. Isto pode não ser problema para sistema com pouca demanda de barramento, porém pode causar sérios problemas de latência quando múltiplos dispositivos tentam acessar o barramento. Os modos “block” e “demand” podem ser mais eficientes, pois permitem realizar várias transferências quando o DMA ganha o controle do barramento. No modo “block”, em resposta a um único sinal de DRQ, o DMA realiza múltiplas transferências de acordo com seu registrador contador. No modo “demand”, o DMA realiza transferências enquanto o dispositivo sustentar o sinal de DRQ.

Operação do controlador
Para cada canal, o controlador de DMA armazena os endereços e o contador programados nos registradores de base e matem uma cópia dessas informações nos registradores de endereço corrente e no de contador corrente. Cada canal é habilitado ou inibido através do registrador de mascara. Quando o DMA é iniciado escrevendo-se nos registradores de base e habilitando-se o canal, os registradores correntes (de endereço e contador). A cada transferência, o valor no registrador de endereço corrente é colocado no barramento, em seguida o registrador é incrementado ou decrementado. O contador corrente determina o número de transferências remanescentes e é automaticamente decrementado a cada transferência. Quando o valor deste registrador passa de 0 para -1, um sinal chamado “terminal count” (TC) é gerado. Isto significa que o DMA completou a seqüência de transferências. Este sinal pode ser monitorado pelos dispositivos de E/S que participam da transferência.

O controlador de DMA necessita de programação a cada sinal TC. Quando este sinal ocorre, a CPU precisa programar o DMA para uma nova transferência. Para isto, alguns controladores de DMA interrompem a CPU à cada da fim de transferência. Logo, o controlador consome algum tempo da CPU, mas muito menos que o consumido por serviço de E/S baseados em interrupções. Alguns controladores possuem mecanismos de auto-configuração. Geralmente, quanto mais sofisticado for o controlador, menos tempo da CPU ele vai consumir para realizar esta configuração.

Um controlador de DMA tem um ou mais registradores de status que são lidos pela CPU para determinar o estado de cada canal. Este registrador geralmente indica quando um canal foi requisitado e quando o canal envia um TC. Contudo, ler um registrador de status sempre elimina a informação do TC do registrador, o que pode provocar problemas se múltiplos dispositivos estão tentando usar canais diferentes.

Gerenciando o controlador de DMA
O DMA é um recurso compartilhado e pode se usado por aplicações complemente diferentes, logo precisa ser propriamente gerenciado. As maiores preocupações são manter as informações de status coerentes e controlar a transferência dos dados, visto que não existe suporte por parte do sistema operacional para operações com DMA.

O controlador de DMA usado nos microcomputadores PC e compatíveis é o chip 8237A. Este possui registradores de programação de 16 bits, porém são programados através de uma porta de 8 bits. Para isto, existe um registrador apontador que define quais das duas posições receberá cada operações de 8 bits de leitura ou escrita. Evidentemente, para evitar conflitos, o registrador apontador deve ser “limpo” e as interrupções interrompidas antes de cada operação de leitura ou escrita.

Outro problema envolve a determinação de fim de transferência do DMA. Cada canal de DMA tem um bit de TC no registrador de status, infelizmente uma leitura neste registrador limpa o bit de TC de todos os canais. Logo, o dispositivo de E/S tem que achar outra forma de saber o fim de transferência de DMA. No caso do PC e do AT, isto é feito através de um cartão de E/S que trabalha como um “DMA slave” e gera um IRQ para cada canal de DMA.

Conclusão
A técnica de interrupção é imprescindível para realizar operações de entrada e saída em grandes sistemas microprocessados. Caso ela não seja aplicada, o microprocessador tem que verificar constantemente a existência de um novo dado. Contudo, em sistemas de baixa velocidade, isto pode ser aceitável.

A transferência de dados via DMA é essencialmente mais rápida que as outras abordagens. Devido principalmente a pouca (ou nenhuma) interferência da CPU. No entanto, a configuração de um controlador de DMA é um pouco complicada e susceptível a erros. Mesmo nos microcomputadores não existe suporte, por parte do sistema operacional, para este tipo de transferência. Por isso, deve ser usado com cautela.

Autor: José Alexandre de França ( webmaster@eeol.org ).
Texto original localizado em: http://www.eeol.org





Acesso rápido: Lista Completa de Projetos | Diretório de Artigos | Apostilas & E-Books | Política de Privacidade

Publicidade

 
Assine o informativo Eletronica.org Grupos de Usuários O'Reilly

Log in


Forgot your password?
New user?
Recent Changes
All recent changes…
Conheça Também
Sites em Português
  - Neoradix
  - DQSoft
  - Gabiarra
  - SafiraTec
  - Feira de Ciências
  - RoboFEI
  - Transistor548
  - Rogercom.com
  - Pise na Grama
  - Electronics.com.br
  - Tecnocientista.info

Listas em Português
  - PicListBrasil
  - SisEembarcados

Sites em Inglês
  - Embedded.com
  - Hack a Day
  - Electr. Design
  - Arch Embedded!



[O que é isso?]
 

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: