Cortex-M3
Ich fange mal mit der Seite zum ARM Cortex-M3 an.
Unterschiede zu anderen ARM-Architekturen:
Statusregister
- Anwendungsprogrammstatusregister (Application Program Status)
APSR Bit 31 Bit 30 Bit 29 Bit 28 Bit 27 Negative Zero Carry Overflow Saturation
- Bits für bedingte Ausführung
- Negative Negatives Ergebnis bei letzter Operation
- Zero Nullergebnis bei letzter Operation
- Carry Übertrag bei letzter Operation
- Overflow Überlauf bei letzter Operation
- Andere Bits
- Saturation Anzeige eines Überlaufs oder Unterlaufs bei Befehlen mit Sättigung
- Ausführungsstatusregister (Execution Status)
EPSR Bit 26 - Bit 25 Bit 24 Bit 15 - Bit 10 ICI/IT Thumb ICI/IT
- ICI/IT Interner Zwischenspeicher für den Prozessor für Wiederaufnahme eines Multiplen Befehles nach einer Exception oder für Zwischenspeicherung des IT-Befehls
- Thumb Thumbcode aktiv, im Falle des Cortex-M3 immer 1
- Ausnahmenstatusregister (Interrupt Program Status)
IPSR Bit 8 - 0 Exception number
- Exceptionnumber Beinhaltet die Nummer der Unterbrechung die Auslöste (am sinnvollsten in einer Interrupt-Service-Routine nutzbar)
Zugriff auf APSR und IPSR erhält der Programmierer durch den MRS/MSR-Befehl, abhängig von den aktuellen Privilegien. EPSR-Zugriffe über MRS/MSR sind möglich, werden im Falle von ICI/IT ignoriert und bei ungesetztem T-Bit folgt eine UsageFault-Exception.
Interrupte und Ausnahmen
FIQs werden nicht mehr unterstützt.
Der Cortex-M3 beinhaltet eine Interruptverwaltung (Nested Vectored Interrupt Controler) ab Werk und räumt mit den unterschiedlichen Implementierungen unterschiedlicher Hersteller auf. Die Interruptverwaltung ermöglicht eine priorisierte Verarbeitung von Interrupten. Der Interruptcontroller stellt auch den Systemtick zur Verfügung.
Primäres Interruptbit
Die Primäres Interruptbit (PRIMASK) ist ein 1-Bit Register. Wenn es gesetzt ist werden nur NMI- und Hard-Fault-Ausnahmen einen Interrupt auslösen.
Fehler-Interruptbit
Die Fehler-Interruptbit (FAULTMASK) ist ebenfalls ein 1-Bit-Register. Wenn es gesetzt ist werden nur NMI-Ausnahmen einen Interrupt auslösen.
Basispriorität
Die Basispriorität (BASEPRI) ist bis zu 8 Bit breit und abhängig von den im Interrupt-Teil unterstützen Prioritäten. Alle Interrupt mit einer Priorität gleich oder kleiner der in BASEPRI eingestellten Priorität werden unterdrückt.
Zugriff auf PRIMASK,FAULTMASK und BASEPRI erhält der Programmierer durch den MRS und MSR-Befehl, abhängig von den aktuellen Privilegien.
Vektortabelle
Die Vektortabelle beinhaltet echte Sprungadressen. Die erste Adresse in der Sprungtabelle ist der Stackpointer, der bei einem Reset geladen wird. Die zweite Adresse ist die Resetadresse.
Control-Register
- Bit 0 Durch ein gesetztes Bit wird der Prozessor in Ausnahmen (Handle-Mode) im Privilegierten Modus laufen und außerhalb (Thread-Mode) im unprivilegierten Modus.
- Bit 1 Durch ein gesetztes Bit wird der Prozessor in Ausnahmen (Handle-Mode) Main Stack Pointer (MSP) benutzen und im unprivilegierten Modus den Program Stack Pointer (PSP). Andernfall benutzen beide Modis den Main Stack Pointer
Nach einem Reset ist der Cortex-M3 im Privilegierten Modus
Stack
Es gibt keine Schattenregister für bestimmte Betriebsmodi mehr. Der Prozessor führt bei einem Interrupt ein automatisches Sichern des PC (R15), LR (R14), R12 und R0-R3 durch, welche nach dem Zurückspringen automatisch wieder vom Stack geholt werden. Der Prozessor hat zwei Stackregister (MSP und PSP), welche in Abhängigkeit von den Control-Registern je nach Betriebsmodus (Privilegierter Modus oder UserMode) im Registerraum eingeblendet werden.
Befehlssatz
Das Umschalten zwischen ARM-Codes und Thumb-Codes ist nicht möglich, es wird nur Thumb2 ausgeführt.
Es existieren Befehle für Division und kombinierte Addition und Multiplikation, Befehle mit Sättigung, Befehle für Bitreihenfolgenmanipulation, bedingte Ausführung.
IT-Opcode Als Ausgleich zu den fehlenden Bedingungsflags des ARM-Codes existiert der Opcode IT (If-True).
Speicherbereich
Der Adressbereich ist wie bei einem 32-Bit System üblich 4 GiB groß. Aufgeteilt ist es in mehrere fest definierte Teile:
Adressbereich Verwendung 0x00000000 – 0x1FFFFFFF Code-Bereich 0x20000000 – 0x3FFFFFFF SRAM-Bereich 0x40000000 – 0x5FFFFFFF Geräte-I/O-Bereich 0x60000000 – 0x9FFFFFFF Externer Speicher 0xA0000000 – 0xDFFFFFFF Externe Geräte 0xE0000000 – 0xE00FFFFF Interner und externer Geräte-Bus 0xE0100000 – 0xFFFFFFFF Herstellerspezifischer Bereich
Mit Bit-Band-Aliasing ist bitgenaue Speichermanipulation in bestimmten Speicherbereichen innerhalb eines Befehles möglich.
Genauere Erläuterungen:
Befehle
IT-Opcode für Bedingte Ausführung
Diesem Opcode wird eine Bedingung (EQ, GT etc.) übergeben die für den ersten Befehl der folgt erfüllt sein muß. Wenn die Bedingung nicht erfüllt ist, wird der Befehl übersprungen. Ein IT-Block kann bis zu 4 Befehle beinhalten, wobei der erste Befehl der Kette immer wahr sein muß. Die folgenden Befehle werden entsprechend der Angabe ihrer Bedingung, welche die Bedingung im IT-Befehl oder die gegenteilige Bedingung ist, ausgeführt oder übersprungen.
CMP R0,R1 ;Vergleich mit Aktualisierung der Statusbits ITETE LT ;TRUE-ELSE-TRUE-ELSE LT MOV[LT] R2,R0 ;TRUE Bedingung R0 LT R1 MOV[GE] R2,R1 ;ELSE Bedingung !(R0 LT R1) MOV[LT] R3,R0 ;TRUE Bedingung R0 LT R1 MOV[GE] R3,R1 ;ELSE Bedingung !(R0 LT R1
Die in eckigen Klammern angegebenen Bedingungen sind der Lesbarkeit halber angegeben. Ein bedingter Sprung kann im IT-Block angegeben werden mit der Besonderheit, daß er am Ende des Blocks stehen muß.
Division
Es existieren zwei 32-Bit-Divisionsbefehle. Beide Befehle speichern keinen Rest und sind auf 32-Bit als Divident begrenzt.
- SDIV Division mit Vorzeichen
- UDIV Division ohne Vorzeichen
SDIV/UDIV R0,R1,R2 führt zum Ergebnis in R0 aus der Division von R1 durch R2
Bitreihenfolgenmanipulation
Für Bitmanipulation stehen mehrere Befehle zur Verfügung:
- REV Die Byte-Anordnung wird umgedreht und bietet Konvertierung von zwischen Big- und Little-Endian innerhalb eines Befehles.
- REV16 Wechselt die Byte-Anordnung im Oberen und Unteren Wort.
- REVSH Konvertiert einen 16 Bit-Wert mit Byte-Anordnungswechsel und folgender Vorzeichenerweiterung in einen 32 Bit-Wert.
- RBIT Dreht die Bit-Anordnung um.
- BFC Löscht Bits ab einer Bit-Position über eine angegebene Länge.
- BFI Kopiert in das Zielregister die Bits des Quellregister ab der angegebenen Bit-Position über die angegebene Länge.
- SBFX Extrahiert die Bits ab einer angegebene Position über eine angegebene Länge in das Zielregister ab Bit 0 und erweitert es vorzeichenkorrekt.
- UBFX Extrahiert die Bits ab einer angegebene Position über eine angegebene Länge in das Zielregister ab Bit 0 und setzt die andere Bits auf 0.
- SXTB,SXTH Erweitert den Byte-Wert (SXTB) oder den Wort-Wert (SXTH) vorzeichenkorrekt auf 32 Bit. Optional kann vor der Korrektur ein ROR ausgeführt werden.
- UXTB,UXTH Erweitert den Byte-Wert (SXTB) oder den Wort-Wert (SXTH) vorzeichenlos auf 32 Bit. Optional kann vor der Korrektur ein ROR ausgeführt werden.
MAC-Opcodes
Kombinierte Multiplikations und Additionsbefehle sind:
- MLA Vorzeichenlose Multiplikation zweier 32 Bit-Werte und Addition der unteren 32 Bit des Ergebnisses der Multiplikation mit einem 32-Bit-Wert.
- MLS Vorzeichenlose Multiplikation zweier 32 Bit-Werte und Subtraktion eines 32-Bit-Wert von den unteren 32 Bit des Ergebnisses der Multiplikation.
- SMLAL Vorzeichenbehaftete Multiplikation zweier 32 Bit-Werte zu 64 Bit und folgendes Addieren eines 64 Bit-Wertes.
- UMLAL Vorzeichenlose Multiplikation zweier 32 Bit-Werte zu 64 Bit und folgendes Addieren eines 64 Bit-Wertes.
Sättigung
Zwei Befehle sind im Zusammenhang mit dem Q-Flag des APSR nutzbar:
Übersteigt der Wert die Bitgrenze n wird der Maximalwert geliefert, Unterschreitet der Wert den Minimalwert wird der Minimalwert geliefert, andernfalls wird der Wert selbst geliefert. Bei Überschreiten einer einer Grenze wird das Q-Flag gesetzt.
- SSAT Sättigungskorrektur mit Vorzeichenbehafteten Werten.
- Die Bitgrenze n ist von 1 bis 32
- Der Minimalwert ist - 2 ^ (n - 1)
- Der Maximalwert ist ( 2 ^ (n - 1) ) - 1
- USAT Sättigungskorrektur zu Vorzeichenlosen Werten.
- Die Bitgrenze n ist von 0 bis 31
- Der Minimalwert ist 0
- Der Maximalwert ist ( 2 ^ n ) - 1
Ein optionales Arithmetisches oder Logisches Verschieben nach Rechts vor dem Abarbeiten ist möglich.
Speicherzugriff
Bit-Band-Aliasing
Der SRAM und der Gerätespeicher sind im für die ersten 32 MB als Bit-band-Alias definiert.
Unter Bit-Band-Alias versteht man einen Speicherbereich, der einen bitgenauen Zugriff auf einen Speicherbereich innerhalb eines Befehles zuläßt. So ist es möglich ohne Deaktivierung von Unterbrechungsanforderungen und in einem Befehl ein Bit zu lesen oder ein Bit zu setzen.
z.B. Der SRAM-Bereich von 0x20000000-0x200FFFFF kann durch 32-Bit-Zugriffe im Bereich von 0x22000000-0x23FFFFFF bitweise angesprochen werden:
- 0x22000000 entspricht dem Bit 0 von 0x20000000
- 0x22000004 entspricht dem Bit 1
- 0x22000008 Bit 2
- 0x22000020 entspricht dem Bit 0 von 0x20000001
- usw.
Bit-Band-Adresse = Bit-Band-Basis + (Byte-Offset × 32) + (Bit[0-7] × 4) 0x22000020 = 0x22000000 + 1 × 32 + 0 × 4
Beim Zugriff zählt nur das unterste Bit im schreibenden und lesenden Zugriff.
Ein Schreiben auf Adresse 0x22000008 mit einem Wert von 1 setzt das 2. Bit in 0x20000000 innerhalb eines Befehls und wird atomar ausgeführt.
Das Lesen von der Adresse 0x22000008 ergibt je nach Zustand des 2. Bits in 0x20000000 eine 1 oder eine 0 als Ergebnis.
Siehe ARM_Bitbanding.