- Cortex-M3
-
Der Cortex-M3 ist eine neue Architektur (ARMv7-M) für Mikroprozessoren von ARM. Diese Architektur kann als Nachfolger für die ARM7 im Bereich der Mikrocontroller betrachtet werden.
Inhaltsverzeichnis
Hintergrund
ARM-Architekturen sind im Laufe der Zeit immer komplexer geworden. Der erste populäre ARM-Prozessor war (und ist immernoch) der ARM7, gefolgt vom ARM9 und ARM11 in unterschiedlichsten Ausführungen.
Die Einsatzgebiete für diese drei Prozessorfamilien lassen sich in etwa folgendermaßen einteilen:
ARM7: Dies war ein Selbstläufer im Bereich der Mikrocontroller. Ursprünglich nicht unbedingt für die Mikrocontrollerwelt gedacht, hat sich dieser Prozessor dort sehr etabliert. Eingesetzt werden ARM7-basierte Mikrocontroller dort, wo etwas mehr Rechenleistung erforderlich ist als z. B. ein 8-Bit-Prozessor liefern kann.
ARM9: Einsatzgebiet sind Umgebungen, die weit mehr Rechenleistung erfordern als z. B. bei ARM7. Hier kommen Mechanismen wie z.B. MMU und MPU zum Einsatz. Einsatzgebiet sind u. a. Echtzeitsysteme
ARM11: High-End-Anwendungen, wo im Embeddedbereich sehr viel Rechenleistung gefordert wird.
ARM hat sich nun entschlossen, seine neue Architektur in drei Zweige aufzuteilen, und somit Nachfolger für alle drei Bereiche zu schaffen. Der Sprung von ARM7 nach ARM9 ist meist schon zu groß, da der ARM9 um einiges komplexer ist und auch mehr Chipfläche benötigt.Diese Aufteilung ermöglicht einen noch breiteren Einsatz der neuen Architektur(en) in der Welt der Embeddedsysteme.
Cortex A: Application (betriebssystembasierte Anwendungen)
Cortex R: Realtime (Echtzeitanwendungen)
Cortex M: Microcontroller (Cores für Mikrocontroller)
Die Cortex-M3-Architektur kann somit als Nachfolger für den ARM7 betrachtet werden und stellt mehr Rechenleistung als ein ARM7 bei geringer Komplexität des Programmiermodells und geringer Chipfläche zur Verfügung.
Auf den Cortex-M, insbesondere den M3, soll in diesem Artikel näher eingegangen werden. Andere Untergruppen, wie z. B. der M1, sind z. B. für die Implementierung auf einem FPGA verfügbar.
Prinzipieller Aufbau
Der Cortex-M3 ist eine völlig neu entwickelte Architektur von ARM mit dem Ziel, einen sehr leistungsfähigen, aber vom Programmiermodell her weniger komplexen, Prozessor zu entwerfen, der im Bereich der jetzigen und zukünftigen Mikrocontroller des (klassischen) 8- und 16-Bit-Bereichs eingesetzt werden kann. Wie alle ARM-Architekturen hat auch der M3 (intern) eine 32-Bit-Architektur, arbeitet aber ausschließlich mit dem neuen Thumb2-Befehlssatz. (Andere ARM-Cores können zwischen ARM- und Thumb-Befehlssatz umschalten.) Herzstück des Cortex-M3-Prozessors ist der Cortex-M3-Kern mit dreistufiger Pipeline, basierend auf der Harvard-Architektur. ARM-Prozessoren sind für beide Architekturen, Von-Neumann (wo ein Daten- und Adressbus zum Laden von Befehlen und Daten verwendet wird), und Harvard verfügbar. Die Harvard-Architektur zeichnet sich dadurch aus, dass zwei getrennte Bussysteme (und zwei getrennte Speicher) zum Laden von Daten und Befehlen existieren, d. h. der Prozessor kann gleichzeitig sowohl Daten als auch Befehle lesen (bzw. Daten in den Speicher zurückschreiben). Nach außen hin (Programmiermodell) ist der Cortex-M3 allerdings ein Von-Neumann-Modell, das bedeutet, dass sein ganzer (geteilter) Adressraum linear programmiert werden kann. Das erspart aufwendige Zugriffe auf den Programmspeicher, wenn dort Konstanten abgelegt sind.
Bei einem 32-Bit-Prozessor ist der ansprechbare Speicherbereich mit 4 Gigabyte für einen Microcontroller überdimensional groß. Daher existieren genügend Adressen, um beide Speicher im gemeinsamen Adressraum anzusprechen. Für den Programmierer des Systems ist dies ein überaus großer Vorteil, da Daten, welche im Flash (Programmspeicher) abgelegt werden (Konstanten, Strings, etc.) direkt linear adressiert werden können und nicht erst mit umständlichen Befehlen geladen werden müssen.
In den Kern des Cortex-M3 wurden einige neue Features integriert. So gehören ein echter Nested Vectored Interrupt Controller, eine Art Sprungvorhersage und Multiplikation in nur einem Takt, dazu.
Sprungvorhersage (kurze Erläuterung)
Die Sprungvorhersage im Cortex-M3 ist interessant gelöst: Zum Laden eines Befehls werden nur 16 Bit benötigt, das Speicherinterface ist aber 32 Bit breit, und es werden immer zwei Befehle gleichzeitig geladen (fetch). Ein Befehl wird jeweils zwischengespeichert. Im Falle eines Sprungs ist erst in der Exec-Stufe (vgl. Pipelines) bekannt, ob der Sprung genommen werden soll oder nicht. Wenn nein, wird wie gehabt weitergearbeitet. Wenn ja, wird der gepufferte Befehl in die Pipeline geladen und damit weitergearbeitet. Somit geht bei der dreistufigen Pipeline nur ein Takt (anstelle von zwei) verloren.
Thumb2
Der Prozessorkern arbeitet ausschließlich mit dem neuen Befehlssatz Thumb2, wodurch er um einiges effektiver arbeitet als ältere ARM-Prozessoren mit Thumb (bezogen auf die Ausführungszeit) und um etwa 30 % [1] kompakteren Code erzeugt als ältere ARM-Prozessoren im ARM-Mode. Der Thumb-Befehlssatz ist ein 16-Bit-Befehlssatz, der darauf ausgelegt ist, möglichst effizient mit Compilern zu arbeiten, d. h. z. B. C/C++-Code umzusetzen, aber natürlich auch unter Assembler verwendet werden kann.
Thumb2-Befehle sind (wie Thumb) nur 16 Bit lang. Das ermöglicht die Verwendung eines 16-Bit-Speichers, ohne dass immer zwei Takte zum Laden eines Befehls verwendet werden müssen. Fast alle klassischen ARM-Befehle wurden auf 16 Bit umgesetzt, nur ein paar wenige müssen einen zweiten 16-Bit-Teil nachladen.
Weitere große Neuerungen in Thumb2 sind z. B. native Bitfield manipulation, Hardware-Division und If-Then-Anweisungen. Letztere ermöglichen eine bedingte Ausführung von Code (ohne springen zu müssen).
Einfach gehaltenes Programmiermodell
Ein weiterer großer Vorteil der Cortex-M3-Architektur ist, dass der Programmierer für vergleichsweise einfache Aufgaben über keine genauen Kenntnisse des internen Aufbaus und der Struktur des Kerns verfügen muss und auch keine Assemblerkenntnisse zum Programmieren benötigt.
Ein hardwarebasiertes Interruptschema ermöglicht ein sehr einfaches Schreiben von Interrupthandlern, ohne dass erst komplizierter Start-up-Code in Assembler geschrieben und Register umgesetzt werden müssen.
Peripherie
Der Cortex-M3 bringt bereits einige Peripherien mit sich. So sind z. B. ein echter Vectored-Interrupt-Controller (VIC), Memory-Protection, Timer und Debug- und Trace-Möglichkeiten in den Prozessor integriert.
Zusätzliche Peripherien wie UART, weitere Timer, PWM, I2C, SPI, usw. werden von den Chipherstellern entwickelt, oder als IP (Intellectual Property) von ARM dazugekauft. Diese lassen sich – wie gewohnt – über Register ansprechen.
Vectored Interrupt Controller
Klassischerweise besteht die Vektortabelle bei ARM-basierten Controllern aus echten Befehlen, nämlich meistens Sprungbefehlen zu einer Adresse (an der ein weiterer Sprung oder die Routine (ISR) steht). Eine Ausnahme kann hier die Speicherstelle für den FIQ (Fast Interrupt reQuest) bilden, da sie den letzten Platz darstellt und dort sofort mit dem Code für diese sehr schnell auszuführende Interruptroutine begonnen werden kann.
Mit der Implementierung des NVIC im Cortex-M3 ist diese Tabelle jetzt eine echte Vektortabelle, d. h. dort stehen Sprungadressen (Vektoren) und keine gültigen Befehle. Über sein direktes Interface zum Core können diese Vektoren (Adressen) sehr schnell geladen und angesprungen werden.
Der Interruptcontroller ist beim Cortex-M3 sehr eng mit dem Kern verbunden. Die Sicherung des Kontextes wird vom Prozessor automatisch vorgenommen. Weitere Besonderheiten wie „Late Arriving Interrupt“ und „Tail Chaining“, bei dem eine POP/PUSH-Sequenz eingespart wird (vgl. ARM7), ergeben ein sehr effizientes Interruptsystem. Allgemein kann jedem Interrupt eine Priorität zugewiesen werden, d. h. die Priorität wird nicht über die Position in der Vektortabelle fest vorgegeben. Die Prioritäten können in Gruppen organisiert werden. Interrupts in verschiedenen Gruppen können sich gegenseitig unterbrechen, innerhalb einer Gruppe unterbricht ein Interrupt höherer Priorität keinen niederpriorigen. Das ist z. B. wichtig, um Deadlocks bei gemeinsam verwendeter Hardware zu vermeiden.
Registersatz
Klassische ARM-Cores besitzen einen Satz von über 37 32-Bit-Registern, die sich auf verschiedene Modi aufteilen. Je nach Modus sind verschiedene Register sichtbar. Das erspart das Sichern von Registern z. B. für den FIQ (Schattenregister R8 bis R14 überdecken die Register aus dem User-Mode).
Der Cortex-M3 besitzt nur noch einen Satz von Registern (R0 bis R12, SP, LR, PC und CPSR) und einen zusätzlichen Stackpointer (SP). Beim Sprung in eine ISR sichert der Core automatisch die acht Register PC, CPSR, LR R0 bis R3 und R12.
Silizium
ARM ist ein Fabless-Unternehmen, das heißt, sie stellen selbst keine Chips her. ARM entwickelt Prozessorarchitekturen (und Peripherie), und stellt diese anderen Firmen als IP-Block (Intellectual Property) zur Verfügung.
Die erste Implementierung dieses Prozessors in einen Mikrocontroller wurde von dem Startup-Unternehmen Luminary Micro vorgenommen. Luminary Micro ist ebenfalls ein Fabless-Unternehmen und Hersteller der „Stellaris“-Microcontrollerfamilie (LM3S811, LM3S828, u. a). Eine Vielzahl von Peripherien wurden auf dem Chip implementiert; neben den gängigen Elementen wie UART, Timer etc. findet sich z. B. eine komplexe 3-Phasen-Motorsteuerung.
Eine weitere Cortex-M3-basierte Mikrocontrollerfamilie ist seit einiger Zeit von STMicroelectronics verfügbar (siehe Weblinks). Die STM32-Familie basiert ebenfalls auf dem Cortex-M3-Kern von ARM und beinhaltet eine Vielzahl sehr interessanter Peripherieelemente, zum Beispiel zur 3-Phasen-Motorsteuerung, Hall-/Inkrementalgeber-Interface, DMA, 12-Bit-ADC, sowie einiges an Standardperipherien. Sehr interessante Punkte dieser Implementierung sind z. B. das vom Core getrennte Debug-Modul, das auch bei „versehentlicher“ Ver-programmierung des Clock Trees den Zugriff auf den Core ermöglicht, sowie eine Clock-Security-Schaltung, die einen Ausfall der externen Clock (z. B. des Quarzes) bemerkt und auf einen internen Oszillator umschalten kann – ohne dass der Core „abstürzt“. Ein sauberes Programmiermodell für die Peripherals und ein hervorragendes System aus Headerfiles für das Registermapping, das eine einfache Programmierung des Cores auch ohne Driver-Library ermöglicht, runden diesen Mikrocontroller ab.
ARM Cortex Microcontroller Software Interface Standard (CMSIS)
Um eine gemeinsame Basis für die Programmierung von Cortex-M-basierten Mikrocontrollern zu ermöglichen, wurde am 12. November 2008 von ARM eine Standard-HAL veröffentlicht. Sie ist in Zusammenarbeit mit den Partnern der Industrie entstanden, und bietet auf dem Layer1, der Abstraktion der Register sowie deren Abbildung auf das Speicherlayout eine gemeinsame, einfach zu verwendende Programmierbasis. Bisher gab es zu der Vielzahl von Implementationen jeweils eigene Ansätze des Programmiermodells, von #defines auf einzelne Register bis hin zu komplexen Strukturen. Die HAL verwendet das Konzept der komplexen Strukturen, wobei für jedes Peripheral eine Struktur existiert, welche die Register des jeweiligen Peripherals komplett abbildet. Die Strukturen werden an die Adressen der Peripherals gemappt, was den Zugriff Peripheral→Register = Value bzw. value = Peripheral→Register ermöglicht.
Ein Layer 2, ein sehr effizienter Layer aus inline-Funktionen, bietet weitere Helferfunktionen zum einfachen NVIC-Handling sowie ein SystemTick-Timer-Setup, welches auf die Belange von Echtzeitbetriebssystemen abgestimmt ist.
Weblinks
- http://www.arm.com/pdfs/IntroToCortex-M3.pdf Whitepaper von ARM zum Cortex-M3
- http://www.onarm.com/ ARM Page: Ressources for Embedded Developers
- http://www.keil.com/support/docs/3440.htm ARM introduces CMSIS
- http://www.keil.com Compilertools/IDE für ARM-basierte Mikrocontroller
- http://www.segger.com Middleware (Betriebssystem, GUI, Filesystem) für Cortex-M3
- http://www.iar.com Compilertools/IDE für ARM-basierte Mikrocontroller
- http://www.raisonance.com/ Compilertools/IDE (auf GCC-Basis) für ARM-basierte Mikrocontroller, STM32-Circle
- http://www.rowley.co.uk/arm/ Compilertools/IDE (auf GCC-Basis) für ARM-basierte Mikrocontroller
- http://mcu.st.com/mcu/inchtml.php?fdir=pages&fnam=stm32 STM32, Cortex-M3 von ST Microelectronics
- http://www.luminarymicro.com Cortex-M3-basierte Mikrocontroller
- http://www.standardics.nxp.com/products/lpc1000/ LPC1000, Cortex-M3 von NXP Semiconductors
- http://www.hitex.com/index.php?id=cortex&L=2 Tools und Support für Cortex-M3
Einzelnachweise
Wikimedia Foundation.