Chciałbym wiedzieć, co się stanie, jeśli włączone jest Przerwanie (np. Arbitration Lost Interrupt w module CAN NXP LPC1778), ale dla przerwania nie zdefiniowano ISR.
Kiedy takie przerwanie nastąpi, wiem, że odpowiednia flaga przerwania zostanie ustawiona, ale ponieważ nie zdefiniowałem żadnego ISR, nie będzie przechowywany żaden adres przesunięcia wektora przerwania dla przekazania sterowania dla takiego przerwania, a więc sterowanie przejdzie z powrotem do głównej procedury i mogę zresetować flagę przerwania, odpytując ją w głównej procedurze (tak myślę). Czy będzie jakieś opóźnienie, gdy procesor dojdzie do wniosku, że nie ma ISR, do którego można by wskoczyć?
Wszelkie rozwiązania tego, co może się zdarzyć, mogą mi naprawdę pomóc.
Dzięki.
Aktualizacja:
Włączyłem CAN Interrupt na moim komputerze, ale nie zdefiniowałem ISR. Kiedy przeprowadziłem wewnętrzny test pętli zwrotnej, kod wszedł w nieskończoną pętlę. Oto kod dezasemblacji nieskończonej pętli wykonywanej na LPC1778:
B .
ENDP
Tak więc, jeśli używasz przerwań, użyj ISR.
źródło
Odpowiedzi:
Jeśli nie zdefiniowano ISR, lokalizacja instrukcji skoku w wektorze przerwań będzie albo zerowa, może być skokiem do procedury wyjątku, może przeskoczyć na początek programu lub może zawierać „powrót z instrukcja interrupt ”(np. RTI).
Oto demontaż tabeli przerwań dla procesora ATMega 16, pokazujący trzy nieużywane przerwania wektoryzowane do procedury, która obsługuje takie przypadki (może po prostu przejść do nieskończonej pętli), i jeden prawidłowy wektor.
Która z opisanych wcześniej metod obsługi brakującego ISR będzie zależeć zarówno od architektury mikrokontrolera, jak i kompilatora. W przypadku instrukcji RTI lub równoważnej instrukcja natychmiast powróci do aplikacji. Jeśli jednak przerwanie jest wyzwalane poziomem, a nie zboczem, prawdopodobnie spowoduje to, że przerwanie zostanie ponownie uruchomione, więc skończysz w nieskończonej pętli.
Myślę, że może zależeć od architektury układu, czy wewnętrzne przerwania (np. Znak odbierany przez UART) są uważane za wyzwalane poziomem lub wyzwalane zboczem. Przerwania zewnętrzne można zwykle skonfigurować jako jedno lub drugie.
Jest jeszcze jeden przypadek, czasem kilka przerwań jest zgrupowanych razem i używa tego samego wektora. Było to szczególnie prawdziwe w przypadku starszych procesorów, które mogły mieć tylko kilka przerw. W takim przypadku przyczyna przerwania została ustalona przez sondowanie statusu rejestrów przerwań, co jest w pewnym sensie tym, co proponujesz.
Ale w każdym razie jest to zła praktyka, aby mieć przerwy w systemie i nie zdefiniować ISR. Nie rób tego
źródło
To zależy od MCU, kompilatora i reszty kodu.
Z mojego doświadczenia:
AVR - domyślnie, jeśli nie określisz ISR, wówczas wektor przerwań we flashu będzie wynosił 0x0000, co oznacza, że twoja aplikacja będzie się resetować za każdym razem, gdy nastąpi takie przerwanie.
Jeśli naprawdę potrzebujesz przerwania, ale nie potrzebujesz modułu obsługi (np. Użyj trybu cichego wyłączania ADC i użyj przerwania tylko do wybudzenia MCU), powinieneś użyć makra EMPTY_INTERRUPT
NXP Kinetis (ARM) - wszystkie wektory domyślnie wskazują domyślny moduł obsługi, który ma punkt przerwania, procesor po prostu zatrzyma się i przekaże go do twojego debuggera.
źródło