Thumb-2
Thumb-2 — это расширение системы команд микропроцессоров архитектуры ARM, впервые представленное в 2003 году. Оно объединяет в себе преимущества 16-битного набора команд Thumb (высокая плотность кода) и 32-битного набора ARM (высокая производительность и широкий набор операций). Thumb-2 позволяет процессору выполнять инструкции как 16-битной, так и 32-битной длины, что обеспечивает гибкость при разработке встраиваемых систем и мобильных устройств.
История
Разработка Thumb-2 началась в начале 2000-х годов как ответ на потребность в более эффективном использовании памяти и повышении производительности в мобильных устройствах. Первый набор команд ARM (ARMv4 и ARMv5) использовал исключительно 32-битные инструкции, что обеспечивало высокую производительность, но требовало значительного объёма памяти для хранения кода. В 1995 году был представлен набор Thumb (ARMv4T), который использовал 16-битные инструкции, что позволяло сократить размер кода примерно на 30% по сравнению с 32-битным ARM, но за счёт снижения производительности и ограниченного набора операций.
Thumb-2 был впервые реализован в процессоре ARM1156T2-S, выпущенном в 2003 году. Это расширение стало обязательным для архитектуры ARMv7, начиная с ядер Cortex-A, Cortex-R и Cortex-M. В последующих версиях архитектуры, таких как ARMv8 и ARMv8.1-M, Thumb-2 остаётся основным набором инструкций для 32-битного режима, в то время как 64-битный режим (AArch64) использует собственный набор команд A64.
Архитектура и принцип работы
Thumb-2 является надстройкой над исходным набором Thumb, а не заменой. Процессор, поддерживающий Thumb-2, может выполнять как 16-битные, так и 32-битные инструкции, выбирая их на основе анализа первых битов команды. 32-битные инструкции в Thumb-2 кодируются с использованием специальных префиксов, которые не используются в 16-битном наборе.
Кодирование инструкций
- 16-битные инструкции: Сохраняют формат и семантику исходного Thumb. Они занимают 2 байта и обеспечивают выполнение наиболее распространённых операций, таких как арифметические действия с малым числом регистров, условные переходы и загрузка/сохранение данных.
- 32-битные инструкции: Занимают 4 байта и кодируются с помощью двух 16-битных половинок, первая из которых является префиксом, указывающим на 32-битный формат. Эти инструкции расширяют набор операций, включая умножение с накоплением, операции с плавающей запятой (при наличии соответствующего сопроцессора), работу с большим числом регистров и сложные адресные режимы.
Регистровый файл
Thumb-2 использует ту же регистровую модель, что и ARM: 16 регистров общего назначения (R0–R15), из которых R13 (SP) — указатель стека, R14 (LR) — регистр связи, R15 (PC) — счётчик команд. В отличие от исходного Thumb, который ограничивал доступ к некоторым регистрам, Thumb-2 позволяет 32-битным инструкциям обращаться ко всем 16 регистрам.
Преимущества
Плотность кода
Thumb-2 обеспечивает плотность кода, близкую к исходному Thumb (примерно на 26–30% меньше, чем 32-битный ARM), при этом сохраняя производительность, сравнимую с 32-битным режимом. Это достигается за счёт того, что наиболее часто используемые инструкции остаются 16-битными, а более сложные операции кодируются 32-битными командами.
Производительность
По сравнению с исходным Thumb, Thumb-2 значительно повышает производительность за счёт включения 32-битных инструкций, которые могут выполнять операции, недоступные в 16-битном наборе. Например, Thumb-2 поддерживает умножение с накоплением (MLA), условное выполнение (IT-блоки) и работу с 64-битными данными.
Упрощение разработки
Thumb-2 устраняет необходимость переключения между режимами Thumb и ARM, что было характерно для ранних процессоров ARM. Разработчики могут писать код полностью в Thumb-2, не беспокоясь о совместимости с 32-битными инструкциями. Это упрощает компиляцию и снижает вероятность ошибок.
Применение
Встраиваемые системы
Thumb-2 широко используется в микроконтроллерах на базе ядер Cortex-M (например, Cortex-M0, Cortex-M3, Cortex-M4). Эти процессоры ориентированы на встраиваемые системы с ограниченным объёмом памяти (Flash и RAM), где высокая плотность кода критична. Thumb-2 позволяет размещать больше функциональности в той же памяти, что снижает стоимость устройства.
Мобильные устройства
Процессоры Cortex-A (например, Cortex-A8, Cortex-A9, Cortex-A15) также поддерживают Thumb-2. В смартфонах и планшетах это расширение используется для оптимизации размера приложений, особенно в средах с ограниченным объёмом памяти, таких как Android и iOS.
Реальное время
Ядра Cortex-R, предназначенные для систем реального времени (например, в автомобильной электронике или промышленных контроллерах), также используют Thumb-2. Высокая производительность и детерминированное выполнение инструкций делают его подходящим для задач с жёсткими временными ограничениями.
Сравнение с другими наборами команд
ARM (32-битный)
- Размер кода: ARM — 4 байта на инструкцию, Thumb-2 — в среднем 2,5–3 байта.
- Производительность: ARM обычно быстрее на 10–20% за счёт более широких возможностей, но Thumb-2 приближается к нему благодаря 32-битным инструкциям.
- Сложность компиляции: Thumb-2 проще для компиляторов, так как не требует переключения режимов.
Thumb (16-битный)
- Размер кода: Thumb — 2 байта на инструкцию, Thumb-2 — немного больше, но значительно меньше ARM.
- Производительность: Thumb-2 значительно быстрее Thumb за счёт 32-битных инструкций.
- Набор операций: Thumb-2 поддерживает все операции ARM, кроме некоторых специфических (например, SWP — swap).
Критика
Несмотря на преимущества, Thumb-2 имеет некоторые недостатки. Во-первых, 32-битные инструкции в Thumb-2 занимают 4 байта, что может снижать плотность кода в некоторых случаях по сравнению с чистым Thumb. Во-вторых, декодирование смешанных 16- и 32-битных инструкций требует более сложного блока декодирования, что увеличивает площадь кристалла и энергопотребление. В-третьих, Thumb-2 не поддерживает некоторые расширенные возможности ARM, такие как условное выполнение всех инструкций (в ARM каждая инструкция может быть условной, в Thumb-2 условность ограничена IT-блоками).
Интересные факты
- Thumb-2 является обязательным для всех процессоров архитектуры ARMv7, включая Cortex-A, Cortex-R и Cortex-M.
- В архитектуре ARMv8-M (используется в Cortex-M23 и Cortex-M33) Thumb-2 дополнен расширением TrustZone для аппаратной изоляции задач.
- Компиляторы GCC и LLVM/Clang поддерживают Thumb-2 с версий 4.0 и 2.9 соответственно, автоматически выбирая оптимальный размер инструкций.
Источники
- ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition (ARM DDI 0406C)
- ARM Cortex-M3 Technical Reference Manual (ARM DDI 0337I)
- Joseph Yiu. "The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors", 3rd edition, Newnes, 2014.
- Steve Furber. "ARM System-on-Chip Architecture", 2nd edition, Addison-Wesley, 2000.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →