Відповіді:
На жаль, інструкції THUMB не є повільнішими, ніж інструкції ARM, а скоріше обмежені у можливостях. Якщо ваш код потребує лише функцій інструкцій THUMB, він займе менше місця, ніж ARM, але це буде однакова кількість інструкцій і, за інших рівних умов, працюватимуть з однаковою швидкістю. Якщо ваш код потребує більшої функціональності, то для його виконання знадобиться більше THUMB інструкцій, ніж інструкцій ARM, і це займе більше часу, знову ж таки, інші речі будуть рівними (див. Нижче)
THUMB популярний у мікроконтролерах через дві інструкції меншого розміру:
З другої причини, коли ваш код не вимагає функціональності з набору інструкцій ARM, код THUMB фактично працює швидше. Це тому, що ваша інструкція може бути отримана за один цикл вводу / виводу з спалаху замість двох. Залежно від швидкості вашого інтерфейсу флеш, це друге читання може спричинити один чи більше циклів очікування за інструкцію, коли ваш процесор просто зупинений і нічого не може зробити.
Це стає менш проблемою, якщо ви можете скопіювати свій код в оперативну пам'ять перед виконанням (що я зазвичай розглядаю як 32-розрядний для останніх мікроконтролерів ARM), де єдиною проблемою є щільність коду. Для цього багато інструментів спробують знайти, яке представлення є більш ефективним для даної функції. Якщо компілятор може створити THUMB-код з меншою кількістю інструкцій, він буде, але якщо ARM приведе до меншої кількості інструкцій, ви отримаєте ARM. Це режим за замовчуванням для Keil, якщо я пам'ятаю правильно.
Для вашого конкретного чіпа (AT91SAM7S32) в документації зазначається, що флеш-контролер має буфер попереднього вибору, який може передбачити доступ, щоб зробити ефективнішими ефективність, що може покращити виконання інструкцій ARM. Однак він також зазначає, що попередній вибір - це "подвійний 32-бітний" буфер, який "оптимізує 16-бітовий доступ", який найбільш підходить для "запуску в режимі великого пальця", що, схоже, вказує на те, що він не призначений для прискорення роботи Вказівки щодо ARM, але щоб ваше ядро працювало швидше в режимі великого пальця.
З діаграм виходить, що спалах на вашому чіпі насправді має 32-бітну шину даних. Як видається, префетер працює, читаючи цілі 32 біти, даючи 16 процесору (в режимі THUMB) і кешуючи цілі 32 біти. Під час наступного циклу, коли процесор читає другий 16 біт, цього разу з кеша, флеш-контролер зчитує наступні 32 біти і кешує його. Таким чином, THUMB-код може працювати без більше початкового очікування, навіть якщо швидкість спалаху буде трохи меншою, ніж основна швидкість процесора. У розділі 19.2.2 "Операції зчитування" є детальніше.
Оскільки ваш спалах є 32-бітовою шиною (наскільки я можу сказати), якщо годинник процесора та Flash однаковий, THUMB надасть вам щільність коду лише для ARM. Якщо ви хочете, щоб ваше ядро CPU працювало швидше, ніж Flash (і зауважте, я не переглядав усі терміни роботи цього чіпа; я припускаю, що процесор може працювати швидше, тому що вони дозволяють вам встановити стан очікування), ніж попередній вибір дає швидкість Перевага THUMB через зменшення фактичного доступу до спалаху. Однак ця швидкість є перевагою за інструкцію. Якщо кількість інструкцій THUMB порівняно з інструкціями ARM буде достатньо великою, воно буде переважувати швидкість на одну інструкцію, в результаті чого ARM матиме більш високу швидкість руху.