Blick ins Kerngehäuse Der Cortex-M3 im Vergleich zu ARM7 – Performance und Speicherbedarf

Was ist anders beim Cortex-M3 gegenüber seinem Vorgänger ARM7? Am Beispiel des STM32-Controllers werden hier die Unterschiede bezüglich Performance, Speicherbedarf und Interrupt-Verarbeitung aufgezeigt.Der STM32-PerformanceStick ermöglicht dabei interessante Vergleiche von alter und neuer Architektur.

Für eine schnelle Befehlsabarbeitung sind mehrere Faktoren wichtig: eine intelligente und schnelle Befehls-Pipeline sowie ein ungehinderter und schneller Zugriff auf den Speicher. Für beides wurde im Cortex-M3 gesorgt. Wie beim ARM7 hat der Cortex-M3 eine dreistufige Pipeline: Instruction Fetch, Instruction Decode und Instruction Execute. Diese Pipeline funktioniert optimal bei linear abgearbeitetem Code, d.h., es wird immer parallel zur Ausführung des Codes ein neuer Befehl decodiert und hierzu parallel auch gleich aus dem Speicher gelesen. Bei einem Sprung funktioniert das nicht. Beim ARM7 muss nun die Pipeline gelöscht werden und der Befehl der Zieladresse durch die drei Stufen der Pipeline hindurchwandern, was zu Leerlaufzyklen führt.

Der Cortex- M3 hat hier eine Optimierung integriert. Wenn in der Decode- Stufe ein Sprungbefehl erkannt wird, wird auch gleich der Befehl von der vermuteten Zieladresse geholt („speculative instruction fetch“). Wird der Sprung nicht ausgeführt, ist der nächste Befehl bereits durch den linearen Prefetch in der Pipeline; wird der Sprung ausgeführt, steht er mit nur einem Zyklus Verzögerung zur Verfügung. Damit der Prefetch auch bei 72 MHz – der maximalen CPU-Frequenz der STM32-Familie – aus dem internen Flash schnell funktioniert, hat STMicroelectronics in den Flash einen 2 × 64 bit großen Prefetch-Buffer eingebaut, der im laufenden Betrieb aktiviert oder deaktiviert werden kann.

Kombination aus Harvard- und Von-Neumann- Architektur

Für den ungehinderten Zugriff wurde die Busstruktur komplett verändert. Im Gegensatz zum ARM7 mit seiner Von- Neumann-Architektur und dem Flaschenhals des gemeinsamen Datenund Befehlsbusses, vereint der Cortex- M3 die Vorteile der Von-Neumann- Architektur mit dem gemeinsamen linearen 4-Gbyte-Adressraum und trotzdem der getrennten Busstruktur der Harvard-Architektur. Während beim gemeinsamen Bus sowohl das Lesen der Befehle, die Datentransfers von CPU- und DMA-Controllern als auch die Steuerung der Peripherie auf einen Bus konzentriert sind, ist beim Cortex-M3 der Flash-Speicher an einen gesonderten Instruction-Bus angeschlossen, der ausschließlich für das Lesen der Befehle reserviert ist.

Alle Datenzugriffe gehen über den Datenbus, wobei sich hier CPU und DMA-Controller als Master den Bus teilen. Dieser Datenbus ist über eine Busmatrix mit Arbiter an den Flash- Speicher, das RAM, das externe Bus- Interface (bei den Derivaten, bei denen es implementiert ist) und über zwei Brücken mit den Peripheriebussen APB1 und APB2 verbunden. Damit die CPU nicht vom DMA-Controller ausgebremst wird, hat diese eine garantierte Busbandbreite von 33 %. Der DMA-Controller des STM32 hat sieben konfigurierbare Kanäle, deren Aufgabe es ist, Daten von der Peripherie in Datenpuffer oder umgekehrt zu verschieben, von Peripherie zu Peripherie zu übertragen oder Daten von Speicherbereichen zu kopieren. Jeder DMA-Zugriff besteht aus sechs Zyklen, einem Request& Arbitration-Zyklus, einem Adress-Berechnungszyklus, drei Buszyklen und einem Acknowledge-Zyklus.

Da die zwei ersten und der letzte Zyklus unabhängig vom Datenbus sind, kann hier ein zweiter DMA-Zugriff eingeschoben werden. Damit die CPU ihre garantierten 33 % Busbandbreite bekommt, ist nach den ersten zwei Buszyklen (read und write) der dritte Zyklus für die CPU reserviert. Es können also mit voller Busauslastung sowohl die CPU als auch zwei DMA-Kanäle gleichzeitig auf den Datenbus zugreifen, während die CPU ungestört über den Instruction- Bus Befehle lesen kann.