( Zsugabubus | 2024. 08. 03., szo – 16:12 )

Amikor egyesek az NVIC_SetVector()-t hívták, az valójában NEM az alacsony szintű megszakításvezérlőt állította, hanem a megszakításvezérlő által hívott lekezelő függvény címét (ami már lehet szabvány C függvény, hiszen az ERET-et nem az adja ki, hanem az alacsony szintű ISR).

Azt hittem, ezen túl vagyunk :D

De, az NVIC_SetVector() az egy olyan címet állít be, amit a hardver for hívni, NVIC-es ARM (Cortex M)-nél _nincs_ ilyen "alacsony szintű" megszakításvezérlő a lehető legalacsonyabb latency érdekében, GIC-esnél van. NVIC-nél máshogy néz ki a vektor tábla is, ott VTOR-nak hívják, az első 15 eleme előre definiált megszakítástípusok handlereire mutat (első a reset, utolsó a systick handler), ezek után jönnek az NVIC-re kötött perifériáktól jövő irq handlerek címei.

NVIC_SetVector() az így néz ki:

 uint32_t vectors = (uint32_t )SCB->VTOR;
 (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector;

 

ahol NVIC_USER_IRQ_OFFSET 16, tehát a VTOR hw reg által meghatározott táblában a periféria megszakítások vektorai a fix funkciójú megszakítások vektorai után jönnek.

Ha ezek szoftveresen lennének lekezelve, akkor mi a tosznak kell, hogy egy HW regiszter mutasson rájuk?