Én úgy nézem vektor tábla az mindegyiken van, viszont csak a Cortexen lehet az IRQ-t külső forrásból jövő vektorral megetetni, a hagyományos ARM az olyan, mint a 6502 volt, csak ennek 8 bejegyzés van a táblázatában (reset, undefined instruction, software int, prefetch abort, data abort, not used, irq, firq). Ennél valóban neked kell az ISR-ben ellenőrizni, hogy honnan jött a megszakítás. Mikrovezérlős környezetben ez megengedhetetlen, van több tucat periféria, ha az ISR úgy nézne ki, hogy if (SPI_IRQ) spi_isr(); else if (UART_IRQ) usr_isr(); ... az interrupt latency hatalmas lenne.
De azért csodálkozom, hogy az alap ARM az ilyen "buta".
Szerk.:
https://developer.arm.com/documentation/dui0471/m/handling-processor-ex…
Szóval valóban csak Cortexen van ilyen.
https://developer.arm.com/documentation/dui0471/m/handling-processor-ex…
"Exception handlers for microcontroller profiles are not required to save or restore the system state and can be written as ordinary, ABI-compliant C functions. However, it is recommended that you use the __irq keyword to identify the function as an interrupt routine, see the following example."
No comment...
Egy projektemben meg én is használok jópár periféria ISR-t, és valahogy nem fedeztem fel ezt a "NVIC_EnableIRQ" függvényen túl berak még egy ISR kódot is a programodba". Ehelyett pl. az UART ISR beállításához meghívom azt, hogy NVIC_SetVector(ID_UART0, (uint32_t) &Usart0IrqHandler); NVIC_EnableIRQ(ID_UART0); és ennyi, innentől igenis a HW kezeli.