( bzt | 2024. 08. 04., v – 13:39 )

azért kellett, hogy a külső interrupt vezérlő tudja, hogy vége a megszakításnak
Az független az ERET/IRET utasítástól. Ez utóbbi csak a CPU-n belül teszi helyre a privilégiumszinteket és a vermeket (handler mindig kernel space, de lehet, hogy user space-re kell visszatérni belőle, ráadásul ez utóbbiból szálanként van egy-egy), a külső interrupt vezérlőt ettől függetlenül kell nyugtázni. Ez utóbbira jellemzően van egy külön periféra regiszter az IC-ben (tehát nem ARM core regiszter, hanem HW perifária regiszter), pl. GIC_EOIR, vagy LAPIC_EOI. Gondolom mivel "alányúl" az NVIC az egész mechanizmusnak, ott ez is automatikusan történik a hatékonyság érdekében, de attól még megtörténik mind az ARM rendszerregiszterállítás, mind az EOI nyugtázás az IC-ben.
pedig annak is kéne tudni, hogy mikor ér véget a handler
Nemcsak kéne, kell is tudnia. Ez része kell, hogy legyen az "alányúlásnak", biztos vagyok benne, hogy az megfelelően állítja az ARM rendszerregisztereit is.
Lehet, hogy valahogy megjelöli a stacken, hogy ez egy handlerhez tartózó return address, és így el tudja végezni a context visszaállítást/prioritások kezelését?
ARM-on a visszatérési érték nem a verembe kerül, hanem (normál függvényhívás esetén) egy GPR regiszterbe, handler hívás esetén pedig egy rendszerregiszterbe. Előbbiből csak egy van, utóbbiből privilégiumszintenként egy-egy (azért, hogy az ERET kiadásakor privilégiumszintet lehessen váltani, ARM-es szóhasználattal exception level-t). Egész biztos vagyok, hogy a NVIC-es alacsony szintű ISR ugyanezt szimulálja (vagy direktben beállítja az ARM regisztereit, vagy olyan lépéseket tartalmaz, amiknek technikailag ugyanez a hatásuk)
A microcode present in the Cortex®-M4
Ezek szerint az alacsony szintű ISR, amiről egész eddig beszéltem, NVIC esetében mikrokódban van implementálva. Hogy ez akkor most végül is hardveres vagy szoftveres-e, abban inkább nem foglalnék állást, mivel mindkét esetre tudok érveket és ellenérveket is. Maradjunk annyiban, hogy hardverbe vasalt szoftver :-) A lényeg, hogy itt található az alacsony szintű ISR. Nem ismerem az NVIC pontos mikrokódját, de lefogadom, hogy valami ilyesmi lehet a benne írt alacsony szintű ISR: 1. aktuális ARM verem és PC mentése 2. átkapcsolás az ISR vermére 3. az NVIC regiszterei alapján meghatározza a lekezelőfüggvény címét 4. regiszterek és verem beállítása C függvény híváshoz 5. lekezelő függvény hívása az ARM processzoron 6. NVIC EOI nyugtázás 7. visszakapcsolás az ARM eredetileg megszakított vermére és PC visszaállítás (ERET-nek megfelelő lépések, csak NVIC módra) Amit apai írt, az biztos nem úgy van, már csak azért sem, mert abban igaza van, hogy két független veremről van szó, a handler nem használja a megszakított program vermét.