Mikroprozessor

ARM Cortex-M3

aus Wikipedia, der freien Enzyklopädie

Wechseln zu: Navigation, Suche
Logo
Logo

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

[Bearbeiten] Hintergrund

Nachdem ARM-Architekturen immer komplexer wurden, hat sich ARM entschieden, seine neue Architektur in 3 Zweige aufzuteilen. Diese Aufteilung ermöglicht einen noch breiteren Einsatz der neuen Architektur(en) in der Welt der embedded-systeme.

Cortex A: Application (Betriebssystembasierte Anwendungen)

Cortex R: Realtime (Echtzeitanwendungen)

Cortex M: Microcontroller (Cores für Mikrocontroller)


Ein ARM11 z. B. ist i. d. R. viel zu komplex für einfache Steuerungsaufgaben mit etwas User-IO, die Cortex-M3 Architektur stellt jetzt ein Höchstmaß an Rechenleistung bei geringer Komplexität des Programmiermodells und geringer Chipfläche zur Verfügung.

Auf den Cortex-M, insbesondere dem 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.

[Bearbeiten] 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 16Bit-Bereichs eingesetzt werden kann. Wie alle ARM-Architekturen ist auch der M3 (intern) eine 32Bit-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 Bus-Systeme (und zwei getrennte Speicher) zum Laden von Daten und Befehlen existieren, d. h. der Prozessor kann gleichzeitig 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 eine Art Sprungvorhersage und Multiplikation in nur einem Takt dazu.

[Bearbeiten] Sprungvorhersage (kurze Erläuterung)

Die Sprungvorhersage im Cortex-M3 ist interessant gelöst: Zum Laden eines Befehls werden nur 16Bit benötigt, das Speicherinterface ist aber 32Bit 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.


[Bearbeiten] 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 16Bit-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 16Bit umgesetzt, nur ein paar wenige müssen einen zweiten 16Bit-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).

[Bearbeiten] Einfach gehaltenes Programmiermodell

Ein weiterer großer Vorteil der Cortex-M3-Architektur ist, dass der Programmierer für vergeichsweise 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.

Der Prozessor ist (ziemlich) komplett in C programmierbar. was die Portierbarkeit von Systemen mit verschiedenen Prozessorkernen erheblich vereinfacht.

Ein hardware-basiertes Interrupt-Schema ermöglicht ein sehr einfaches Schreiben von Interrupt-Handlern, ohne dass erst komplizierter Start-up-code in Assembler geschrieben und Register umgesetzt werden müssen.


[Bearbeiten] 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.

[Bearbeiten] 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 Priörität zugewiesen werden, d. h. die Priöritä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 nieder-priorigen. Das ist z. B. wichtig, um DeadLocks bei gemeinsam verwendeter Hardware zu vermeiden.

[Bearbeiten] Registersatz

Klassische ARM-Cores besitzen einen Satz von über 37 32Bit-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-R14 überdecken die Register aus dem User-Mode).

Der Cortex-M3 besitzt nur noch einen Satz von Registern (R0-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-R3 und R12.

[Bearbeiten] 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 Sachen wie UART, Timer etc. findet sich z. B. eine komplexe 3Phasen-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 3Phasen-Motorsteuerung, Hall-/Inkrementalgeber-Interface, DMA, 12Bit-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 Oszillatzor 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 DriverLibrary ermöglicht, runden diesen Mikrocontroller ab.

[Bearbeiten] Einzelnachweise

  1. "Improved Code Density with Performance and Power Efficiency", ARM, Products & Solutions

[Bearbeiten] Weblinks

Copyright © 2005-2010 Hardware-Aktuell. Alle Rechte vorbehalten.