Je voudrais savoir ce qui se passe si une interruption est activée (ex: interruption d'arbitrage perdue dans le module CAN du LPC1778 de NXP), mais aucun ISR n'a été défini pour l'interruption.
Lorsqu'une telle interruption se produit, je sais que le drapeau d'interruption respectif sera défini, mais comme je n'ai défini aucun ISR, aucune adresse de décalage de vecteur d'interruption ne sera stockée pour le transfert de contrôle pour une telle interruption et le contrôle passera donc en arrière. à la routine principale, et je peux réinitialiser le drapeau d'interruption en l'interrogeant dans la routine principale (c'est ce que je pense). Y aura-t-il une latence lorsque le CPU découvrira qu'il n'y a pas d'ISR pour sauter?
Toute solution sur ce qui pourrait arriver peut vraiment m'aider.
Merci.
Mettre à jour:
J'ai activé l'interruption CAN sur mon uC, mais je n'ai pas défini d'ISR. Lorsque j'ai effectué un test de bouclage interne, le code est entré dans une boucle infinie. Voici le code de démontage de la boucle infinie en cours d'exécution sur LPC1778:
B .
ENDP
Alors oui, si vous utilisez des interruptions, utilisez l'ISR.
la source
Réponses:
S'il n'y a pas d'ISR défini, l'emplacement de l'instruction de saut dans le vecteur d'interruption sera soit nul, il peut s'agir d'un saut vers une routine d'exception, il peut sauter au début du programme, ou il peut contenir un "retour de interrompre "(par exemple RTI).
Voici un démontage d'une table d'interruption pour un processeur ATMega 16 montrant trois interruptions inutilisées vectorisées à une routine qui gère de tels cas (il peut simplement entrer dans une boucle infinie), et un vecteur légitime.
Laquelle des méthodes décrites précédemment pour gérer un ISR manquant dépendra à la fois de l'architecture du microcontrôleur et du compilateur. Dans le cas d'une instruction RTI ou équivalente, elle retournera immédiatement à l'application. Cependant, si l'interruption est déclenchée par niveau plutôt que déclenchée par front, cela provoquera probablement à nouveau le déclenchement de l'interruption, vous vous retrouverez donc dans une boucle infinie.
Je pense que cela peut dépendre de l'architecture de la puce si les interruptions internes (par exemple, un caractère reçu par un UART) sont considérées comme déclenchées par le niveau ou déclenchées par les bords. Les interruptions externes peuvent généralement être configurées comme l'une ou l'autre.
Il existe également un autre cas, parfois plusieurs interruptions sont regroupées et utilisent le même vecteur. Cela était particulièrement vrai pour les processeurs plus anciens qui n'avaient peut-être eu que quelques interruptions. Dans ce cas, la cause de l'interruption a été déterminée en interrogeant l'état des registres d'interruption, ce qui est un peu comme ce que vous proposez.
Mais c'est une mauvaise pratique dans tous les cas d'avoir des interruptions dans un système et aucun ISR défini. Ne le fais pas.
la source
Cela dépend de votre MCU, du compilateur et du reste du code.
Selon mon expérience:
AVR - par défaut si vous ne spécifiez pas d'ISR, alors le vecteur d'interruption en flash sera 0x0000, ce qui signifie que votre application passera en reset chaque fois que cette interruption se produira.
Si vous avez vraiment besoin de l'interruption, mais n'avez pas besoin du gestionnaire (par exemple, utilisez le mode de mise hors tension à faible bruit ADC et utilisez l'interruption uniquement pour réveiller le MCU), vous devez utiliser la macro EMPTY_INTERRUPT
NXP Kinetis (ARM) - tous les vecteurs pointent par défaut vers un gestionnaire par défaut qui a un point d'arrêt, le CPU s'arrêtera simplement et le dira à votre débogueur.
la source