Obsluha přerušení
Procesor musí mít v paměti uloženy adresy rutin obsluhy přerušení. Při vygenerování výjimky musí být uklizen stav procesoru, spuštěna rutina obsluhy a po jejím dokončení musí být stav procesoru obnoven.
Tabulka vektorů
Pokud je generována výjimka, procesor potřebuje vědět, kde je umístěn kód rutiny pro obsluhu přerušení. U procesoru Cortex-M3 je to realizováno tabulkou vektorů přerušení. Tabulka je pole 32-bitových slov a každé z nich obsahuje adresu vstupního bodu rutiny obsluhy přerušení. Implicitně po resetu procesoru je tabulka vektorů přerušení umístěna na adrese 0x00000000, ale tabulku lze realokovat změnou obsahu NVIC registru VTOR - Vector table offset register , který je na adrese 0xE000ED08.
Indexem do tabulky vektorů přerušení je číslo výjimky. Adresu vektoru, přesněji offset od umístění tabulky vektorů v paměti, získáme vynásobením čísla výjimky hodnotou 4. Vektor obsluhy resetu je tedy na adrese 0x00000004, vektor obsluhy NMI je na adrese 0x00000008 atd. Na první pozici, na adrese 0x00000000, je umístěna inicializační hodnota ukazatele vrcholu zásobníku.
Minimální tabulka vektorů přerušení, uvedená v tabulce 1.3, by vedle inicializace zásobníku a adresy kódu, který má být prováděn po resetu procesoru, měla obsahovat také adresu obsluhy výjimek NMI a HardFault, které mohou být po resetu generovány. K ostatním výjimkám může dojít, až jsou programem povoleny.
Každá adresa obslužné rutiny, uložená v tabulce vektorů přerušení, by měla mít nastavený nejméně významný bit na hodnotu 1. Pokud by tento bit byl nulový, došlo by k pokusu o přepnutí procesoru do stavu ARM, což by vedlo ke generování chybové výjimky.
Zahájení přerušení
Při generování výjimky uloží procesor na zásobník sadu registrů. Pro uložení registrů je použit aktuální zásobník, podle toho, zda má program, běžící ve Thread módu, nastaven hlavní zásobník MSP nebo zásobník procesu PSP. Pro vnořená přerušení, kdy je procesor v Handler módu, je vždy použit hlavní zásobník MSP. Na zásobník jsou uloženy registry R0 až R3, R12, Link Register (LR), Program Counter (PC) a stavový registr xPSR. Pořadí uložení registrů na zásobníku je zobrazeno v tabulce 1.4. Zásobník procesoru Cortex-M3 je plně sestupný, obsah SP se při ukládání na zásobník snižuje.
Obsah ukazatele vrcholu zásobníku, MSP nebo PSP, podle nastavení registru CONTROL[1], je nastaven na novou hodnotu. Pokud rutina obsluhy přerušení použije zásobník, bude vždy pracovat s hlavním zásobníkem MSP, protože kód obsluhy přerušení běží v režimu Handleru.
Ve stavovém registru IPSR je aktualizováno číslo obsluhované výjimky. Z vektoru, který odpovídá číslu výjimky, je vyzvednuta adresa kódu obsluhy přerušení, zapsána do registru PC a procesor začíná provádět kód od této adresy. Do registru LR je nastavena speciální hodnota EXC_RETURN, která určuje způsob návratu z rutiny obsluhy přerušení.
Návrat z přerušení
Pro návrat z obslužné rutiny není potřeba speciální instrukce, provádí se stejné jako návrat z normálního podprogramu. Při návratu procesor obnoví obsah uložených registrů a obsah ukazatele vrcholu zásobníku. Lze použít následující varianty návratu z rutiny obsluhy přerušení:
- instrukci BX LR, pokud kód obsluhy přerušení nezměnil obsah registru LR
- instrukci POP {PC}, pokud byl obsah LR (speciální hodnota EXC_RETURN) uložen na zásobník
- instrukci LDR s PC jako cílovým registrem
Čtyři nejnižší bity speciální hodnoty EXC_RETURN, která je při vstupu do rutiny přerušení procesorem dosazena do registru LR, určují, jakým způsobem procesor provede návrat. Všechny ostatní bity EXC_RETURN mají hodnotu 1.
- bit 0 - určuje ARM nebo Thumb stav, pro Cortex-M3 musí mít vždy hodnotu 1
- bit 1 - je rezervovaný, musí mít vždy hodnotu 0
- bit 2 - určuje volbu zásobníku po návratu (0 = MSP, 1 = PSP)
- bit 3 - určuje provozní mód procesoru (0 = Handler, 1 = Thread)
- bity 4 až 31 musí mít hodnotu 1
Pro Cortex-M3 připadají v úvahu pouze tři možné kombinace hodnoty EXC_RETURN
- 0xFFFFFFF1 - návrat do provozního módu Handleru (zásobník je vždy MSP)
- 0xFFFFFFF9 - návrat do provozního módu Thread, hlavní zásobník (MSP)
- 0xFFFFFFFD - návrat do provozního módu Thread, zásobník PSP
Díky tomu, že procesor při zahájení obsluhy výjimky uklidí registry na zásobník, po jejím dokončení je obnoví a pro návrat z obsluhy přerušení není nutná speciální instrukce, lze psát obslužné rutiny přímo jako funkce v programovacím jazyku C a není nutné použít assembler.