- ARM7
-
Die ARM-Architektur ist ein Kern-Design für eine Familie von 32-Bit-Mikroprozessoren, die dem RISC-Konzept folgen. ARM steht für Acorn Risc Machine.
Inhaltsverzeichnis
Entstehung
Das ARM-Design wurde 1983 vom englischen Computerhersteller Acorn als Entwicklungsprojekt gestartet. Das Team begann unter der Leitung von Roger Wilson und Steve Furber die Entwicklung eines leistungsfähigen Prozessors für einen Nachfolger der bis dahin auf dem 6502 basierenden Computer.
Anstatt wie die Konkurrenz auf Prozessoren der Unternehmen Intel oder Motorola zurückzugreifen, entwickelte man einen eigenen Prozessor, den ARM (Acorn Risc Machine), mit 32 Bit und einer geplanten Taktfrequenz von 4 MHz. Die Tests mit den Prototypen verliefen derart erfolgreich, dass die späteren Serienprozessoren (ARM2), die in den neu entwickelten Rechnern (Acorn Archimedes) verbaut wurden, direkt mit 8 MHz getaktet wurden. Tests ergaben, dass diese Rechner bei praktisch gleicher Taktfrequenz etwa achtmal schneller waren als die Konkurrenten Commodore Amiga und Atari ST.
Nachdem der ARM2 1989 zum ARM3 (mit Cache und höherer Taktfrequenz) weiterentwickelt worden war und immer mehr Unternehmen Interesse an diesen Prozessoren bekundet hatten, gründete Acorn im Jahre 1990 zusammen mit Apple und VLSI Technology das Unternehmen Advanced RISC Machines Ltd. (ARM) mit Sitz in Großbritannien.
Eigenschaften
Die Architektur zeichnet sich durch einen effizienten Befehlssatz aus, erlaubt eine kompakte Umsetzung in einem ASIC-Design und ist gut für Optimierungen im Bereich der Ausführungsgeschwindigkeit und der Stromaufnahme geeignet.
Eine bedeutende Implementierung ist der als StrongARM bekannte Mikroprozessor.
Der Hersteller Intel ist neben anderen Marktteilnehmern Lizenznehmer des Unternehmens Advanced RISC Machines Ltd. und darf somit auf der ARM-Architektur basierende Prozessoren herstellen. Darüber hinaus darf Intel (neben z. B. Motorola/Freescale oder NXP), im Gegensatz zu den meisten anderen Lizenznehmern, Änderungen und Erweiterungen am ARM-Kern durchführen. So vertrieb Intel bis 2006 unter dem Namen XScale eine in Lizenz gefertigte ARM-CPU und weitere ebenfalls als XScale bezeichnete und per Bus angebundene Peripherie-Halbleiter. Dazu gehören die PXA250-, PXA260- und PXA270-Prozessoren, die häufig in PDAs und Smartphones zum Einsatz kommen, vor allem für Windows CE und Palm OS, die aktuelle Generation heißt Monahans.
Die GNU Compiler Collection kann Code für ARM erzeugen und auch der Linux-Kernel läuft auf diesem CPU-Typ.
Einsatzgebiet
Aufgrund ihrer geringen Leistungsaufnahme kommen ARM-Prozessoren in vielen eingebetteten Systemen, wie Mobiltelefonen, PDAs und Routern zum Einsatz, z. B. im iPod, sowie auch im iPhone von Apple oder den Linux basierten Internet Tablets 770, N800, N810 von Nokia und den neueren PDAs von ASUS. Die Rechner der Acorn-Archimedes- und Risc-PC-Reihe von Acorn verwendeten ebenfalls ARM-CPUs. Nachfolgemodelle dieser Desktop-Rechner sind unter anderem von dem Unternehmen Castle Technology unter dem Namen IYONIX pc erhältlich. Der Nintendo DS und das GP2X verwenden ebenfalls ARM-Prozessoren.
Befehlssatz und Programmiermodell
Die ARM-CPU ist eine RISC-Architektur und kennt als solche drei Kategorien von Befehlen:
- Befehle zum Zugriff auf den Speicher (Load/Store)
- arithmetische oder logische Befehle auf Werte in Registern
- Befehle zum Ändern des Programmflusses (Sprünge, Subprogrammaufrufe)
Die ARM verfügt über einen 3-Register-Befehlssatz, alle arithmetisch/logischen Befehle akzeptieren also ein Zielregister und zwei Operandenregister.
Beispiel:
ADD r0, r1, r2 ; r0 := r1 + r2
Die ARM ist sowohl Little-Endian- als auch Big-Endian-kompatibel, kann also mit beiden „Byte Orders“ umgehen, was angesichts des Einsatzzwecks als Standard-CPU in Kommunikationsgeräten ein deutlicher Vorteil ist. Der Standardmodus der ARM ist little endian.
Registersatz und Ausführungs-Modi
Die ARM verfügt, wie viele RISC-CPUs, über eine große Anzahl von Registern (halb so viele wie beim PowerPC). Dem Programmierer stehen 15 „general purpose“-Register zur Verfügung (r0–r14), wobei im Register r13 standardmäßig der Stackpointer gehalten wird und das Register r14 als „Link Register“ benutzt wird, in dem die Rücksprungadresse bei Prozeduraufrufen (mit BL „branch with link“) gespeichert wird, um später zurück in den Programmzähler geschrieben zu werden (Rückkehr zum aufrufenden Programmcode). Das Register r15 fungiert als Programmzähler (Program Counter, PC). Zusätzlich zu diesen direkt veränderbaren Registern gibt es das Status-Register (CPSR, Current Program Status Register), das die Statusbits und andere Informationen, wie z. B. den momentanen Ausführungsmodus, enthält.
Die ARM verfügt über mehrere Ausführungs-Modi, die über bestimmte Ereignisse betreten werden und teilweise dem ausgeführten Code zusätzliche Privilegien einräumen. Im einzelnen sind das:
- User Mode: Normaler User-Code
- Supervisor Mode (SVC): Privilegierte Betriebssystem-Tasks, Eintritt z. B. durch Aufruf eines Software-Interrupts (SWI)
- Interrupt Mode (IRQ): Eintritt durch Auftreten eines äußeren Interrupt-Requests während der Befehlsverarbeitung.
- Fast-Interrupt-Mode (FIQ): Eintritt durch Auftreten eines äußeren Fast-Interrupt-Requests. Fast Interrupts werden meist nur für besonders zeitkritische Ereignisse benutzt (siehe Echtzeitsysteme).
- Memory Abort (ABT): Tritt auf, wenn eine Datenanforderung nicht erfüllt werden kann.
- Undefined Instruction Exception (UND): Eintritt durch Auftreten einer unbekannten Instruktion. Wird z. B. zur Emulation eines Gleitkomma-Coprozessors verwendet.
R13, R14 und das Statusregister werden für die Interrupt- und Exception-Modi gespiegelt (sogenannte Schattenregister), so dass Ausnahmebehandlungsroutinen sich nicht um die Sicherung des User-Stackpointers oder Link-Registers zu kümmern brauchen. Für die Fast Interrupts werden sogar R8–R14 gespiegelt und stehen so dem Programmierer einer Interrupt-Service-Routine direkt zur Verfügung, ohne dass er den Inhalt dieser Register vorher sichern müsste.
Befehlsbreite und Adressierungsarten
Der Load/Store-Befehl des ARM unterstützt die üblichen Adressierungsmodi. Bei der unmittelbaren Adressierung und der absoluten Adressierung gibt es jedoch einige Einschränkungen, die im folgenden näher erklärt werden sollen:
Sämtliche Befehle im ARM-Befehlssatz sind 32 Bit lang. Dies bedeutet auf der einen Seite, dass jede Instruktion mit einem Speicherzugriff geladen werden kann, wodurch sich das Design der Pipeline und die Instruction Fetch-Unit vereinfachen. Auf der anderen Seite können 32-Bit-Adressen oder 32-Bit-Werte nicht in einem 32 Bit breiten Befehl angegeben werden, da dann kein Platz mehr für den eigentlichen Befehlscode bleibt. Stattdessen hilft man sich folgendermaßen:
- Es können keine beliebigen 32-Bit-Werte direkt im Befehl codiert werden. Stattdessen werden für Direktwerte 8 Datenbits und 4 Shift-Bits angegeben, wobei der tatsächliche Shift-Wert der doppelte gespeicherte Wert ist, es können also Bitverschiebungen um 0, 2, 4, 6, 8 … 26, 28 und 30 Stellen erfolgen. Dabei werden die Bits, die aus dem Register hinaus geschoben werden, auf der anderen Seite wieder hinein geschoben. Wird diese Technik z. B. auf den Wert 255 in den Datenbits angewendet, können die hexadezimalen Werte 000000ff, 000003fc, 00000ff0, 00003fc0, … 0ff00000, 3fc00000, ff000000, fc000003, f000000f und c000003f direkt erzeugt werden.
- Andere Werte können durch Kombination von arithmetische Operationen (z. B. Addition, Subtraktion) erzeugt werden.
- Alternativ können Werte auch im Speicher gehalten und vor dem eigentlichen Befehl in ein Register geladen werden.
- Der (relative) Sprungbefehl enthält einen 24-Bit-Offset, so dass im Bereich von ± 32 MB von der aktuellen Stelle im Programm aus gesprungen werden kann (wobei der Programmzähler der aktuellen Instruktion um 8 Byte vorauseilt). Zusätzlich kann optional der aktuelle Programmzähler ins Link-Register kopiert werden (falls L-Bit gesetzt), damit wird aus dem Sprung ein Unterprogrammaufruf (die aufgerufene Funktion kann den Programmzähler vom Link-Register einfach mit MOV PC,LR ins Programmzähler-Register zurückkopieren um wieder ins aufrufende Programm zurückzukehren).
- Bei den Load/Store-Befehlen kann ein 12-Bit-Offset auf eine Basisadresse addiert werden, welche aus einem Register gelesen wird. Wird der Programmzähler als Basisregister verwendet, kann so ein Wert innerhalb von 4 KByte ab der aktuellen Stelle des Programms geladen werden. Damit lässt sich z. B. ein Sprung an eine beliebige 32-Bit-Adresse umsetzen, indem die absolute Sprungadresse hinter dem Ladebefehl gespeichert wird und dann durch eine PC-relativen Ladebefehl mit Ziel Program-Counter (LDR PC,[PC,#-4]) angesprungen wird.
- Alle Speicherstellen, die außerhalb der 4 KB um die aktuelle Stelle im Programm liegen, können nur geladen werden, indem zuerst ihre Adresse in ein Register geladen wird und dieses in nachfolgenden Zugriffen als Basisregister verwendet wird.
Besonderheiten des Befehlssatzes
Der ARM-Befehlssatz verfügt über einige Besonderheiten, die zur Effizienz der Architektur beitragen:
- Sämtliche Befehle können bedingt ausgeführt werden. Damit entfällt die Notwendigkeit für Programmsprünge in vielen Standardsituationen, z. B. If-else-Abfragen (man vermeidet Programmsprünge, weil diese die Pipeline des Prozessors leeren, und dadurch Wartezyklen entstehen). Zum Kodieren der Bedingung werden die ersten 4 Bit eines jedes Befehles verwendet.
Beispiel:
CMP r0, r1 ; (setzt Bedingungsbits) ADDGE r2, r2, r3 ; if (r0 >= r1) then r2 := r2 + r3; ADDLT r2, r2, r4 ; else r2 := r2 + r4;
- Die ARM verfügt über einen Barrel-Shifter im B-Pfad der ALU, sämtliche Befehle, die mit dem zweiten Operanden arbeiten, erlauben also auch die Angabe eines 4-bit-weiten Shift- oder Roll-Faktors.
- Neuere ARM-CPUs kennen SIMD-Befehle.
Thumb-Befehlssatz
Um die Code-Dichte zu erhöhen, also den Speicherbedarf für eine bestimmte Funktion zu verringern, hat ARM Ltd. den Thumb-Befehlssatz entwickelt, der nur aus 16 Bit breiten Befehlen besteht und im wesentlichen zum normalen 32 Bit breiten ARM-Befehlssatz äquivalent ist. Obwohl man oft mehr Assembler-Befehle benötigt, um ein Programm zu schreiben, wird die Code-Größe in der Praxis um etwa 30–40 % reduziert. Als weiterer Vorteil können problemlos 16-Bit-Speicherbausteine an der ARM betrieben werden, ohne dass das Laden von Befehlen zwei Speicherzyklen in Anspruch nimmt. Aus 32-Bit-Speicherbausteinen wird die ARM stets zwei Thumb-Instruktionen auf einmal laden.
Die geringere Programmgröße wird allerdings oft durch eine geringere Ausführungsgeschwindigkeit erkauft. Zum einen sind viele Thumb-Befehle weniger leistungsfähig als die entsprechenden ARM-Befehle (und es werden mehr Thumb-Anweisungen benötigt), zum anderen gibt es in diesem 16Bit-Befehlssatz keine bedingte Befehlsausführung außer den bedingten Sprüngen. Durch die dadurch vermehrt auftretenden Programmsprünge kommt es häufiger zu einer Entleerung der Pipeline. Zumindest wenn der Speicher mit 32 Bit angesprochen wird, ist der 16-Bit-Befehlssatz schon deshalb oft langsamer als der ARM-Befehlssatz. Der Hersteller NXP gibt in den Datenblättern seiner LPC2000-Controller einen Geschwindigkeitsverlust von 30 % an.
Es besteht die Möglichkeit, ARM- und Thumbcode miteinander zu vermischen. Häufig ist in großen Teilen eines Programmes die Ausführungsgeschwindigeit sekundär. Hier bietet es sich an, diese Programmteile unter Verwendung der Thumb-Anweisungen zu schreiben, wogegen die kritischen Bereiche mit ARM-Anweisungen implementiert werden. Diese Technik nennt sich Thumb Interworking.
Coprozessor-Befehle
Die ARM ist als Mikroprozessor-Kern in Eingebetteten Systemen gedacht, in denen meist keine Gleitkomma-Arithmetik benötigt wird. Der ARM wurde jedoch speziell im Hinblick auf Erweiterbarkeit um Coprozessoren entwickelt und besitzt ein eigenes Coprozessor-Interface und Befehle für optionale Coprozessoren.
Modelle
- 1987: ARM2
- 1989: ARM3
- 1991: ARM6
- 1993: ARM7
- 1995: ARM8
- 1997: ARM9
- 1998: ARM10
- 2002: ARM11
- 2005: ARM Cortex
ARM2
Von dem englischen Unternehmen Acorn Computers Ltd. entwickelter 32-Bit RISC-Prozessor. Dieser wurde 1986 veröffentlicht und ab 1987 im Acorn Archimedes eingesetzt. Beim Standardtakt von 8 MHz wurden für damalige Verhältnisse unglaubliche 4 MIPS erreicht.
1991 erschien der ARM250, welcher ebenfalls auf dem ARM2 basierte, aber nun mit 12 MHz getaktet war und 7 MIPS erreichte. Außerdem wurden eine MMU-Einheit sowie ein Grafik- und IO-Prozessor integriert. Eingesetzt wurde diese CPU nur in den Archimedes-Modellen A3010, A3020 und A4000.
ARM3
Von dem englischen Unternehmen Acorn Computers Ltd. entwickelter 32-Bit RISC-Prozessor. Dieser wurde 1989 veröffentlicht und in den Archimedes-Modellen A540, A5000 und A4 eingesetzt.
Bei diesem Prozessor hat Acorn erstmals einen Cache mit 4 KByte integriert. Mit einer Taktfrequenz von 25 MHz erreicht der ARM3 12 MIPS.
ARM7TDMI (1993)
Die ARM7TDMI ist das momentane Low-End-Modell der ARM-Familie und wird vor allem als Komponente in SoCs für Mobiltelefone und andere portable Kommunikations- oder Multimediageräte verwendet. Anwendung findet er auch im Game Boy Advance und Nintendo DS (als Subprozessor). Die Kürzel im Modellnamen stehen für Thumb Instruction Set (Programmspeichersparender 16-Bit-Modus des 32-Bit-Kernes), Debug Port, 64-Bit-Result Multiplizierer und EmbeddedICE Modul.
Die ARM7TDMI besitzt eine dreistufige Pipeline und einen gemeinsamen Datenbus für Instruktionen und Daten.
ARM9TDMI (1997)
Die ARM9 ist eine Weiterentwicklung der StrongARM- und ARM8-Architektur. Der wesentliche Unterschied der ARM9 gegenüber der ARM7 ist ein getrennter Datenbus jeweils für Instruktionen und Daten (Harvard-Architektur). Meist werden diese an separate Caches für Daten und Instruktionen angeschlossen. Außerdem besitzt die ARM9 eine 5-stufige Pipeline und kann so höhere Taktraten erreichen und weist eine bessere CPI (Cycles per Instruction) auf. Wird die ARM9 ohne Caches an einem externen Speicher mit nur einem Datenbus betrieben, schrumpft der Geschwindigkeitsvorteil gegenüber der ARM7-Architektur aufgrund häufiger Pipeline-Stalls mit einer höheren Penalty durch die längere Pipeline. Ohne Cache kann in einem solchen ungünstigen Szenario ein ARM7 aufgrund seiner kürzeren Pipeline trotz eines deutlich niedrigeren Taktes schneller sein. Allerdings sollte dieser Fall in realen Systemen nicht auftreten, da ein ARM9 teurer ist und nur aufgrund seiner besseren Performance ausgewählt wird. Kommt es eher auf die Kosten an, so spart man sinnvollerweise nicht am Cache, sondern verwendet einen ARM7.
Zur Bedeutung des Kürzels "TDMI" siehe ARM7TDMI.
Erweiterungen für ARM-Kerne
ARM Ltd. verkauft neben den ARM-CPU-Kernen auch Erweiterungen als synthetisierbare Makrozellen für den SoC-Entwurf, unter anderem Memory Management Units, Floating-Point-Coprozessoren sowie Signalprozessor-Erweiterungen (Piccolo).
Lizenznehmer
- Analog Devices
- Apple
- Atmel
- Cirrus Logic
- Conexant
- Freescale (ehemals Motorola)
- HTC Corporation
- HP
- IBM
- Infineon
- Intel (XScale)
- Luminary Micro
- Marvell Technology Group
- Motorola
- NEC
- NetSilicon
- Nintendo
- NXP (ehemals Philips Semiconductors)
- Oki
- Palm
- Samsung
- Siemens
- Sony
- STMicroelectronics
- Texas Instruments
- Toshiba
- Zilog
Literatur
- Steve Furber: ARM System-on-Chip Architecture. Addison Wesley, New York 2000, ISBN 978-0201675191.
Weblinks
Wikimedia Foundation.