Risposte:
Le istruzioni THUMB non sono intrinsecamente più lente delle istruzioni ARM, ma piuttosto sono più limitate nelle capacità. Se il tuo codice necessita solo della funzionalità delle istruzioni THUMB, occuperà meno spazio di ARM, ma sarebbe lo stesso numero di istruzioni e, a parità di altre condizioni, funzionerebbe alla stessa velocità. Se il tuo codice richiede più funzionalità, di quanto richiederebbe più istruzioni THUMB rispetto alle istruzioni ARM per l'esecuzione e richiederebbe più tempo, sempre a parità di altre condizioni (vedi sotto)
THUMB è popolare nei microcontrollori a causa delle istruzioni di dimensioni inferiori per due motivi:
Per il secondo motivo, quando il codice non richiede funzionalità dal set di istruzioni ARM, il codice THUMB viene effettivamente eseguito più velocemente. Questo perché le tue istruzioni possono essere recuperate in un ciclo I / O dal flash anziché due. A seconda della velocità dell'interfaccia flash, la seconda lettura può comportare uno o più cicli di attesa per istruzione in cui la CPU è semplicemente bloccata e non può fare nulla.
Questo diventa meno un problema se riesci a copiare il tuo codice nella RAM prima di eseguirlo (che di solito ho visto a 32 bit per i recenti microcontrollori ARM), dove l'unica preoccupazione è la densità del codice. Per questo, molti strumenti proveranno a trovare quale rappresentazione è più efficiente per una determinata funzione. Se il compilatore può produrre il codice THUMB in meno istruzioni, lo farà, ma se ARM si traduce in un minor numero di istruzioni otterrai ARM. Questa è la modalità predefinita per Keil, se ricordo bene.
Per il tuo particolare chip (AT91SAM7S32) la documentazione menziona che il controller flash ha un buffer di prefetch che può prevedere gli accessi per rendere le cose più efficienti, il che potrebbe migliorare l'esecuzione dell'istruzione ARM. Tuttavia, afferma anche che il prefetch è un "doppio buffer a 32 bit" che "ottimizza gli accessi a 16 bit" che è più adatto per "l'esecuzione in modalità Thumb", il che sembra indicare che non è destinato ad accelerare Istruzioni ARM, ma per consentire al core di funzionare più velocemente in modalità THUMB.
Dagli schemi, sembra che il flash sul tuo chip abbia effettivamente un bus dati a 32 bit. Il prefetcher sembra funzionare leggendo un intero 32 bit, dando 16 alla CPU (in modalità THUMB) e memorizzando nella cache l'intero 32 bit. Durante il ciclo successivo, quando la CPU legge i secondi 16 bit, questa volta dalla cache, il controller flash legge i successivi 32 bit e lo memorizza nella cache. In questo modo il codice THUMB può essere eseguito senza più di un'attesa iniziale anche se la velocità del flash sarebbe un po 'più lenta della velocità del core della CPU. La sezione 19.2.2 "Operazioni di lettura" contiene ulteriori dettagli.
Poiché il tuo flash è un bus a 32 bit (il più vicino possibile), se i tuoi clock CPU e Flash sono uguali, THUMB ti darà solo densità di codice su ARM. Se vuoi che il tuo core della CPU funzioni più velocemente di Flash (e nota, non ho esaminato tutti i tempi di questo chip; suppongo che la CPU possa funzionare più velocemente perché ti permettono di impostare gli stati di attesa), che il prefetch dà una velocità vantaggio di THUMB grazie alla riduzione degli accessi flash effettivi. Tuttavia, tale vantaggio di velocità è un vantaggio per istruzione. Se il numero di istruzioni THUMB rispetto alle istruzioni ARM è abbastanza grande, supererà la velocità per istruzione risultante in ARM che avrà una velocità per routine più veloce.