Cortex-M3

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

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.