ARM Register & Interrupts

Download Report

Transcript ARM Register & Interrupts

School of
Engineering
Architekturen der ARM
Prozessoren
School of
Engineering
Übung 1
Typ
Processor
Embedded
ARM7TDMI
Application
Ver
Pipeline
Cache
MMU
DSP
Java
Befehlssatz
MIPS@MHz
v4
3
nein
nein
nein
nein
Thumb
ARM
[email protected]
Cortex-M1
v7
3
nein
nein
nein
nein
Thumb-2
136DMIPS@170
Cortex-M3
v7
3
nein
MPU
nein
nein
Thumb-2
125DMIPS@100
Cortex-R4
v7
8
ja
MPU
ja
nein
Thumb-2
ARM
600DMIPS@375
ARM926ES
v5
5
ja
ja
ja
ja
Thumb
ARM
220@200
ARM1136JS
v6
8
ja
ja
ja
ja
Thumb
ARM
740@600
Cortex-A8
v7
13
ja
ja
ja
ja
Thumb-2
ARM
2000DMIPS@1GHz
• Was sind die Zusammenhänge zwischen der maximalen Taktfrequenz und der Anzahl der Pipelinestufen
• Erklären Sie den Zusammenhang
ARM Core Architektur
School of
Engineering
● 32-bit Daten Bus
● 32- bit Adressbus (4 GByte Adressraum)
● 32-bit Register
● 32-bit Barrel Shifter und Arithmetic Logic Unit (ALU)
● 32-bit Memory Transfer
● RISC Instruction Set
● Harvard Architecture (Separate Befehls- und Datenbus)
● 32-bit und 16-bit Instruction Sets
Cortex-M3 Blockdiagram
School of
Engineering
School of
Engineering
Cortex-M3 Register
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13 (MSP)
R14 (LR)
R15 (PC)
General Purpose
Low Registers
xPSR
PRIMASK
FAULTMASK
BASEPRI
CONTROL
Program & Status Register
Interrupt Mask
Registers
Control Register
General Purpose
High Registers
R13 (PSP)
Link register
Program Counter
Stack pointer (MSP = Main Stack Pointer PSP = Process Stack Pointer)
MSP = default
PSP = Alternativ
Control(1) bit
School of
Engineering
ARM7 Register & Betriebszustände
System & User
FIQ
Supervisor
Abort
IRQ
Undefined
R0
R0
R0
R0
R0
R0
R1
R1
R1
R1
R1
R1
R2
R2
R2
R2
R2
R2
R3
R3
R3
R3
R3
R3
R4
R4
R4
R4
R4
R4
R5
R5
R5
R5
R5
R5
R6
R6
R6
R6
R6
R6
R7
R7_fiq
R7
R7
R7
R7
R8
R8_fiq
R8
R8
R8
R8
R9
R9_fiq
R9
R9
R9
R9
R10
R10_fiq
R10
R10
R10
R10
R11
R11_fiq
R11
R11
R11
R11
R12
R12_fiq
R12
R12
R12
R12
R13
R13_fiq
R13_svc
R13_abt
R13_irq
R13_und
R14
R14_fiq
R14_svc
R14_abt
R14_irq
R14_und
R15 (PC)
R15 (PC)
R15 (PC)
R15 (PC)
R15 (PC)
R15 (PC)
CPSR
CPSR
CPSR
CPSR
CPSR
CPSR
SPSR_fiq
SPSR_svc
SPSR_abt
SPSR_irq
SPSR_und
School of
Engineering
ARM7 Current Processor Status
Register (CPSR)
Condition Code Flags:
F = 1 FIQ disable
N = Negative
I = 1 IRQ disable
Z = Zero
T = 1 Thumb mode
C = Carry Over
V = Overflow (Ergebnis grösser als Platz
im Register)
Betriebszustand:
FIQ
(Mode)
IRQ
Supervisor
User
Undefined
Cortex-M3 Current Processor Status
Register (CPSR)
School of
Engineering
Application
Interrupt
Execution
Zeigt welche Exception der
Condition Code Flags:
Prozessor gerade behandelt
N = Negative (MSB der 2er-Komplement Zahl gesetzt)
Z = Zero (Ergebnis ist 0)
C = Carry Over (Carry Bit gesetzt)
V = Overflow (Ergebnis zu gross für Register)
Q = Sticky Saturation Flag
ICI/IT = Interrupt Continuable Instruction (ICI), IF-THEN instruction status
T = Thumb state, immer 1, löschen verursacht Fault Exception
School of
Engineering
ARM7 Betriebszustände
Mode
User
Normale Programmausführung
Eingeschränkter Zugriff
FIQ
Fast Interrupt Ausführung
Exception Mode
IRQ
Allgemeine Interrupt Ausführung
Exception Mode
Supervisor
Beschützter Mode für Betriebssystem (Eintritt
über SWI)
Exception Mode
Abort
Unerlaubter Adressbereich adressiert
(Speicherschutz) oder unaligned Data
Exception Mode
Undefined
Unbekannte Anweisung ausgeführt
(Coprozessor Anweisung)
Exception Mode
System
Privilegierte Betriebsystem Anweisungen
Uneingeschränkter Zugriff
School of
Engineering
Cortex-M3 Betriebszustände
Privileged
Operation
Modes
When running an Exception
Handle Mode
When Running Main Program
Thread Mode
User
Thread Mode
Privilege
Levels
Wechseln der Betriebszustände:
MSR CONTROL, R0
School of
Engineering
Exceptions
ARM7 Exception Priorities
Priority
Highest 1
Lowest
Exception
Reset
2
Data Abort
3
FIQ
4
IRQ
5
Prefetch Abort
6
Undefined Instruction
SWI
School of
Engineering
Cortex-M3 Exception Priorities
Exc.
No.
Exception
Typ
Priorität
Funktion
School of
Engineering
1
Reset
-3
(Höchste)
Reset
2
NMI
-2
Nonmaskable Interrupt
3
Hard Fault
-1
All Faults wenn Fault Handler disabled oder maskiert
4
MemManage
Einstellbar
Memory Management, ungültiger Speicher Zugriff
5
Bus Fault
Einstellbar
Instruction Prefetch oder Datenzugriffsfehler
6
Usage Fault
Einstellbar
Versuch auf ARM Befehlssatz umschalten oder ungültiger
Befehl
7-10
-
11
SVC
Einstellbar
System Service call via SVC Befehl
12
Debug
Einstellbar
Debug Monitor
13
-
14
PendSV
Einstellbar
System Service steht an
15
Systick
Einstellbar
System Tick Timer
16-255
IRQ
Einstellbar
Interrupt Eingang 0-239
School of
Engineering
ARM7 Exception Vectors
Exception
Mode
Address
Reset
Supervisor
0x00000000
Undefined instruction
Undefined
0x00000004
Software interrupt (SWI)
Supervisor
0x00000008
Prefetch Abort (instruction fetch memory abort)
Abort
0x0000000C
Data Abort (data access memory abort)
Abort
0x00000010
IRQ (interrupt)
IRQ
0x00000018
FIQ (fast interrupt)
FIQ
0x0000001C
Memory Map des NXP LPC2138
4.0 GB
0xFFFF FFFF
AHB Peripherals
3.75 GB
3.5 GB
0xF000 0000
VPB Peripherals
3.0 GB
0xE000 0000
0xC000 0000
Reserved for
External Memory
2.0 GB
0x8000 0000
Boot Block
Reserved for
On-Chip Memory
Stack Pointer
On-Chip Static RAM
1.0 GB
0x4000 0000
Reserved for Special Registers
0x3FFF 8000
Main Code
Reserved for
On-Chip Memory
Exception
Vectors
On-Chip Non-Volatile Memory
0.0 GB
0x0000 0000
School of
Engineering
School of
Engineering
Exception Vector Table
32-bit
0xFFFF FFFF
0x0000001c
LDR
PC, FIQ_Addr
0x00000018
LDR
PC, IRQ_Addr
0x00000014
0x00000010
LDR
PC, Dabort_addr
0x0000000c
LDR
PC, Pabort_addr
0x00000008
LDR
PC, SWI_Addr
0x00000004
LDR
PC, Undef_Addr
0x00000000
LDR
PC, Reset_Addr
64 Byte
Exception
Vector
Table
Cortex-M3 Exception Vectors
Exception Type
Address Offset
Exception Vector
18-255
0x48-0x3FF
IRQ #2-239
17
0x44
IRQ #1
16
0x40
IRQ #0
15
0x3C
SYSTICK
14
0x38
PendSV
13
0x34
Reserved
12
0x30
Debug Monitor
11
0x2C
SVC
7-10
0x1C-0x28
Reserved
6
0x18
Usage fault
5
0x14
Bus fault
4
0x10
MemManage fault
3
0x0C
Hard fault
2
0x08
NMI
1
0x04
Reset
0
0x00
Starting Value for MSP
School of
Engineering
Einrichten von Exception Vectors
mit startup.s
School of
Engineering
● Startup.s ist Assembler Code, der vor Begin des Main
Codes ausgeführt wird
● Richtet Exception Vektor Tabelle ein
● Springt am Ende in die Main Routine des C-Codes
● Default Start Up Codes für diverse Microcontroller unter:
c:\keil\ARM\startup
School of
Engineering
Startup.s
FLASH
startup.s
main.c
School of
Engineering
Startup.s
EXTERN CODE32 (Undef_Handler?A)
EXTERN CODE32 (SWI_Handler?A)
EXTERN CODE32 (PAbt_Handler?A)
EXTERN CODE32 (DAbt_Handler?A)
EXTERN CODE32 (IRQ_Handler?A)
EXTERN CODE32 (FIQ_Handler?A)
Vectors: LDR
LDR
LDR
LDR
LDR
NOP
LDR
LDR
Reset_Addr:
Undef_Addr:
SWI_Addr:
PAbt_Addr:
DAbt_Addr:
IRQ_Addr:
FIQ_Addr:
PC,Reset_Addr
PC,Undef_Addr
PC,SWI_Addr
PC,PAbt_Addr
PC,DAbt_Addr
/* Reserved Vector */
PC,[PC, # -0x0FF0]
PC,FIQ_Addr
DD
DD
DD
DD
DD
DD
DD
DD
Reset_Handler
Undef_Handler?A
SWI_Handler?A
PAbt_Handler?A
DAbt_Handler?A
0
/* Reserved Address */
IRQ_Handler?A
FIQ_Handler?A
Externe C exception Routinen
werden deklariert
Exception Vektor Tabelle
startet bei PC 0x0, 64 bytes
Konstanten Tabelle für ISR Adresse
Übung 2
• Von welcher Adresse wird die erste Zeile des vom Anwender geschriebenen
Assemblercodes eingelesen (kein Betriebssystem vorausgesetzt) ?
• An welcher Adresse befindet sich die erste Assembleranweisung der Fast Interrupt
Routine ?
• An welcher Adresse befindet sich die erste Assembleranweisung des Undefined
Instruktion Handlers ?
School of
Engineering
Übung 2 - Lösung
• Von welcher Adresse wird die erste Zeile des vom Anwender geschriebenen
Assemblercodes eingelesen (kein Betriebssystem vorausgesetzt) ? 0x00000100
• An welcher Adresse befindet sich die erste Assembleranweisung der Fast Interrupt
Routine ? 0x00007000
• An welcher Adresse befindet sich die erste Assembleranweisung des Undefined
Instruktion Handlers ? 0x00002000
School of
Engineering
School of
Engineering
Einrichten von Interrupts im ARM7
ARM 7: Core hat genau nur 2 Interrupt Leitungen
FIQ
IRQ
Unterschiede zwischen FIQ und IRQ:
• Fast Interrupt (FIQ) hat höhere Priorität als IRQ
• FIQ Modus hat eigene Register R8_fiq-R14_fiq
• IRQ Modus hat eigene Register R13_irq-R14_irq
• Bei Ausführen von FIQ wird IRQ abgeschaltet
• IRQ Routinen können von FIQ Routinen
unterbrochen werden
ARM7 TDMI
School of
Engineering
ARM7: Aufsetzen von Interrupt Routinen
1. Initialisieren der Interrupts im Hauptprogramm
(main.c)
2. Erstellen der Interrupt Service Routine
3. Eintragen der Interrupt Routinen im Startup.s
Beispiel am ARM7 ähnlich am Cortex-M3
School of
Engineering
ARM7: Interrupt Initialisierung in main.c
School of
Engineering
void main (void)
{
IODIR1 = 0x00FF0000; // Set the LED pins as outputs
PINSEL0 = 0x20000000; // Select the EINT1 function in the pin connect block
VICIntSelect = 0x00008000; // Enable a Vic Channel as FIQ
VICIntEnable = 0x00008000; // Enable the EINT1 interrupt in the VIC
IOCLR1 = 0x00FF0000; // Clear the LED's
while(1); //Loop here forever
}
ARM7: Aufsetzen von Interrupt Routinen
1. Initialisieren der Interrupts im Hauptprogramm
(main.c)
2. Erstellen der Interrupt Service Routine
3. Eintragen der Interrupt Routinen im Startup.s
Beispiel am ARM7 ähnlich am Cortex-M3
School of
Engineering
ARM7: FIQ Interrupt Service Routine
School of
Engineering
• Definiert die Funktion als Fast Interrupt
• Sorgt dafür, dass der richtige Return Mechanismus verwendet wird
• Erklärt eine C Funktion als Interrupt Routine
• Verbindet Interrupt Vektor zur Funktion
• Andere Funktionen __IRQ, __SWI, __ABORT
Frei wählbarer Name
Erklärt Compiler, dass es sich um FIQ
handelt
void fiqint (void) __fiq
{
IOSET1 = 0x00FF0000; // Set the LED pins
EXTINT = 0x00000002; // Clear the peripheral interrupt flag
}
ARM7: Aufsetzen von Interrupt Routinen
1. Initialisieren des Interrupt Controllers im
Hauptprogramm (main.c)
2. Erstellen der Interrupt Service Routine
3. Eintragen der Interrupt Routinen im Startup.s
Beispiel am ARM7 ähnlich am Cortex-M3
School of
Engineering
School of
Engineering
ARM 7: Eintragen der FIQ Routinen
Startadresse im Startup Code
EXTERN CODE32 (fiqint?A)
__startup PROC CODE32
Vectors: LDR
LDR
LDR
LDR
LDR
NOP
LDR
LDR
Reset_Addr:
Undef_Addr:
SWI_Addr:
PAbt_Addr:
DAbt_Addr:
IRQ_Addr:
FIQ_Addr:
PC,Reset_Addr
PC,Undef_Addr
PC,SWI_Addr
PC,PAbt_Addr
PC,DAbt_Addr
/* Reserved Vector */
PC,[PC, #-0x0FF0]
PC,FIQ_Addr
DD
DD
DD
DD
DD
DD
DD
DD
Reset_Handler
Undef_Handler?A
SWI_Handler?A
PAbt_Handler?A
DAbt_Handler?A
0 /* Reserved Address */
IRQ_Handler?A
fiqint?A
Erklärung des Namens der
externen FIQ Routine
Adresseintrag der FIQ Routine
in der Vektortabelle
Adresse der FIQ Routine
Benennung der Exception Routinen
Exception source
Undefined Instruction
Prefetch Abort
Data Abort
Fast Interrupt
School of
Engineering
Constants table
C function header
Undef_Handler?A void Undef_Handler (void)__abort
PAbt_Handler?A void
Pabt_Handler (void) __abort
DAbt_Handler?A void
Dabt_Handler (void) __abort
fiqint?A void
fiqint (void)__fiq
Frei wählbarer Name
der Interrupt Routine,
Müssen mit Header
übereinstimmen
Benutze den gleichen Namen
für die C Interrupt Routine
Software Interrupt (SWI)
- Switch to Supervisor Mode -
School of
Engineering
SWI[cond] #3 // Bei Ausführung wird Exception Vector 0x00000008 in PC geladen
switch( *(R14-4) & 0x00FFFFFF) // roll back the address stored in link reg
// by 4 bytes
{ // Mask off the top 8 bits and switch
// on result
case ( SWI-1)
……
School of
Engineering
Vectored Interrupt Controller (VIC)
ARM 7 Core hat genau nur 2 Interrupt Leitungen
FIQ
IRQ
Unterschiede zwischen FIQ und IRQ:
• Fast Interrupt (FIQ) hat höhere Priorität als IRQ
• FIQ Modus hat eigene Register R8_fiq-R14_fiq
• IRQ Modus hat eigene Register R13_irq-R14_irq
• Bei Ausführen von FIQ wird IRQ abgeschaltet
• IRQ Routinen können von FIQ Routinen
unterbrochen werden
ARM7 TDMI
School of
Engineering
School of
Engineering
ARM7 VIC erweitert diese Interrupt
Leitungen
FIQ
FIQ
16 Vectored IRQ 16
Non Vectored IRQ
VIC
IRQ
ARM7 TDMI
Unterschiedliche Interrupt Service
Routinen
PC
Interrupt Vektoren
Int2
0x402040
Int1
0x402010
0x401000
0x000000
Main
School of
Engineering
ARM7 Exception Vector Tabelle
School of
Engineering
0xFFFF FFFF
0xFFFF F030
Vector Address Register
Exception
Vector
PC unmittelbar nach FIQ
PC unmittelbar nach IRQ
Program Counter
unmittelbar nach Reset
0x0000001c
LDR PC, FIQ_Addr
0x00000018
LDR PC, [PC, # - 0x0FF0]
64 Byte
Exception
Vector
Table
0x00000000
LDR PC, Reset_Addr
School of
Engineering
Vectored Interrupt Controller im LPC2138
16 Interrupt Slots
18 Chip interne und 4 externe
Interrupt Quellen
Vector Address
Registers
EINT3
Highest Priority
Interrupt Slot
EINT0
….
SPI0
VICIntEnable
EINT2
VICvectCntl 0..15
VICVectAddr 0
VICVectAddr 1
VICVectAddr 2
IRQ
>1
ARM7
Lowest Priority
Interrupt Slot
VICVectAddr 15
I2C0
FIQ
>1
Default Vector Address Register
VICIntSelect
Vector Address Register
Adresse
0xFFFF030
School of
Engineering
External Interrupts
School of
Engineering
Edge Triggered vs. Level Triggered
Interrupt
Edge Triggered Interrupt
Latch
Peripherie
Baustein
Edge Detector
Int
S
ARM-Core
Int
R
Mikrocontroller
Level Triggered Interrupt
Peripherie
Baustein
Register
Clear_Int
ARM-Core
Int
Int
Clear_Int
School of
Engineering
External Interrupt Register
PINSEL0 Bits 3..2
IC-Pin
Interrupt
EXTMODE
Latch
EINT0
P0.1
=1
EXOR
Edge Detector
S
EINT
R
EXTPOLAR
GPIO Port 0.1 0
RxD (UART0)
PWM3
EXTINT
External Interrupt Register
Jedes Register enthält je ein bit für EINT0-EINT3
School of
Engineering
VicIntEnable Register
Aktiviert Interrupt Eingänge
School of
Engineering
VicIntSelect Register
Bestimmt welche der bis zu 22 Quellen (Architektur erlaubt bis zu
32 Quellen) dem FIQ oder dem IRQ Ausgang zugeordnet sind
1 = FIQ, 0 = IRQ
School of
Engineering
VIC Vector Control Register
●
●
●
16 Vector Control Register, ein Register per Interrupt Slot
Register 0 hat höhere Priorität als Register 15
Interrupts die enabled aber nicht mit diesem Register auf einen Kanal
zugewiesen werden sind autmatisch „Non-Vectored“ Interrupts.
Bei Eintritt wird die „Default-vector“ Adresse ins Vektor Adress Register
übertragen
School of
Engineering
Nummerierung der Interrupt Quellen
School of
Engineering
School of
Engineering
Eintritt in die Vectored Interrupt Routine
ARM7 Exception Vector Tabelle
School of
Engineering
0xFFFF FFFF
0xFFFF F030
Vector Address Register
Exception
Vector
PC unmittelbar nach FIQ
PC unmittelbar nach IRQ
Program Counter
unmittelbar nach Reset
0x0000001c
LDR PC, FIQ_Addr
0x00000018
LDR PC, [PC, # - 0x0FF0]
64 Byte
Exception
Vector
Table
0x00000000
LDR PC, Reset_Addr
Auslesen des Vector Address Register
0xFFFF FFFF
LDR PC,[PC,# -0x0FF0]
Vector Address Register
0xFFFF F030
IRQ Interrupt Vector
0x0000 0018
0x0000 0000
0x18 + 2 x 4 Byte – 0xFF0 = 0xFFFF F030
School of
Engineering
Oberes Adressende
des Microcontrollers
Unteres Adressende
des Microcontrollers
School of
Engineering
Berechnen der Interrupt Einsprungadresse bei
NXP
Darstellung der Instruktion:
LDR PC, [PC, # - 0x0FF0]
Interrupt
Ereigniss
Instruction
Pipeline
Fetch
Instr. XY
LDR PC, [PC, # 0x0FF0]
Decode
Execute
Adresse xy
0x018
LDR PC, [PC, # 0x0FF0]
0x01c
LDR PC, [PC, # 0x0FF0]
0x020
Programm Counter
LPC Adress
Raum
0x0FF0
0xFFFF F034
PC
-
Vector Address
Register
PC
0xFFFF F030
(0x020)
0xFFFF F02C
Übung 3
• An welcher Adresse befindet sich das Vektor Adress Register des Interrupt Controllers
(es handelt sich hier nicht um einen NXP LPC) ?
School of
Engineering
Übung 3 - Lösung
• An welcher Adresse befindet sich das Vektor Adress Register des Interrupt Controllers
(es handelt sich hier nicht um einen NXP LPC) ?
0x18 + 2 x 4 Byte – 0x1000 = 0xFFFF F020
School of
Engineering
School of
Engineering
Initialisieren des Interrupt Controllers
ARM7 Exception Tabelle im Startup Code
Vectors:
LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP
LDR PC,[PC, #-0x0FF0] /*
Vector from VicVectAddr */
LDR PC,FIQ_Addr
\end{lstlisting}
School of
Engineering
Interrupt Controller
Initialisierungsreihenfolge
School of
Engineering
1. Setzen des IODIR1 als Eingang
2. PINSEL auf externen Interrupt setzen
3. Mit VicIntSel IRQ wählen
4. Interrupt Quelle einem Interrupt Priority Slot (0-15)
zuordnen
5. Vektor-Adresse der Interrupt Routine in das VectorRegister laden
6. Bei Edge Triggered Interrupts das Latch
zurücksetzten
7. Erst zuletzt Interrupteingang im VicIntEnable Register
scharf machen
Initialisieren des Interrupt Controllers für
externen Interrupt
School of
Engineering
void main (void)
{
void EXTINTVectoredIRQ (void) __irq; //Linker legt den Interrupt
Adressvektor fest
IODIR1 = 0x000FF000; //LED pins als Ausgänge einstellen
PINSEL0 = 0x20000000; //EXTINT1 als Eingang wählen
VICVectCntl0 = 0x0000002F; //Interrupt Slot für den
//entsprechenden Vector wählen
VICVectAddr0 = (unsigned)EXTINTVectoredIRQ; // Vector in
Addressregister laden
VICIntEnable = 0x00008000; //Interrupt aktivieren
while(1); //In Schleife laufen bis Interrupt eintritt
}
Interrupt Routine
School of
Engineering
void EXTINTVectoredIRQ (void) __irq
{
IOSET1 = 0x000FF000; // z.B. LED pins einschalten
EXTINT = 0x00000002; // Löschen des EXTINT Flags
VICVectAddr = 0x00000000; // Dummy write um Ende zu melden
}
Weitere Register im VIC
School of
Engineering