Ich würde gerne wissen, was passiert, wenn ein Interrupt aktiviert ist (z. B. Arbitration Lost Interrupt im CAN-Modul des LPC1778 von NXP), aber für den Interrupt wurde kein ISR definiert.
Wenn ein solcher Interrupt auftritt, weiß ich, dass das entsprechende Interrupt-Flag gesetzt wird, aber da ich keine ISR definiert habe, wird keine Interrupt-Vektor-Offset-Adresse für die Steuerungsübertragung für einen solchen Interrupt gespeichert, und daher wird die Steuerung zurückgegeben zur Hauptroutine, und ich kann das Interrupt-Flag zurücksetzen, indem ich es in der Hauptroutine abfrage (das denke ich). Wird es eine Latenz geben, wenn die CPU herausfindet, dass es keine ISR gibt, zu der sie springen kann?
Alle Lösungen, was passieren könnte, können mir wirklich helfen.
Vielen Dank.
Aktualisieren:
Ich habe CAN Interrupt auf meinem uC aktiviert, aber keine ISR definiert. Als ich einen internen Loopback-Test durchführte, trat der Code in eine Endlosschleife ein. Hier ist der Disassemblierungscode der Endlosschleife, die auf LPC1778 ausgeführt wird:
B .
ENDP
Wenn Sie also Interrupts verwenden, verwenden Sie die ISR.
Wenn kein ISR definiert ist, ist die Stelle für den Sprungbefehl im Interrupt-Vektor entweder null, es kann ein Sprung zu einer Ausnahmeroutine sein, es kann zum Anfang des Programms springen oder es kann ein "return from Interrupt" (z. B. RTI) Befehl.
Hier ist eine Zerlegung einer Interrupt-Tabelle für einen ATMega 16-Prozessor, die drei unbenutzte Interrupts zeigt, die zu einer Routine geleitet werden, die solche Fälle behandelt (sie kann einfach in eine Endlosschleife gehen), und einen legitimen Vektor.
28: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
2c: 0c 94 5c 00 jmp 0xb8 ; 0xb8 <__vector_11> // <-- ISR
30: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
34: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
Welche der oben beschriebenen Methoden zur Behandlung einer fehlenden ISR ist, hängt sowohl von der Architektur des Mikrocontrollers als auch des Compilers ab. Im Fall einer RTI- oder gleichwertigen Anweisung wird sofort zur Anwendung zurückgekehrt. Wenn der Interrupt jedoch pegelgesteuert und nicht flankengesteuert ist, wird dies wahrscheinlich dazu führen, dass der Interrupt erneut ausgelöst wird, sodass Sie in einer Endlosschleife landen.
Ich denke, es kann von der Architektur des Chips abhängen, ob interne Interrupts (z. B. ein von einem UART empfangenes Zeichen) als pegelgesteuert oder flankengesteuert betrachtet werden. Externe Interrupts können normalerweise als das eine oder das andere konfiguriert werden.
Es gibt auch einen anderen Fall, manchmal werden mehrere Interrupts zusammen gruppiert und verwenden denselben Vektor. Dies galt insbesondere für ältere Prozessoren, die möglicherweise nur ein paar Interrupts hatten. In diesem Fall wurde die Unterbrechungsursache durch Abfragen des Status der Unterbrechungsregister ermittelt, was in etwa dem entspricht, was Sie vorschlagen.
Aber es ist auf jeden Fall schlechte Praxis, Interrupts in einem System zu haben und keine ISR zu definieren. Tu es nicht.
Es hängt von Ihrer MCU, Ihrem Compiler und dem Rest des Codes ab.
Meiner Erfahrung nach:
AVR - Wenn Sie keine ISR angeben, ist der Interrupt-Vektor im Flash standardmäßig 0x0000, was bedeutet, dass Ihre Anwendung bei jedem Auftreten dieses Interrupts in den Reset springt.
Wenn Sie den Interrupt wirklich benötigen, aber den Handler nicht benötigen (z. B. ADC-Low-Noise-Power-Down-Modus verwenden und den Interrupt nur zum Aufwecken der MCU verwenden), sollten Sie das EMPTY_INTERRUPT- Makro verwenden
NXP Kinetis (ARM) - Alle Vektoren zeigen standardmäßig auf einen Standardhandler mit einem Haltepunkt. Die CPU stoppt einfach und teilt dies Ihrem Debugger mit.
brhans
AlphaGoku
brhans
AlphaGoku
Hobbs
AlphaGoku
Guill