Como o controlador sabe quando pular para o ISR?


12

Estou falando de coisas no nível central.

Tanto quanto eu entendo, o núcleo do controlador apenas executa instruções que são buscadas na memória (Buscar - Decodificar - Executar). Quando uma interrupção chega, como o núcleo / ALU decide pular para o ISR?

Como nós, ou o compilador, não adicionamos nenhuma instrução para pesquisar o status da interrupção - então como ele sabe que uma interrupção precisa ser atendida?

Respostas:


13

O que você está perdendo é que o núcleo faz mais do que apenas executar códigos de operação que são buscados na memória. Possui lógica específica para implementar interrupções.

Quando o hardware de detecção de interrupção afirma o sinal que indica que é hora de interromper, geralmente uma instrução especial é atolada no núcleo que nunca foi buscado na memória. Na maioria dos casos, esta é uma instrução CALL para o endereço do vetor de interrupção. Isso usa o mecanismo de execução de instruções existente para salvar o PC atual na pilha de chamadas e alterá-lo para o endereço do vetor de interrupção. Ele também lida com o descarte de instruções pré-buscadas e similares.

A lógica especial de tomada de interrupção também precisa desativar as interrupções de tal maneira que a mesma condição de interrupção não cause outra chamada para o endereço do vetor de interrupção no próximo ciclo. Processadores diferentes têm maneiras diferentes de lidar com isso. O mais simples é desabilitar as interrupções de maneira simples, exigindo que o software as reative no final da rotina do serviço de interrupções. Outros processadores têm um nível de prioridade de interrupção. Esse nível é aumentado para que apenas condições de interrupção de maior prioridade possam causar uma nova interrupção. A prioridade de interrupção é algo que é automaticamente salvo junto com o endereço de retorno da CHAMADA e restaurado quando o código retorna da interrupção.


1
Freqüentemente, não é uma CALLinstrução comum , pois as interrupções são terminadas de maneira diferente (cf. RETvs. RETI).
glglgl

1
Posso assumir com segurança que, quando esse hardware de detecção de interrupção afirma o sinal, em vez de memória, a CPU recebe instruções de outro lugar para pular ... Como um switch, talvez ... Quando o interruptor está desativado, busque instruções na memória e quando o interruptor estiver ligado , Executar esta instrução?
Swanand

3

Geralmente, nos microcontroladores modernos, existe uma unidade de controlador de interrupção (IC) dedicada, encarregada de gerenciar interrupções. Além disso, cada componente periférico tem uma saída de interrupção (s) que vai desde 0a 1(ou vice-versa), se alguma condição aplicar (por exemplo este periférico completado algum trabalho). Esta saída está conectada ao controlador de interrupção. A CoreCPU pode dizer ao IC para ignorar essa interrupção específica (mascará-la) ou para notificar o MCU sempre que isso ocorrer, acionando sinais específicos, e então o MCU decide o que fazer com ele. A maneira mais comum é fazer com que o IC informe ao MCU qual interrupção aconteceu e pule para o código de manipulação correspondente.


2

Há um hardware no núcleo do computador que obstrui um novo valor no contador do programa que corresponde à interrupção específica que foi acionada. Para lembrar para onde voltar após a conclusão da rotina de interrupção, o valor atual no contador de programa é empurrado para a pilha antes que o hardware atole o endereço de interrupção no contador de programa. Quando a rotina de interrupção é concluída, o valor original do contador de programa é restaurado novamente para fora da pilha.

Os valores para congestionar o contador do programa no momento da interrupção geralmente são determinados por um dos dois esquemas. Uma abordagem congestiona um endereço fixo para cada tipo de interrupção no contador do programa e o núcleo do computador começa a executar a partir desse local fixo. O espaço no local fixo geralmente é limitado em tamanho; portanto, é comum codificar uma instrução de salto nos endereços fixos que vão para o local real do serviço de interrupção. O outro esquema usa algo chamado tabela de vetor de interrupção. Aqui, o hardware gera um deslocamento de endereço fixo na tabela vetorial com base no tipo de interrupção. O hardware então extrai o conteúdo no local da tabela e usa esse valor como um endereço para atolar no contador do programa.


2

O controlador possui um registro para o contador de programa que monitora o endereço onde a instrução a ser executada em seguida está armazenada. (Este registro também é gravado quando um salto é executado.)

O controlador possui um vetor de interrupção (ou algumas vezes mais de um, dependendo do tipo de interrupção), que é o endereço em que o ISR está armazenado. Esse endereço é sempre o mesmo - é como o vetor de redefinição, onde o programa é iniciado.

(Muitas vezes, há uma instrução de salto armazenada nesse vetor que salta para o código real a ser executado, pois o espaço no vetor não é suficiente para armazenar todo o procedimento. No entanto, o importante é que o ISR esteja sempre localizado no mesmo posição.)

Quando ocorre uma interrupção, há algum hardware dedicado no controlador que grava o contador de programa com o vetor de interrupção. Então, quando o controlador alcança o próximo ciclo de instruções, ele busca a instrução no endereço apontado pelo contador de programa (portanto, o vetor de interrupção).

(Em um ciclo de instruções do controlador, existem tarefas diferentes que ele executa: busca a próxima instrução no endereço indicado pelo contador de programas; aumenta o contador de programas; decodifica a instrução e a executa.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.