Gostaria de saber o que acontece se uma interrupção estiver ativada (por exemplo: interrupção perdida por arbitragem no módulo CAN do LPC1778 do NXP), mas nenhum ISR foi definido para a interrupção.
Quando ocorre uma interrupção, eu sei que o respectivo sinalizador de interrupção será definido, mas como não defini nenhum ISR, não haverá nenhum endereço de deslocamento do vetor de interrupção armazenado para transferência de controle para essa interrupção e, portanto, o controle passará Para a rotina principal, e eu posso redefinir o sinalizador de interrupção pesquisando-o na rotina principal (é isso que estou pensando). Haverá alguma latência quando a CPU descobrir que não há ISR para o qual pular?
Qualquer solução sobre o que pode acontecer pode realmente me ajudar.
Obrigado.
Atualizar:
Ativei o CAN Interrupt no meu uC, mas não defini um ISR. Quando realizei um teste de loopback interno, o código entrou em um loop infinito. Aqui está o código de desmontagem do loop infinito sendo executado no LPC1778:
B .
ENDP
Então, se você estiver usando interrupções, use o ISR.
fonte
Respostas:
Se não houver um ISR definido, o local para a instrução de salto no vetor de interrupção será nulo, poderá ser um salto para uma rotina de exceção, poderá pular para o início do programa ou poderá conter um "retorno de interromper "(por exemplo, RTI).
Aqui está uma desmontagem de uma tabela de interrupção para um processador ATMega 16, mostrando três interrupções não utilizadas vetorizadas para uma rotina que lida com esses casos (pode apenas entrar em um loop infinito) e um vetor legítimo.
Qual dos métodos descritos anteriormente para lidar com um ISR ausente dependerá da arquitetura do microcontrolador e do compilador. No caso de uma RTI ou instrução equivalente, ela retornará imediatamente ao aplicativo. No entanto, se a interrupção for acionada por nível, em vez de acionada por borda, provavelmente isso fará com que a interrupção seja acionada novamente, para que você termine em um loop infinito.
Eu acho que pode depender da arquitetura do chip se as interrupções internas (por exemplo, um personagem sendo recebido por um UART) são consideradas disparadas por nível ou por borda. As interrupções externas geralmente podem ser configuradas como uma ou outra.
Há também um outro caso, às vezes várias interrupções são agrupadas e usam o mesmo vetor. Isso era particularmente verdade nos processadores mais antigos, que poderiam ter sofrido apenas algumas interrupções. Nesse caso, a causa da interrupção foi determinada pesquisando o status dos registros de interrupção, que é como o que você propõe.
Mas é uma prática ruim, em qualquer caso, ter interrupções em um sistema e nenhum ISR definido. Não faça isso.
fonte
Depende do seu MCU, compilador e restante do código.
Da minha experiência:
AVR - por padrão, se você não especificar um ISR, o vetor de interrupção no flash será 0x0000, o que significa que seu aplicativo entrará em redefinição sempre que essa interrupção ocorrer.
Se você realmente precisa da interrupção, mas não precisa do manipulador (por exemplo, use o modo de desligamento de baixo nível de ruído ADC e use a interrupção apenas para ativar o MCU), use a macro EMPTY_INTERRUPT
NXP Kinetis (ARM) - todos os vetores, por padrão, apontam para um manipulador padrão que possui um ponto de interrupção, a CPU simplesmente para e informa ao seu depurador.
fonte