Welcher Rechenknecht darf es sein? ARM-Cortex-M3-MCU-Implementierungen und deren Unterschiede

Auf dem neuen ARM Cortex-M3 basierende Mikrocontroller erfreuen sich immer größerer Beliebtheit – die Zahl der Anbieter und der verschieden Varianten nehmen auch in diesem Jahr weiter stark zu. So haben neben Texas Instruments (Stellaris) und STM (STM32) auch NXP (LPC1700), Atmel (AT91SAM3) und der erste japanische Hersteller Toshiba (TMP330) Controller auf Basis dieser ARM-Architektur im Programm.Dieser Artikel stellt einige Gemeinsamkeiten und Unterschiede heraus.

Der ARM Cortex-M3 ist der erste ARM-Core, der speziell für den Mikrocontroller-Markt konstruiert wurde. Diese Architektur enthält viele Leistungsmerkmale und Komponenten, die früher Halbleiterhersteller unterschiedlich implementiert haben und so trotz der Verwendung des gleichen ARM-Cores (z.B. ARM7 im LPC2000, AT91SAM7 oder STR7) sehr unterschiedliche Rechenleistungen geliefert haben und auch erhebliche Unterschiede in der Programmierung aufwiesen.

Durch die von ARM angepasste Architektur speziell für den Mikrocontrollermarkt sind Komponenten wie der Interrupt-Controller und das vereinfachte Programmiermodell für alle Implementierungen gleich; die Unterscheidungsmerkmale müssen an anderer Stelle gesucht werden. Dieser Artikel macht ein paar der Unterschiede klarer und stellt einige der „Besonderheiten“ und Spezialitäten der unterschiedlichen Implementierungen und Hersteller unabhängig und neutral dar, wobei hier auf die schon genannten Hersteller eingegangen wird.

Generelle Implementierungs-Optionen beim Cortex-M3

Der Cortex-M3 hat ein paar generelle Implementierungs-Optionen, die der Hersteller je nach Anwendungsbereich festlegen kann. Die Anzahl der Interrupts, die in dem Nested-Vector-Interrupt- Controller (NVIC) umgesetzt werden, ist von dem Gesamtsystem abhängig und kann zwischen 1 und 240 liegen. Ebenso ist die Anzahl der Prioritäts-Bits, mit dem jeder einzelne Interrupt via Software programmiert werden kann, von der Implementierung abhängig; sie kann zwischen 3 und 8 liegen. Das Interessante ist, dass das Programmiermodell immer von 8 Bits ausgeht und nicht implementierte Bits als 0 interpretiert.

Die bisherigen Implementierungen haben bis zu 32 Interrupts und 3 bis 4 Prioritäts- Bits für den NVIC vorgesehen. Mit der Implementierung des NVIC im Cortex- M3 ist diese Tabelle eine echte Vektortabelle, d.h., dort stehen Sprungadressen (Vektoren) und keine gültigen Befehle. Über seine direkte Schnittstelle zum Core können diese Vektoren (Adressen) sehr schnell geladen und angesprungen werden. Der Interrupt-Controller 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 , ergeben ein sehr effizientes Interrupt-System.

Allgemein kann jedem Interrupt eine Priorität zugewiesen werden, d.h., die Priorität wird nicht über die Position in der Vektor-Tabelle 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 mit niedrigerer Priorität. Das ist z.B. wichtig, um DeadLocks bei gemeinsam verwendeter Hardware zu vermeiden. Weitere Optionen sind die Speicherschutzeinheit (Memory Protection Unit, MPU), die Embedded-Trace-Microcell (ETM) und weitere Debugund Trace-Optionen.

Bild 1 zeigt die Blockschaltung des Cortex-M3. Seit der ersten Implementierung des ARM Cortex-M3 durch die Firma Luminary Micro, die mit den Mikrokontrollern der Stallaris-Familie seit 2006 zur Zeit das größte Portfolio an verschiedenen Varianten und verschiedenen Entwicklungs-Kits stellt, hat ARM dem Core in einer zweiten Revision ein paar kleine Verbesserungen mitgegeben. Zum einen hat ARM den RTLCode für die Synthese optimiert.

So ist zu erwarten, dass die Mikrokontroller auf Basis des Cortex-M3 Ref. 2 bei gleicher Technologie etwas schneller sein werden. Dieses wird von NXP und seiner Version der Cortex-M3-Implementierung unterstrichen, die LPC1700-Familie ist mit einer maximalen Taktfrequenz von 100 MHz angekündigt.

Dieses wird sicherlich auch auf die Flash-Accelerator-Technologie zurückzuführen sein, für die NXP Patente hält und schon in dem LPC2000 erfolgreich einsetzte.

Eine zweite interessante und auffällige Erweiterung ist der Wake-up-Interrupt- Controller (WIC, Bild 2), der als funktionaler Teil des NVIC eine einfachere und bessere Trennung der Taktsysteme des Core für Ultra-Low- Power-Anwendungen zulässt. Es ist so möglich, den Core schneller aus dem Low-Power-Modus in den aktiven Betrieb zurückzubekommen. STMicroelectronics hat in der STM32-Familie, ohne auf dieses Leistungsmerkmal zurückgreifen zu können, ein interessantes Takt-Verteilung- und Versorgungssystem eingebaut und kommt im Low-Power-Modus (Standby-Modus) auf knappe 2 μA.

Es wird interessant sein zu sehen, wie andere Hersteller dies umgesetzt haben. Was die Debug- und Trace-Leistungsmerkmale angeht, hat ARM in der Ref. 2 dem Hersteller mehr Freiheiten gegeben, was hier implementiert werden kann und für die vorgesehene Anwendung sinnvoll ist. ARM gibt dem Hersteller vier Debug- und Trace-Ebenen zur Auswahl, die implementiert werden können (Tabellen 1 und 2):

Debug- Ebene
Halt- ModusBreakpointsWatchpoints
DWT- ZählerDAPFlash- PatchDWT- Daten-Match
3ja8 (6 + 2)
4jaja
jaja
2ja8 (6 + 2)
4jajajanein
1ja21jajaneinnein
0nein00neinneinneinnein
Tabelle 1. Übersicht über die vier Debug-Ebenen des Cortex-M3 Ref. 2.
Trace- EbeneDebug- EbeneDWT- WatchpointDWT- Metrics
HTM- Port
DWT- TraceITM ETM
3> 0jajajajajaja
2> 0jajaneinjajaja
1> 0jajaneinjajaja
0> 0janeinneinneinneinnein
00neinneinneinneinneinnein
Tabelle 2. Übersicht über die vier Trace-Ebenen des Cortex-M3 Ref. 2

Damit verglichen liegen die Implementierungen des Cortex-M3 Ref. 1 etwa zwischen den Ebenen 2 und 3. Eine weitere optionale Ergänzung, die ARM bei der Ref. 2 des Cortex-M3 zur Verfügung stellt, ist eine 150 bit breite Analyse- und Observierungs- Schnittstelle. Diese ist insbesondere für sicherheitskritische Anwendungen interessant, da mit dieser Schnittstelle in Verbindung mit der FaultRobust- Technologie von Yogitech eine sehr hohe Abdeckung nach dem Sicherheitsstandard ICE 61506 gegeben ist. Dieses findet besonders im SoC-Design bei Controllern in dem Automobilbereich seine Anwendung.

Es gibt noch ein paar kleinere Änderungen wie die Multicore-Unterstützung und die Unterstützung des Standards AMBA 3.0 für den Privat-Peripheral- Bus des APB, die in der Ref. 2 des Cortex-M3 implementiert worden sind.