( Zsugabubus | 2024. 07. 27., szo – 17:07 )

Valóban, no comment! Ennyit arról, hogy mindig, minden megszakításnál mindent menteni kell!

Legalábbis amit használsz az ISR-ben, FIRQ-nak pl. az is a lényege, hogy minimális állapotmentés után már dolgozhat az ISR (ARM-nál nem tudom pontosan, hogy mennyivel "könnyebb" a FIRQ mint az IRQ, 6809-en pl. csak a PC meg flagek mentődnek, míg IRQ-nál minden regiszter).

Persze, hogy a HW kezeli (mégis, mi más kezelhetné?), na de nem a CPU. A CPU már csak a lánc legeslegvégén jön képbe, az interrupt controller UTÁN (ami esetedben az NVIC, de általánosságban sokkal inkább GIC lesz az).

Azt mondjuk érdekes lehet, hogy az extra vektorok kezelése vajon hol történik, az ARM core-ban is kell, hogy legyen némi változtatás, hogy az egy szem IRQ handler helyett lehessen max. 256 (NVIC-nél).

Egy Z80-nál vagy 68000-nél az interrupt controller egyszerűen felrakja az adatbuszra a periféria címét, ez alapján a CPU tudja, hogy melyik ISR-t kell hívnia. De az alap ARM-nál nincs ilyen, az kap egy IRQ-t, és van 1 db ISR, ami intézkedik, míg az NVIC hogy közli az ARM core-ral, hogy honnan vegye a ISR címét?

Egy régi AT91SAM MCU datasheetje (ezen még AIC van, nem NVIC) így írja:

When the instruction loaded at address 0x18 is executed, the program counter is loaded with the value
read in AIC_IVR. Reading the AIC_IVR has the following effects:
– Sets the current interrupt to be the pending and enabled interrupt with the highest priority. The current
level is the priority level of the current interrupt.
– De-asserts the nIRQ line on the processor. Even if vectoring is not used, AIC_IVR must be read in
order to de-assert nIRQ.
– Automatically clears the interrupt, if it has been programmed to be edge-triggered.
– Pushes the current level and the current interrupt number on to the stack.
– Returns the value written in the AIC_SVR corresponding to the current interrupt.

Nekem úgy tűnik,  ha az ARM core elkezdené az ISR-t, az AIC "alányúl", és lecseréli a PC-t arra, ami a saját vektortáblájában van. Arra nem találtam bizonyítékot, hogy az maga az ISR intézkedne a megfelelő vektor kiolvasásáról, és a kívánt periféria ISR hívásáról.

 

GIC egyébként ahogy nézem, a hagyományos CPUk-hoz tartozó interrupt controller, az AIC, NVIC meg a mikrokontrolleresekhez van.