Produkty Novinky Články Návody Kontakty

Speciální registry

Speciální registry obsahují stav procesoru, řídí maskování a prioritu přerušení, nastavení privilegií prováděného kódu a volbu zásobníku.
Přístup ke speciálním registrům je možný pouze prostřednictvím dvou instrukcí pro čtení MRS a zápis MSR z/do speciálního registru. Instrukce neobsahují adresu v paměti, ale název speciálního registru. Speciální registry procesoru Cortex-M3 jsou shrnuty v tabulce 1.2.
​
MRS     R2, PSR         @ R2 <- PSR
MSR     PSR, R2         @ PSR<- R2
​
xPSR Program Status Registers
PRIMASK
FAULTMASK Interrupt mask registers
BASEPRI
CONTROL Control register
Tabulka 1.2 Speciální registry

Program status registers

Stav prováděného programu je dostupný ve stavovém registru xPSR (Program Status Register). K jeho částem lze přistupovat také individuálně pomocí dalších tří registrů
  • APSR - Application PSR
  • IPSR - Interrupt PSR
  • EPSR - Execution PSR
Strukturu stavových registrů znázorňuje tabulka 1.3. Obsah stavových registrů lze číst instrukcí MRS, nastavení příznaků v registru APSR je možné změnit instrukcí MSR. Registry IPSR a EPSR jsou určeny pouze pro čtení.
Registr APSR obsahuje příznaky výsledku poslední operace a podmínky skoku (N, Z, C, V). Nastavení příznaku Q je výsledkem saturačních instrukcí a jako podmínka skoku se nepoužívá.
  • N - Negative or less then flag - výsledek poslední operace je záporné číslo
  • Z - Zero flag - výsledek poslední operace je nula
  • C - Carry/borrow flag - poslední operace generovala přenos nebo výpůjčku
  • V - oVerflow flag - poslední operace generovala přetečení
bit 31 30 29 28 27 26-25 24 23-16 15-10 9 8-0
APSR N Z C V Q
IPSR Exc.No.
EPSR ICI/IT T ICI/IT
xPSR N Z C V Q ICI/IT T ICI/IT Exc.No.
Tabulka 1.3 Stavové registry
Registr IPSR obsahuje číslo právě aktivního přerušení (exception number). To znamená, že hodnota obsažená v registru IPSR ukazuje, která rutina obsluhy přerušení je prováděna.
  • 0 - je prováděn kód v provozním režimu Thread
  • 1 - rezervováno
  • 2 - NMI nemaskovatelné přerušení
  • 3 - Hard Fault
  • 4 - Memory Management Fault
  • 5 - Bus Fault
  • 6 - Usage Fault
  • hodnoty 7 až 10 jsou rezervovány
  • 11 - SVCall
  • 12 - rezervováno pro ladění
  • 13 - rezervováno
  • 14 - rezervováno
  • 15 - SysTick
  • 16 a výše - IRQ0 až IRQn - přerušení definovaná výrobcem mikrokontroléru
Registr EPSR obsahuje pole Interruptible-Continuable Instruction - ICI, které uchovává hodnoty právě přerušené operace Load/Store Multiple. Tyto instrukce provádí přesun více slov najednou, jsou přerušitelné a je potřeba uchovat stav jejich provádění, aby mohly po dokončení přerušení pokračovat. Pole IT registru EPSR obsahuje stav provádění If-Then instrukce.
Bit T indikuje, že procesor pracuje ve stavu Thumb. Tento bit má mít vždy hodnotu 1, protože Cortex-M3 provádí instrukce pouze ve stavu Thumb. Pokus o provedení instrukce při nulové hodnotě bitu T způsobí generování chybové výjimky nebo uvedení procesoru do stavu Lockup. Příčinou nastavení nulové hodnoty bitu T mohou být následující situace:
  • instrukce BLX, BX a POP{PC}
  • obnovení obsahu registru xPSR ze zásobníku při návratu z přerušení
  • nulová hodnota bitu[0] adresy uložené na vektoru přerušení nebo resetu

Interrupt mask registers

Tři speciální registry PRIMASK, FAULTMASK a BASEPRI řídí maskování přerušení. Registry PRIMASK a BASEPRI se používají pro dočasný zákaz přerušení při provádění kritických sekcí kódu. Registr FAULTMASK umožňuje dočasně zakazázat generování Hard Fault výjimky. Tato možnost je většinou používána jádrem operačního systému, aby se zajistilo zotavení po chybě v kódu některé z prováděných úloh.
  • PRIMASK je jednobitový registr, který umožnuje zakázat všechna přerušení vyjma nemaskovatelného přerušení (NMI) a Hard Fault. Jeho výchozí hodnota je nulová, tzn. že po resetu jsou všechna přerušení povolena.
  • FAULTMASK je jednobitový registr, který umožnuje zakázat všechna přerušení vyjma nemaskovatelného přerušení (NMI). Jeho výchozí hodnota je nulová, žádné přerušení není maskováno a všechna jsou povolena.
  • BASEPRI je registr o šířce maximálně 8 bitů. Počet bitů registru určuje výrobce konkrétního mikrokontroléru. Výchozí hodnota registru je nulová, přerušení nejsou maskována. Nenulová hodnota definuje úroveň priority přerušení pro maskování. Maskována, to znamená zakázána, jsou přerušení se stejnou a nižší úrovní priority a povolena jsou přerušení s úrovní priority vyšší než je úroveň nastavená v BASEPRI. Je třeba dát pozor na interpretaci priority (důležitosti) přerušení. Vyšší hodnota priority přerušení znamená jeho menší důležitost, přednost má přerušení s menší hodnotou priority.
Pro zápis a čtení registrů jsou k dispozici instrukce MSR a MRS, pro registry PRIMASK a FAULTMASK lze použít také instrukci CPS (Change Process Status). Obsah registrů může měnit pouze kód, který je prováděn v privilegovaném režimu.
​
@ příklad použití instrukce CPS
​
CPSIE   I               @ nuluj PRIMASK (povol přerušení) 
CPSID   I               @ nastav PRIMASK (zakaž přerušení)
​
CPSIE   F               @ nuluj FAULTMASK
CPSID   F               @ nastav FAULTMASK
​
​
@ příklad použití BASEPRI registru
​
MOV     R0, #0x60       @ maskuj přerušení
MSR     BASEPRI, R0     @ s prioritou 0x60 až 0xFF
​
MOV     R0, #0x0
MSR     BASEPRI, R0     @ povol přerušení
​

Control register

Registr CONTROL obsahuje dva bity, které jsou použity pro nastavení úrovně privilegií prováděného kódu a pro volbu zásobníku SP. Procesor má dva zásobníky, hlavní zásobník MSP a zásobník procesu PSP. Do registru CONTROL může zapisovat pouze privilegovaný kód.
  • Obsah bitu CONTROL[1] řídí výběr zásobníku v provozním režimu vlákna (Thread). Pokud je hodnota bitu nulová, kód používá hlavní zásobník MSP, hodnota jedna znamená použítí zásobníku procesu PSP. Pokud kód běží v režimu handleru, je tento bit vždy nulový, tzn. v provozním režimu handleru lze použít pouze hlavní zásobník MSP. Bit může být změněn pouze kódem, který běží v provozním režimu vlákna a má privilegovaná práva.
  • Obsah bitu CONTROL[0] řídí privilegia kódu prováděného v provozním režimu vlákna (Thread). Pokud je hodnota bitu rovna jedné, kód má uživatelská práva, pokud je nulová, kód je prováděn s privilegovanými právy.