Перейти к содержимому

Arm thumb что это

  • автор:

Thumb

Thumb — режим процессоров ARM, в котором используется сокращенная система команд. Она состоит из 36 команд, взятых из стандартного набора 32-разрядных команд архитектуры ARM и преобразованных до 16-разрядных кодов.

Длина команд Thumb составляет половину длины стандартных 32-разрядных команд, что позволяет существенно сократить необходимые объёмы памяти программ (порядка 30 %) и, кроме того, позволяет использовать более дешёвую 16-разрядную память.

При выполнении эти команды дешифруются процессором в эквивалентные операции ARM, выполняемые за то же количество тактов. Переключение ARM THUMB возможно командой BX либо переключением режима работы по прерыванию/исключению.

Набор команд THUMB неортогонален и малоэлегантен. Команды позволяют работать напрямую лишь с 8-ю младшими РОН; к 8-и старшим РОН (включая SP, LR, PC) применимы лишь несколько операций. В наборе недоступны следующие возможности ARM: умножение с накоплением/расширением, сопроцессорные операции, доступ к PSR и регистрам других контекстов, атомарный обмен SWAP. Недоступны условное исполнение, сдвиг 2-го операнда в командах общего назначения, трехадресные операции (кроме ADD и SUB), автоинкрементный и автодекрементный режимы адресации. Все команды обработки данных устанавливают коды условий. Команда BL вынужденно кодируется в два слова, причем смещение ограничено 23 битами. Доступ к стеку (мультирегистровые команды PUSH и POP) организован принудительно по 13-у регистру, стек растет вниз.

Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её.
Это примечание по возможности следует заменить более точным.

См. также

  • Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.

Аппаратные аспекты

И ARM7 и ARM7T ядра в одном тактовом цикле, используют 3-уровневый конвейер с фазами выборки, декодирования и выполнения. Поток команд через каждый уровень конвейера управляется высокими и низкими фазами тактового сигнала. В ядре ARM7TDMI неиспользуемая фаза тактового сигнала используется для декомпрессирования команд Thumb в каскаде декодирования. Следовательно, в одном тактовом цикле производится и декодирование и выполнение команды, не требуется никаких дополнительных непроизводительных затрат синхронизации.

Рисунок 11: Thumb декодирование и декомпрессия

Команды ARM, поступающие из каскада выборки конвейера, проходят через декодер ARM и активируют сигналы управления старшими и младшими битами операционного кода. Старшие биты опкода описывают тип выполняемой команды, тогда как младшие биты определяют детали команды типа определения регистров или операнда.

В Thumb состоянии мультиплексоры направляют Thumb команды через логику декомпрессии Thumb, разворачивающую команду Thumb в ее эквивалент ARM команды . Затем команда ARM выполняется в нормальном режиме. Это легко понять на примере:

Рисунок 12: Трансляция команды ADD Thumb в команду ADD ARM

Изящное решение

Как видно из рисунка, старший опкод команды Thumb помещается в команду ARM, а младший транслируется через справочную таблицу.

В команде ARM всегда присутствует код условия, определяемый из старшим операционным кодом.

Старший опкод определяет маршрут операнда от операционного кода Thumb до операционного кода ARM. Определители регистров расширяются дополнительным нулем от опкода Thumb (3 бита) до 4 битов, поскольку эта команда Thumb обращается только к регистрам ARM R0-R7. Значение константы также расширяется нулями, определяя 8-разрядную константу в опкоде ARM.

Это изящное решение применимо на любом ядре ARM и будет использоваться в перспективных ARM архитектурах.

Концепция Thumb

Технология Thumb — дополнительное расширение к архитектуре ARM. Система команд Thumb содержит 36 команд, производных от стандартной 32-разрядной системы команд ARM, перекодированных в 16-разрядные коды. Такой подход обеспечил очень высокую плотность кода, поскольку команды Thumb составляют половину ширины формата команд ARM. В процессе выполнения эти новые 16-разрядные Thumb коды декомпрессируются процессором в соответствующие эквивалентные команды ARM, которые затем и выполняются ядром ARM обычным способом.

Рисунок 1: Команды Thumb как кодированное подмножество системы команд ARM

Уникальное преимущество

Технология Thumb — это не только смешанная система команд. Thumb-ориентированные ядра имеют две отдельных системы команд — уникальное достоинство, позволяющее разработчику использовать всю мощность 32-разрядной системы команд ARM при использовании преимуществ малого размера кода системы команд Thumb. Тот факт, что две системы команд являются совершенно отдельными, говорит о том, что средства декодирующей логики также чрезвычайно просты, что в свою очередь, сохраняет малым размер кристалла и сохраняет лучшее в отрасли соотношение производительность/потребление.

Размер и критичные к производительности подпрограммы

Так как Thumb -ориентированные ядра способны выполнять и стандартную ARM систему команд и новые команды Thumb, разработчик, при переходе от подпрограммы к подпрограмме, может находить компромисс между размером кода и производительностью, подготавливая критичные к размеру подпрограммы в коде Thumb и критичные к производительности подпрограммы в кодах ARM.

32-разрядная RISC производительность

