Antworten:
THUMB-Anweisungen sind meines Wissens nicht wesentlich langsamer als ARM-Anweisungen, sondern sind in ihren Fähigkeiten eingeschränkter. Wenn Ihr Code nur die Funktionalität von THUMB-Anweisungen benötigt, nimmt er weniger Platz ein als ARM, entspricht jedoch der gleichen Anzahl von Anweisungen und wird bei sonst gleichen Bedingungen mit derselben Geschwindigkeit ausgeführt. Wenn Ihr Code mehr Funktionen benötigt, würde die Ausführung mehr THUMB-Anweisungen als ARM-Anweisungen erfordern und länger dauern, auch wenn andere Dinge gleich sind (siehe unten).
THUMB ist in Mikrocontrollern aufgrund der kleineren Anweisungen aus zwei Gründen beliebt:
Aus dem zweiten Grund wird THUMB-Code tatsächlich schneller ausgeführt, wenn für Ihren Code keine Funktionalität aus dem ARM-Befehlssatz erforderlich ist. Dies liegt daran, dass Ihre Anweisung in einem E / A-Zyklus anstelle von zwei aus dem Flash abgerufen werden kann. Abhängig von der Geschwindigkeit Ihrer Flash-Schnittstelle kann dieser zweite Lesevorgang einen oder mehrere Wartezyklen pro Befehl verursachen, bei denen Ihre CPU einfach blockiert ist und nichts tun kann.
Dies ist weniger problematisch, wenn Sie Ihren Code vor der Ausführung in den Arbeitsspeicher kopieren können (was ich bei neueren ARM-Mikrocontrollern normalerweise als 32-Bit angesehen habe), wobei das einzige Problem die Codedichte ist. Zu diesem Zweck werden viele Tools versuchen herauszufinden, welche Darstellung für eine bestimmte Funktion effizienter ist. Wenn der Compiler THUMB-Code in weniger Anweisungen erzeugen kann, wird dies der Fall sein. Wenn ARM jedoch zu weniger Anweisungen führt, erhalten Sie ARM. Dies ist der Standardmodus für Keil, wenn ich mich richtig erinnere.
Für Ihren speziellen Chip (AT91SAM7S32) wird in der Dokumentation erwähnt, dass der Flash-Controller über einen Prefetch-Puffer verfügt, der Zugriffe vorhersagen kann, um die Effizienz zu steigern und die Ausführung von ARM-Befehlen zu verbessern. Es heißt jedoch auch, dass der Prefetch ein "dualer 32-Bit" -Puffer ist, der "16-Bit-Zugriffe optimiert", der am besten für "Ausführen im Thumb-Modus" geeignet ist, was darauf hindeutet, dass er nicht zur Beschleunigung gedacht ist ARM-Anweisungen, damit Ihr Core im THUMB-Modus schneller ausgeführt werden kann.
Aus den Diagrammen geht hervor, dass der Blitz auf Ihrem Chip tatsächlich einen 32-Bit-Datenbus hat. Der Prefetcher scheint zu funktionieren, indem er ganze 32 Bit liest, der CPU 16 gibt (im THUMB-Modus) und die gesamten 32 Bit zwischenspeichert. Während des nächsten Zyklus, wenn die CPU die zweiten 16 Bits liest, diesmal aus dem Cache, liest der Flash-Controller die nächsten 32 Bits und speichert sie zwischen. Auf diese Weise kann THUMB-Code ohne mehr als eine anfängliche Wartezeit ausgeführt werden, selbst wenn die Flash-Geschwindigkeit etwas langsamer als die CPU-Kerngeschwindigkeit wäre. Abschnitt 19.2.2 "Lesevorgänge" enthält weitere Details.
Da es sich bei Ihrem Flash um einen 32-Bit-Bus handelt (soweit ich das beurteilen kann), gibt THUMB bei gleicher CPU- und Flash-Taktrate nur Codedichte über ARM an. Wenn Sie möchten, dass Ihr CPU-Kern schneller als Flash ausgeführt wird (und beachten Sie, dass ich nicht das gesamte Timing dieses Chips überprüft habe; ich gehe davon aus, dass die CPU schneller ausgeführt werden kann, da Sie Wartezustände festlegen können), gibt der Prefetch eine Geschwindigkeit an Vorteil für THUMB aufgrund der Reduzierung der tatsächlichen Flash-Zugriffe. Dieser Geschwindigkeitsvorteil ist jedoch ein Vorteil pro Befehl. Wenn die Anzahl der THUMB-Befehle gegenüber den ARM-Befehlen groß genug ist, überwiegt die Geschwindigkeit pro Befehl, was dazu führt, dass ARM eine schnellere Geschwindigkeit pro Routine aufweist.