School ofEngineering
Architekturen der ARM Prozessoren
School ofEngineering
Übung 1
Typ Processor Ver Pipe-line
Cache MMU DSP Java Befehls-satz
MIPS@MHz
Embedded ARM7TDMI v4 3 nein nein nein nein ThumbARM
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-2ARM
600DMIPS@375
Application ARM926E-S
v5 5 ja ja ja ja ThumbARM
220@200
ARM1136J-S
v6 8 ja ja ja ja ThumbARM
740@600
Cortex-A8 v7 13 ja ja ja ja Thumb-2ARM
2000DMIPS@1GHz
• Was sind die Zusammenhänge zwischen der maximalen Taktfrequenz und der Anzahl der Pipelinestufen• Erklären Sie den Zusammenhang
School ofEngineering
● 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
ARM Core Architektur
School ofEngineering
Cortex-M3 Blockdiagram
School ofEngineering
R15 (PC)
R0R1R2R3R4R5R6R7R8R9R10R11R12R13 (MSP)R14 (LR)
Stack pointer (MSP = Main Stack Pointer PSP = Process Stack Pointer)
Link register
Program Counter
R13 (PSP)
Cortex-M3 Register
General PurposeLow Registers
General PurposeHigh Registers
xPSRPRIMASKFAULTMASKBASEPRICONTROL
Interrupt MaskRegisters
Control Register
Program & Status Register
MSP = defaultPSP = AlternativControl(1) bit
School ofEngineering
System & User
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13
R14
R15 (PC)
CPSR
FIQ
R0
R1
R2
R3
R4
R5
R6
R7_fiq
R8_fiq
R9_fiq
R10_fiq
R11_fiq
R12_fiq
R13_fiq
R14_fiq
R15 (PC)
CPSR
SPSR_fiq
Supervisor
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13_svc
R14_svc
R15 (PC)
CPSR
SPSR_svc
Abort
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13_abt
R14_abt
R15 (PC)
CPSR
SPSR_abt
IRQ
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13_irq
R14_irq
R15 (PC)
CPSR
SPSR_irq
Undefined
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13_und
R14_und
R15 (PC)
CPSR
SPSR_und
ARM7 Register & Betriebszustände
School ofEngineering
Betriebszustand:FIQIRQSupervisorUserUndefined
F = 1 FIQ disableI = 1 IRQ disable T = 1 Thumb mode
Condition Code Flags:N = NegativeZ = ZeroC = Carry Over V = Overflow (Ergebnis grösser als Platz im Register)
ARM7 Current Processor Status Register (CPSR)
(Mode)
School ofEngineering
Zeigt welche Exception derProzessor gerade behandeltCondition Code Flags:
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 FlagICI/IT = Interrupt Continuable Instruction (ICI), IF-THEN instruction statusT = Thumb state, immer 1, löschen verursacht Fault Exception
Cortex-M3 Current Processor Status Register (CPSR)
Application
InterruptExecution
School ofEngineering
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 ofEngineering
Cortex-M3 Betriebszustände
Privileged User
When running an Exception Handle Mode
When Running Main Program Thread Mode Thread Mode
OperationModes
PrivilegeLevels
Wechseln der Betriebszustände:MSR CONTROL, R0
School ofEngineering
Exceptions
School ofEngineering
ARM7 Exception Priorities
Priority Exception
Highest 1
Lowest
2
3
4
5
6
Reset
Data Abort
FIQ
IRQ
Prefetch Abort
Undefined Instruction SWI
School ofEngineering
Cortex-M3 Exception Priorities
Exc.No.
ExceptionTyp
Priorität Funktion
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 ofEngineering
ARM7 Exception Vectors
Prefetch Abort (instruction fetch memory abort)
Supervisor
0x0000001C
Exception Mode Address
Reset
Undefined instruction
Software interrupt (SWI)
Data Abort (data access memory abort)
IRQ (interrupt)
FIQ (fast interrupt)
Undefined
Supervisor
Abort
Abort
IRQ
FIQ
0x00000018
0x00000010
0x0000000C
0x00000008
0x00000004
0x00000000
School ofEngineering
AHB Peripherals
VPB Peripherals
Reserved for External Memory
Boot Block
Reserved for On-Chip Memory
On-Chip Static RAM
Reserved for Special Registers
Reserved for On-Chip Memory
On-Chip Non-Volatile Memory
4.0 GB
3.75 GB
3.5 GB
3.0 GB
2.0 GB
1.0 GB
0.0 GB
0xFFFF FFFF
0xF000 0000
0xE000 0000
0xC000 0000
0x8000 0000
0x4000 0000
0x3FFF 8000
0x0000 0000
Stack Pointer
ExceptionVectors
Main Code
Memory Map des NXP LPC2138
School ofEngineering
64 ByteExceptio
nVectorTable
LDR PC, FIQ_Addr
LDR PC, IRQ_Addr
LDR PC, Dabort_addr
LDR PC, Pabort_addr
LDR PC, SWI_Addr
LDR PC, Undef_Addr
LDR PC, Reset_Addr0x00000000
0x00000018
0x0000001c
0xFFFF FFFF
0x00000004
0x00000008
0x0000000c
0x00000010
0x00000014
32-bit
Exception Vector Table
School ofEngineering
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
Cortex-M3 Exception Vectors
School ofEngineering
● 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
Einrichten von Exception Vectorsmit startup.s
School ofEngineering
FLASH
main.c
startup.s
Startup.s
School ofEngineeringStartup.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 PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP /* Reserved Vector */
LDR PC,[PC, # -0x0FF0]
LDR PC,FIQ_Addr
Reset_Addr: DD Reset_Handler
Undef_Addr: DD Undef_Handler?A
SWI_Addr: DD SWI_Handler?A
PAbt_Addr: DD PAbt_Handler?A
DAbt_Addr: DD DAbt_Handler?A
DD 0 /* Reserved Address */
IRQ_Addr: DD IRQ_Handler?A
FIQ_Addr: DD FIQ_Handler?A
Exception Vektor Tabellestartet bei PC 0x0, 64 bytes
Externe C exception Routinenwerden deklariert
Konstanten Tabelle für ISR Adresse
School ofEngineering
Übung 2
• Von welcher Adresse wird die erste Zeile des vom Anwender geschriebenenAssemblercodes eingelesen (kein Betriebssystem vorausgesetzt) ?
• An welcher Adresse befindet sich die erste Assembleranweisung der Fast InterruptRoutine ?
• An welcher Adresse befindet sich die erste Assembleranweisung des UndefinedInstruktion Handlers ?
School ofEngineering
Übung 2 - Lösung
• Von welcher Adresse wird die erste Zeile des vom Anwender geschriebenenAssemblercodes eingelesen (kein Betriebssystem vorausgesetzt) ? 0x00000100
• An welcher Adresse befindet sich die erste Assembleranweisung der Fast InterruptRoutine ? 0x00007000
• An welcher Adresse befindet sich die erste Assembleranweisung des UndefinedInstruktion Handlers ? 0x00002000
School ofEngineering
Einrichten von Interrupts im ARM7
School ofEngineering
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
FIQ
IRQARM7 TDMI
ARM 7: Core hat genau nur 2 Interrupt Leitungen
School ofEngineering
1.Initialisieren der Interrupts im Hauptprogramm (main.c)
2.Erstellen der Interrupt Service Routine3.Eintragen der Interrupt Routinen im
Startup.s
ARM7: Aufsetzen von Interrupt Routinen
Beispiel am ARM7 ähnlich am Cortex-M3
School ofEngineering
void main (void){IODIR1 = 0x00FF0000; // Set the LED pins as outputsPINSEL0 = 0x20000000; // Select the EINT1 function in the pin connect blockVICIntSelect = 0x00008000; // Enable a Vic Channel as FIQVICIntEnable = 0x00008000; // Enable the EINT1 interrupt in the VICIOCLR1 = 0x00FF0000; // Clear the LED'swhile(1); //Loop here forever}
ARM7: Interrupt Initialisierung in main.c
School ofEngineering
1.Initialisieren der Interrupts im Hauptprogramm (main.c)
2.Erstellen der Interrupt Service Routine3.Eintragen der Interrupt Routinen im
Startup.s
ARM7: Aufsetzen von Interrupt Routinen
Beispiel am ARM7 ähnlich am Cortex-M3
School ofEngineering
void fiqint (void) __fiq
{
IOSET1 = 0x00FF0000; // Set the LED pins
EXTINT = 0x00000002; // Clear the peripheral interrupt flag
}
• 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
ARM7: FIQ Interrupt Service Routine
Erklärt Compiler, dass es sich um FIQhandelt
School ofEngineering
1.Initialisieren des Interrupt Controllers im Hauptprogramm (main.c)
2.Erstellen der Interrupt Service Routine3.Eintragen der Interrupt Routinen im
Startup.s
ARM7: Aufsetzen von Interrupt Routinen
Beispiel am ARM7 ähnlich am Cortex-M3
School ofEngineering
EXTERN CODE32 (fiqint?A)
__startup PROC CODE32
Vectors: LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP /* Reserved Vector */
LDR PC,[PC, #-0x0FF0]
LDR PC,FIQ_Addr
Reset_Addr: DD Reset_Handler
Undef_Addr: DD Undef_Handler?A
SWI_Addr: DD SWI_Handler?A
PAbt_Addr: DD PAbt_Handler?A
DAbt_Addr: DD DAbt_Handler?A
DD 0 /* Reserved Address */
IRQ_Addr: DD IRQ_Handler?A
FIQ_Addr: DD fiqint?A
Erklärung des Namens derexternen FIQ Routine
Adresse der FIQ Routine
Adresseintrag der FIQ Routinein der Vektortabelle
ARM 7: Eintragen der FIQ Routinen Startadresse im Startup Code
School ofEngineering
Benennung der Exception Routinen
Exception source Constants table C function headerUndefined Instruction Undef_Handler?A void Undef_Handler (void)__abortPrefetch Abort PAbt_Handler?A void Pabt_Handler (void) __abortData Abort DAbt_Handler?A void Dabt_Handler (void) __abortFast Interrupt fiqint?A void fiqint (void)__fiq
Benutze den gleichen Namenfür die C Interrupt Routine
Frei wählbarer Nameder Interrupt Routine,Müssen mit Headerübereinstimmen
School ofEngineeringSoftware Interrupt (SWI)
- Switch to Supervisor Mode -
switch( *(R14-4) & 0x00FFFFFF) // roll back the address stored in link reg// by 4 bytes{ // Mask off the top 8 bits and switch// on resultcase ( SWI-1)……
SWI[cond] #3 // Bei Ausführung wird Exception Vector 0x00000008 in PC geladen
School ofEngineering
Vectored Interrupt Controller (VIC)
School ofEngineering
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
FIQ
IRQARM7 TDMI
ARM 7 Core hat genau nur 2 Interrupt Leitungen
School ofEngineering
1616 Vectored IRQ
Non Vectored IRQ
FIQFIQ
IRQARM7 TDMIVIC
ARM7 VIC erweitert diese Interrupt Leitungen
School ofEngineering
0x401000
0x402010
0x402040
0x000000
PC
Int1
Int2
Main
Interrupt Vektoren
Unterschiedliche Interrupt Service Routinen
School ofEngineering
64 ByteExceptio
nVectorTable
LDR PC, FIQ_Addr
LDR PC, [PC, # - 0x0FF0]
LDR PC, Reset_Addr
Program Counter unmittelbar nach Reset
PC unmittelbar nach FIQ
PC unmittelbar nach IRQ
0x00000000
0x00000018
0x0000001c
ExceptionVector
0xFFFF F030 Vector Address Register
0xFFFF FFFF
ARM7 Exception Vector Tabelle
School ofEngineering
ARM7
FIQ
VIC
vectC
ntl
0..
15
IRQ
EINT3
EINT2
EINT0
VICVectAddr 0
VICVectAddr 1
Highest PriorityInterrupt Slot
SPI0
I2C0
….
18 Chip interne und 4 externeInterrupt Quellen
Vector AddressRegisters
VICVectAddr 15
VICVectAddr 2
Vector Address Register
VICIntSelect
Lowest PriorityInterrupt SlotV
ICIn
tEn
ab
le
16 Interrupt Slots
>1
>1
Default Vector Address Register
Adresse0xFFFF030
Vectored Interrupt Controller im LPC2138
School ofEngineering
External Interrupts
School ofEngineering
Edge Triggered Interrupt
Level Triggered Interrupt
Edge DetectorS
R
Int
Clear_IntMikrocontroller
PeripherieBaustein
Int
Clear_Int
ARM-Core
Register
Int
ARM-Core
PeripherieBaustein Int
Latch
Edge Triggered vs. Level Triggered Interrupt
School ofEngineering
=1Edge Detector
S
REINT
EXTINT
EXTMODEEINT0
EXTPOLAR
EXOR
GPIO Port 0.1 0RxD (UART0)PWM3
IC-Pin P0.1
PINSEL0 Bits 3..2
InterruptLatch
External Interrupt Register
School ofEngineering
Jedes Register enthält je ein bit für EINT0-EINT3
External Interrupt Register
School ofEngineering
VicIntEnable Register
Aktiviert Interrupt Eingänge
School ofEngineering
Bestimmt welche der bis zu 22 Quellen (Architektur erlaubt bis zu 32 Quellen) dem FIQ oder dem IRQ Ausgang zugeordnet sind1 = FIQ, 0 = IRQ
VicIntSelect Register
School ofEngineering
● 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
VIC Vector Control Register
School ofEngineering
Nummerierung der Interrupt Quellen
School ofEngineering
Eintritt in die Vectored Interrupt Routine
School ofEngineering
64 ByteExceptio
nVectorTable
LDR PC, FIQ_Addr
LDR PC, [PC, # - 0x0FF0]
LDR PC, Reset_Addr
Program Counter unmittelbar nach Reset
PC unmittelbar nach FIQ
PC unmittelbar nach IRQ
0x00000000
0x00000018
0x0000001c
ExceptionVector
0xFFFF F030 Vector Address Register
0xFFFF FFFF
ARM7 Exception Vector Tabelle
School ofEngineering
Vector Address Register
0xFFFF FFFF
0xFFFF F030
0x0000 0018
0x0000 0000
IRQ Interrupt Vector
Oberes Adressendedes Microcontrollers
Unteres Adressendedes Microcontrollers
0x18 + 2 x 4 Byte – 0xFF0 = 0xFFFF F030
Auslesen des Vector Address Register
LDR PC,[PC,# -0x0FF0]
School ofEngineering
Vector AddressRegister 0xFFFF F030
0xFFFF F034
0xFFFF F02C
-
0x0FF0
PC PC
LPC AdressRaum
LDR PC, [PC, # - 0x0FF0]
LDR PC, [PC, # - 0x0FF0]
LDR PC, [PC, # - 0x0FF0]
Adresse xy 0x018 0x01c 0x020Programm Counter
Fetch
Decode
Execute
InstructionPipeline
InterruptEreigniss
(0x020)
Darstellung der Instruktion:LDR PC, [PC, # - 0x0FF0]
Berechnen der Interrupt Einsprungadresse bei NXP
Instr. XY
School ofEngineering
Übung 3
• An welcher Adresse befindet sich das Vektor Adress Register des Interrupt Controllers(es handelt sich hier nicht um einen NXP LPC) ?
School ofEngineering
Ü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 ofEngineering
Initialisieren des Interrupt Controllers
School ofEngineering
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 ofEngineering
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 Vector-Register laden
6. Bei Edge Triggered Interrupts das Latch zurücksetzten
7. Erst zuletzt Interrupteingang im VicIntEnable Register scharf machen
Interrupt Controller Initialisierungsreihenfolge
School ofEngineering
void main (void){void EXTINTVectoredIRQ (void) __irq; //Linker legt den InterruptAdressvektor festIODIR1 = 0x000FF000; //LED pins als Ausgänge einstellenPINSEL0 = 0x20000000; //EXTINT1 als Eingang wählenVICVectCntl0 = 0x0000002F; //Interrupt Slot für den //entsprechenden Vector wählenVICVectAddr0 = (unsigned)EXTINTVectoredIRQ; // Vector inAddressregister ladenVICIntEnable = 0x00008000; //Interrupt aktivierenwhile(1); //In Schleife laufen bis Interrupt eintritt}
Initialisieren des Interrupt Controllers für externen Interrupt
School ofEngineering
Interrupt Routine
void EXTINTVectoredIRQ (void) __irq{IOSET1 = 0x000FF000; // z.B. LED pins einschaltenEXTINT = 0x00000002; // Löschen des EXTINT FlagsVICVectAddr = 0x00000000; // Dummy write um Ende zu melden}
School ofEngineering
Weitere Register im VIC