600 likes | 851 Views
Architekturen der ARM Prozessoren. Übung 1. Was sind die Zusammenhänge zwischen der maximalen Taktfrequenz und der Anzahl der Pipelinestufen Erklären Sie den Zusammenhang. ARM Core Architektur. 32-bit Daten Bus 32- bit Adressbus (4 GByte Adressraum) 32-bit Register
E N D
Übung 1 • Was sind die Zusammenhänge zwischen der maximalen Taktfrequenz und der Anzahl der Pipelinestufen • Erklären Sie den Zusammenhang
ARM Core Architektur • 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 Register xPSR Program & Status Register R0 PRIMASK R1 Interrupt MaskRegisters FAULTMASK R2 BASEPRI R3 General Purpose Low Registers Control Register CONTROL R4 R5 R6 R7 R8 R9 General Purpose High Registers R10 R11 R12 R13 (PSP) R13 (MSP) Stack pointer (MSP = Main Stack Pointer PSP = Process Stack Pointer) R14 (LR) Link register MSP = default PSP = Alternativ Control(1) bit R15 (PC) Program Counter
System & User FIQ Abort IRQ Undefined Supervisor 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_fiq R7 R7 R7 R7 R7 R8_fiq R8 R8 R8 R8 R8 R9_fiq R9 R9 R9 R9 R9 R10_fiq R10 R10 R10 R10 R10 R11_fiq R11 R11 R11 R11 R11 R12_fiq R12 R12 R12 R12 R12 R13_fiq R13_abt R13_irq R13_und R13 R13_svc R14_fiq R14_abt R14_irq R14_und R14 R14_svc R15 (PC) R15 (PC) R15 (PC) R15 (PC) R15 (PC) R15 (PC) CPSR CPSR CPSR CPSR CPSR CPSR SPSR_fiq SPSR_abt SPSR_irq SPSR_und SPSR_svc ARM7 Register & Betriebszustände
ARM7 Current Processor Status Register (CPSR) Condition Code Flags: N = NegativeZ = Zero C = Carry Over V = Overflow (Ergebnis grösser als Platz im Register) F = 1 FIQ disableI = 1 IRQ disable T = 1 Thumb mode Betriebszustand:FIQIRQ Supervisor UserUndefined (Mode)
Cortex-M3 Current Processor Status Register (CPSR) Application Interrupt Execution Zeigt welche Exception der Prozessor gerade behandelt Condition 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 Flag ICI/IT = Interrupt Continuable Instruction (ICI), IF-THEN instruction status T = Thumb state, immer 1, löschen verursacht Fault Exception
Cortex-M3 Betriebszustände OperationModes PrivilegeLevels Wechseln der Betriebszustände: MSR CONTROL, R0
ARM7 Exception Priorities Priority Exception Highest 1 Reset 2 Data Abort 3 FIQ 4 IRQ 5 Prefetch Abort Undefined Instruction SWI Lowest 6
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 0xF000 0000 VPB Peripherals 3.5 GB 0xE000 0000 3.0 GB 0xC000 0000 Reserved for External Memory 2.0 GB 0x8000 0000 Boot Block Reserved for On-Chip Memory Stack Pointer On-Chip Static RAM 0x4000 0000 1.0 GB Reserved for Special Registers Main Code 0x3FFF 8000 Reserved for On-Chip Memory ExceptionVectors On-Chip Non-Volatile Memory 0.0 GB 0x0000 0000
Exception Vector Table 32-bit 0xFFFF FFFF 0x0000001c 0x00000018 0x00000014 64 Byte ExceptionVectorTable 0x00000010 0x0000000c 0x00000008 0x00000004 0x00000000
Einrichten von Exception Vectorsmit startup.s • 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
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 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 Externe C exception Routinenwerden deklariert Exception Vektor Tabellestartet 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 ?
Ü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
ARM 7: Core hat genau nur 2 Interrupt Leitungen FIQ ARM7 TDMI 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: Aufsetzen von Interrupt Routinen • Initialisieren der Interrupts im Hauptprogramm (main.c) • Erstellen der Interrupt Service Routine • Eintragen der Interrupt Routinen im Startup.s Beispiel am ARM7 ähnlich am Cortex-M3
ARM7: Interrupt Initialisierung in main.c 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 • Initialisieren der Interrupts im Hauptprogramm (main.c) • Erstellen der Interrupt Service Routine • Eintragen der Interrupt Routinen im Startup.s Beispiel am ARM7 ähnlich am Cortex-M3
ARM7: FIQ Interrupt Service Routine • 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 void fiqint (void) __fiq { IOSET1 = 0x00FF0000; // Set the LED pins EXTINT = 0x00000002; // Clear the peripheral interrupt flag } Frei wählbarer Name Erklärt Compiler, dass es sich um FIQhandelt
ARM7: Aufsetzen von Interrupt Routinen • Initialisieren des Interrupt Controllers im Hauptprogramm (main.c) • Erstellen der Interrupt Service Routine • Eintragen der Interrupt Routinen im Startup.s Beispiel am ARM7 ähnlich am Cortex-M3
ARM 7: Eintragen der FIQ Routinen Startadresse im Startup Code 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 Adresseintrag der FIQ Routinein der Vektortabelle Adresse der FIQ Routine
Benennung der Exception Routinen Exception source Constants table C function header Undefined Instruction Undef_Handler?A void Undef_Handler (void)__abort Prefetch Abort PAbt_Handler?A void Pabt_Handler (void) __abort Data Abort DAbt_Handler?A void Dabt_Handler (void) __abort Fast Interrupt fiqint?A void fiqint (void)__fiq Frei wählbarer Nameder Interrupt Routine, Müssen mit Headerübereinstimmen Benutze den gleichen Namenfür die C Interrupt Routine
Software Interrupt (SWI)- Switch to Supervisor Mode - 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) ……
ARM 7 Core hat genau nur 2 Interrupt Leitungen FIQ ARM7 TDMI 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 VIC erweitert diese Interrupt Leitungen FIQ FIQ VIC ARM7 TDMI 16 Vectored IRQ 16 IRQ Non Vectored IRQ
Unterschiedliche Interrupt Service Routinen PC Int2 Interrupt Vektoren 0x402040 Int1 0x402010 0x401000 Main 0x000000
ARM7 Exception Vector Tabelle 0xFFFF FFFF 0xFFFF F030 Vector Address Register ExceptionVector PC unmittelbar nach FIQ 0x0000001c PC unmittelbar nach IRQ 0x00000018 64 Byte ExceptionVectorTable Program Counter unmittelbar nach Reset 0x00000000
>1 >1 Vectored Interrupt Controller im LPC2138 16 Interrupt Slots 18 Chip interne und 4 externeInterrupt Quellen Highest PriorityInterrupt Slot Vector AddressRegisters ARM7 EINT3 VICVectAddr 0 VICVectAddr 1 EINT2 VICVectAddr 2 IRQ VICvectCntl 0..15 EINT0 VICIntEnable …. SPI0 Lowest PriorityInterrupt Slot VICVectAddr 15 I2C0 FIQ Default Vector Address Register Vector Address Register VICIntSelect Adresse0xFFFF030
Edge Triggered vs. Level Triggered Interrupt Edge Triggered Interrupt ARM-Core Latch PeripherieBaustein Edge Detector Int Int S R Mikrocontroller Clear_Int Level Triggered Interrupt ARM-Core Int PeripherieBaustein Int Clear_Int Register
External Interrupt Register PINSEL0Bits 3..2 InterruptLatch EXTMODE IC-Pin P0.1 EINT0 =1 Edge Detector S EINT EXOR R EXTPOLAR EXTINT GPIO Port 0.1 0 RxD (UART0) PWM3
External Interrupt Register Jedes Register enthält je ein bit für EINT0-EINT3
VicIntEnable Register Aktiviert Interrupt Eingänge
VicIntSelect Register Bestimmt welche der bis zu 22 Quellen (Architektur erlaubt bis zu 32 Quellen) dem FIQ oder dem IRQ Ausgang zugeordnet sind1 = FIQ, 0 = IRQ
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
ARM7 Exception Vector Tabelle 0xFFFF FFFF 0xFFFF F030 Vector Address Register ExceptionVector PC unmittelbar nach FIQ 0x0000001c PC unmittelbar nach IRQ 0x00000018 64 Byte ExceptionVectorTable Program Counter unmittelbar nach Reset 0x00000000
Auslesen des Vector Address Register Oberes Adressendedes Microcontrollers 0xFFFF FFFF LDR PC,[PC,# -0x0FF0] Vector Address Register 0xFFFF F030 Unteres Adressendedes Microcontrollers 0x0000 0018 IRQ Interrupt Vector 0x0000 0000 0x18 + 2 x 4 Byte – 0xFF0 = 0xFFFF F030
Berechnen der Interrupt Einsprungadresse bei NXP Darstellung der Instruktion:LDR PC, [PC, # - 0x0FF0] InterruptEreigniss InstructionPipeline Fetch Instr. XY LDR PC, [PC, # - 0x0FF0] Decode LDR PC, [PC, # - 0x0FF0] LDR PC, [PC, # - 0x0FF0] Execute Adresse xy 0x018 0x01c 0x020 Programm Counter LPC AdressRaum 0x0FF0 0xFFFF F034 - Vector Address Register PC PC 0xFFFF F030 (0x020) 0xFFFF F02C