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 jeweilige Interrupt-Flag gesetzt wird, aber da ich keinen ISR definiert habe, wird keine Interrupt-Vektor-Offset-Adresse für die Steuerübertragung für einen solchen Interrupt gespeichert und die Steuerung wird zurückgehen zur Hauptroutine, und ich kann das Interrupt-Flag zurücksetzen, indem ich es in der Hauptroutine abfrage (das ist, was ich denke). Wird es eine Latenz geben, wenn die CPU herausfindet, dass es keinen ISR gibt, zu dem man 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 keinen ISR definiert. Als ich einen internen Loopback-Test durchführte, wurde der Code in eine Endlosschleife eingegeben. Hier ist der Demontagecode der Endlosschleife, die auf LPC1778 ausgeführt wird:
B .
ENDP
Wenn Sie Interrupts verwenden, verwenden Sie den ISR.
quelle
Antworten:
Wenn kein ISR definiert ist, ist die Position 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 eine "Rückkehr von" enthalten Interrupt "(zB RTI) Anweisung.
Hier ist eine Zerlegung einer Interrupt-Tabelle für einen ATMega 16-Prozessor, die drei nicht verwendete Interrupts zeigt, die an eine Routine weitergeleitet werden, die solche Fälle behandelt (sie kann nur in eine Endlosschleife gehen), und einen legitimen Vektor.
Welche der zuvor beschriebenen Methoden zur Behandlung eines fehlenden ISR von der Architektur des Mikrocontrollers und des Compilers abhängt. Im Falle einer RTI oder einer gleichwertigen Anweisung wird sofort zur Anwendung zurückgekehrt. Wenn der Interrupt jedoch eher durch Pegel als durch Flanken ausgelöst wird, wird der Interrupt wahrscheinlich erneut ausgelöst, sodass Sie in einer Endlosschleife enden.
Ich denke, es kann von der Architektur des Chips abhängen, ob interne Interrupts (z. B. ein Zeichen, das von einem UART empfangen wird) als pegelgetriggert oder flankengetriggert betrachtet werden. Externe Interrupts können normalerweise als der eine oder andere konfiguriert werden.
Es gibt auch einen anderen Fall: Manchmal werden mehrere Interrupts zusammengefasst und verwenden denselben Vektor. Dies gilt insbesondere für ältere Prozessoren, die möglicherweise nur einige Interrupts hatten. In diesem Fall wurde die Interrupt-Ursache durch Abfragen des Status der Interrupt-Register ermittelt. Dies entspricht in etwa dem, was Sie vorschlagen.
Es ist jedoch auf jeden Fall eine schlechte Praxis, Interrupts in einem System zu haben und keinen ISR zu definieren. Tu es nicht.
quelle
Dies hängt von Ihrer MCU, Ihrem Compiler und dem Rest des Codes ab.
Meiner Erfahrung nach:
AVR - Wenn Sie keinen ISR angeben, ist der Interrupt-Vektor im Flash standardmäßig 0x0000. Dies bedeutet, dass Ihre Anwendung bei jedem Interrupt in den Reset-Modus wechselt.
Wenn Sie den Interrupt wirklich benötigen, aber den Handler nicht benötigen (z. B. den rauscharmen ADC- Abschaltmodus verwenden und den Interrupt nur zum Aufwecken der MCU verwenden), sollten Sie das Makro EMPTY_INTERRUPT 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.
quelle