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?
fonte
CALL
instrução comum , pois as interrupções são terminadas de maneira diferente (cf.RET
vs.RETI
).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
0
a1
(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. ACore
CPU 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.fonte
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.
fonte
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.)
fonte