Thumb -ориентированные ядра типа ARM7TDMI имеют полную 32-разрядную архитектуру ARM, так что разработчик сохраняет 32-разрядную производительность RISC архитектуры. Комбинация двух систем команд, выполняющихся на 32-разрядном Thumb -ориентированном ядре, обеспечивает эффективное решение проблемы больших размеров кода и проблемы невысокой производительности 16-разрядных систем.

Улучшение плотности кода на 30 %

Полученные к настоящему времени результаты показали улучшение плотности кода на 30%, по сравнению с кодом ARM, что позволяет считать Thumb -ориентированные процессоры лучшими по плотности кода в сравнении и с традиционными CISC процессорами.

Рисунок 2: Ядро ARM7TDMI и расположение декомпрессора команд Thumb

Поддержка полуслов

Кроме введения новых Thumb команд, фирма ARM добавила к системам команд и ARM и Thumb поддержку формата полуслов (16-разрядных данных). Следовательно архитектура ARM теперь полностью поддерживает 8, 16 и 32-разрядные данные. Были добавлены и для Thumb и ARM ядер операции со знаками для поддержки ими 8 и 16-разрядных операций с данными со знаками.

Расширение возможностей комплекта средств разработки программного обеспечения ARM

омплект средств разработки программного обеспечения ARM также был расширен, чтобы обеспечить поддержку разработки кодов Thumb. Комплект позволяет программисту писать и размещать в памяти системы коды ARM, коды Thumb или оба вместе.

Рисунок 3: Последовательность этапов проектирования программного обеспечения для Thumb -ориентированного ядра

Arm thumb что это

Ниже представлены 10 особенностей ARM-архитектуры, которые, по-моему мнению, являются интересными и заслуживающими внимания. Люди, занимающиеся программированием под ARM (в особенности с использованием ассемблера) врядли найдут здесь что-то новое, однако новички и люди, знакомые с прочими архитектурами (AVR, MIPS, x86 и прочими) могут найти интересные вещи.

Все написанное применимо для ARMv4T (ARM7TDMI-S), однако, некоторые особенности встречаются и в ARMv7 (Cortex-Mx).

    Любая инструкция допускает условное выполнение. Специально для этого 4 бита отведены под флаги условного выполнения. Это хорошо видно в таблице, представленной в официальной документации: Это позволяет сооружать такие хитрые конструкции:

; if (r0 == 0) ; r0 = 2; ; else ; r0 = 1; cmp r0, #0 moveq r0, #2 movne r0, #1
------------------------------------------------------ ; Данная конструкция замечена за GCC: mov r0, #0x12, lsl #24 or r0, r0, #0x34, lsl #16 or r0, r0, #0x56, lsl #8 or r0, r0, #0x78 ------------------------------------------------------ ; Но более распространен вариант: . ldr r0, [pc+#const1_offset] . const1: DD 0x12345678 ------------------------------------------------------
------------------------------------------------------ ; Сохраняем регистры, требуемые в функции. Так же сохраняем адрес ; возврата из функции, это позволяет осуществлять вложенные вызовы. stm sp, ; Восстановить используемые регистры при выходе из функции, ; при этом LR восстанавливается в PC, порождая тем самым ; возврат из функции. ldm sp, ------------------------------------------------------
------------------------------------------------------ unsigned char data[5] = < 0x11, 0x22, 0x33, 0x44, 0x55 >; unsigned long tmp = *(unsigned long*)&data[1]; printf("tmp = 0x%08x;rn", tmp); ------------------------------------------------------ tmp = 0x11443322; /* Вместо ожидаемого 0x55443322 */ ------------------------------------------------------

Для получения корректного результата в Keil Realview MDK достаточно добавить макрос __packed:

------------------------------------------------------ unsigned char data[5] = < 0x11, 0x22, 0x33, 0x44, 0x55 >; unsigned long tmp = *(__packed unsigned long*)&data[1]; printf("tmp = 0x%08x;rn", tmp); ------------------------------------------------------ tmp = 0x55443322; ------------------------------------------------------

  • Для каждого режима работы процессора выделен свой стек. Мало того, во всех режимах банк регистров частично заменяется (а в режиме FIQ и вовсе заменяется половина всех регистров). В таблице ниже представлены регистры для каждого режима и помечены заменяемые регистры. Сделано это для ускорения входа-выхода из прерываний, благодаря этому требуется сохраненять и восстанавливать меньше данных.
  • Для вызова функций, возврата из функций и осуществления прыжков используется один и тот же класс инструкций.

    ------------------------------------------------------ . ; Вызов 1 bl func1 ; Вызов 2 ; Обычно используется по вызову функции по указателю или ; просто очень дальнему вызову, когда BL "не дотягивается". ldr r0, =func1 mov lr, pc bx r0 ; Вызов 3 (возможен на ARM9): ldr r0, =func1 blx r0 . func1: ; Тело функции bx lr ------------------------------------------------------
    ------------------------------------------------------ func(0x01, 0x02); ------------------------------------------------------ mov r0, #0x01 mov r1, #0x02 bl func ------------------------------------------------------

    О сайте

    Подборка статей и отчетов о различных математических и электронных экспериментах.

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *