Автор: Пользователь скрыл имя, 27 Февраля 2013 в 23:59, реферат
Процессоры ARM поддерживаются многими программными продуктами как самой компании, так и других производителей. Эти продукты образовали солидную инфраструктуру ПО и средств разработки. Среди них - отладчики, компиляторы С++, внутрисхемные эмуляторы, таблицы разработки, операционные системы реального времени, драйверы низкого уровня, а также программные применения высокого уровня. Accelerated Technology, Enea OSE Systems, ISI, JavaSoft, JMI, Microtec, Microsoft, Perihelion, Psion, Wind River и другие компании обеспечивают совместимость своих ОС и средств разработки с процессорами ARM.
И ARM7 и ARM7T ядра в одном тактовом цикле, используют 3-уровневый конвейер с фазами выборки, декодирования и выполнения. Поток команд через каждый уровень конвейера управляется высокими и низкими фазами тактового сигнала. В ядре ARM7TDMI неиспользуемая фаза тактового сигнала используется для декомпрессирования команд Thumb в каскаде декодирования. Следовательно, в одном тактовом цикле производится и декодирование и выполнение команды, не требуется никаких дополнительных непроизводительных затрат синхронизации.
Команды ARM, поступающие из каскада выборки конвейера, проходят через декодер ARM и активируют сигналы управления старшими и младшими битами операционного кода. Старшие биты опкода описывают тип выполняемой команды, тогда как младшие биты определяют детали команды типа определения регистров или операнда.
В Thumb состоянии мультиплексоры направляют Thumb команды через логику декомпрессии Thumb, разворачивающую команду Thumb в ее эквивалент ARM команды . Затем команда ARM выполняется в нормальном режиме. Это легко понять на примере:
Как видно из рисунка, старший опкод команды Thumb помещается в команду ARM, а младший транслируется через справочную таблицу.
В команде ARM всегда присутствует код условия, определяемый из старшим операционным кодом.
Старший опкод определяет маршрут
операнда от операционного кода Thumb
до операционного кода ARM. Определители
регистров расширяются
Это изящное решение применимо на любом ядре ARM и будет использоваться в перспективных ARM архитектурах.
Система команд Thumb содержит 16-разрядные эквиваленты 36 команд, находящихся в стандартной 32-разрядной системе команд ARM. Для системы команд Thumb выбраны те команды ARM, которые, в среднем, не обеспечивают преимуществ полноформатных стандартных 32-разрядных операционных кодов ARM, или те, в отношении которых опыт показал, что они используются наиболее часто и, следовательно, являются наиболее важными, или те которые необходимы компилятору, для того чтобы обеспечить наилучшую возможную плотность кода.
Процесс формирования команд Thumb заключался в сокращении полей всех наиболее часто используемых команд ARM до тех пор, пока они не стали 16-разрядными. Полученная в результате система команд затем обрабатывалась последовательностью итераций, обеспечивавшей наибольшее количество битов опкодам наиболее употребительных команд (например, вызовам подпрограмм, которые составляют 1/16 системы команд) и удаление битов из менее критических команд до тех пор, пока не было получено наилучшее соотношение производительность/плотность кода. Система команд была ориентирована и на перспективу, в операционных кодах оставлено пространство для новых команд, которые будут вводиться разработчиками программного обеспечения и которые должны будут поддерживаться новыми версиями компилятора.
При создании 16-разрядных операционных кодов, в систему команд Thumb были введены некоторые ограничения . Наиболее очевидные: уменьшенное число регистров, доступных при выполнении кода Thumb. Вместо пятнадцати 32-разрядных регистров общего назначения (GPR) плюс PC процессора ARM, программист имеет доступ к восьми GPR регистрам, указателю стека, регистру связей (Link Register) и PC. В системе команд Thumb, восемь GPR регистров (R0-R7) называются Lo набором регистров. Другие регистры ARM (R8-R15) обозначаются как Hi регистры. Программист в Thumb режиме ограничен доступом к Hi регистрам через команды перемещения, сравнения и команду ADD , предоставляющие ему некоторую локальную быструю временную среду хранения. Переключения между ARM и Thumb кодами не влияют на содержимое GPR регистров.
Переключения между системами команд выполняются командой BX, которая изменяет логическое состояние бита Thumb/ARM в регистре состояния программы (PSR) Thumb-ориентированного ядра. Этот бит и команда и обеспечивают то, что подпрограммы в Thumb и ARM кодах могут находиться вместе в одном и том же пространстве памяти:
Новая мнемоника включает команды ASR, LSL, LSR, ROR, LDRH, LDSB, LDSH, PUSH, POP и STRH. Это не новые команды, но они действительно соответствуют полным 32-разрядным командам ARM, поскольку виртуально каждой команде Thumb соответствует эквивалентная команда ARM.
Потребность встраиваемых
применений в памяти большой емкости
продолжает расти. Следовательно, для
обеспечения длительного
Ниже приводится простая подпрограмма на языке C, показывающая различия между кодами ARM и Thumb. Эта подпрограмма возвращает абсолютную величину целого числа C, переданного ему как параметр.
Код на языке C:
if (x>=0) |
|
return x; | |
else |
|
return -x; |
Iabs CMP r0, #0 ; Сравнить r0 с нулем RSBLT r0, r0, #0 ; Если r0 < 0 (меньше чем = LT), то выполнить ; r0 = 0-r0 MOV pc, lr ; Переместить Linc Register в PC (Возврат) |
CODE16 ; Директива, определяющая 16-разрядную (Thumb) команду Iabs CMP r0, #0 ; Сравнить r0 с нулем BGE return ; Перейти к Return если больше или равно нулю NEG r0, r0 ; Если нет, инвертировать r0 return MOV pc, lr ; Переместить Link регистр в PC (Возврат)
|
Размеры кода для обоих версий показываются в таблице.
Код |
Количество команд |
Размер (байты) |
Соотношение |
ARM |
3 |
12 |
1,0 |
Thumb |
4 |
8 |
0,67 |
Сравнение, приведенное в таблице 1 показывает, что код Thumb - на 33 % плотнее кода ARM, реализующего точно такую же функцию. Обратите внимание на то, что для выполнения задачи в коде Thumb необходимо большее количество команд чем в эквиваленте ARM. Однако, поскольку формат команды Thumb - только половина длины команд ARM, то общий размер подпрограммы в коде Thumb все же меньше.
Как пример кодирования вручную, рассмотрим пример преобразования двоичного значения в шестнадцатиричное :
Код ARM:
MOV r1, r0 ; r0 хранит значение для преобразования ; загрузить r1 хранимым значением MOV r2, #8 ; Загрузить в r2 десятичное число 8 Loop: MOV r1, r1, ROR #28 ; Вращать r1 вправо на 28 и результат сохранить в r1 AND r0, r1, #15 ; Выполнить AND содержимого r1 с десятичным числом 15 CMP r0, #10 ; Сравнить r0 с десятичным числом 10 и ADDLT r0, r0, #0 ; если оно меньше чем 10, то ; ADD ASCII значение 0 к r0 ADDGE r0, r0, #A ; в ином случае (больше или равно) ; ADD ASCII значение A к r0 SWI 0 ; подпрограмма вывода char на экран SUBS r2, r2, #1 ; Вычесть 1 из r2 BGT Loop ; и вернуться обратно к 1, если r2 все еще больше чем нуль MOV pc, lr ; Загрузить PC содержимым Link регистра (Возврат) |
Код Thumb:
Код ARM:
MOV r1, r0 ; Преобразуемое значение, хранящееся в r0 загрузить в r1 MOV r2, #8 ; Поместить 8 в r2 Loop1 LSR r0, r1, #28 ; Выполнить логический сдвиг r1 вправо ; на 28 мест и поместить в r0 LSL r1, r1, #4 ; Выполнить логический сдвиг r1 влево на 4 места CMP r0, #10 ; Сравнить r0 с 10 и BLT Loop2 ; если меньше чем 10, выполнить переход к Loop2 ADD r0, #A-0-10 ; Выполнить ADD ASCII значений A-0-10 (7) к r0 Loop2 ADD r0, #0 ; Выполнить ADD ASCII значения 0 (48) к r0 SWI 0 ; Подпрограмма записи char на экран SUB r2, #1 ; Вычесть 1 из r2 и, BNE Loop1 ; если незакончено loop1, MOV pc, lr ; загрузить PC содержимым Link регистра ; (Возврат) |
Cоответствующие размеры ARM и Thumb кодов показаны ниже.
Код |
Количество команд |
Размер (Байты) |
Соотношение |
ARM |
11 |
44 |
1,0 |
Thumb |
12 |
24 |
0,55 |
В данном случае код Thumb оказывается на 45% более плотным чем эквивалентный код ARM, в точно таком же алгоритме.
Мнемоника |
Команда |
Пример |
Эквивалент кода ARM |
ADC |
Сложить с переносом |
ADC Rd, Rs |
ADCS Rd, Rd, Rs |
ADD |
Сложить |
ADD Rd, Rs, Rn |
ADD Rd, Rs, Rn |
AND |
Выполнить AND |
AND Rd, Rs |
ANDS Rd, Rd, Rs |
ASR |
Арифметически сдвинуть вправо |
ASR Rd, Rs |
MOVS Rd, Rd, ASR Rs |
B |
Перейти безусловно |
B label |
B label |
BCC |
BCC label |
BCC label |
|
BIC |
Очистить бит |
BIC Rd, Rs |
BICS Rd, Rd, Rs |
BL |
Перейти и связать |
BL label |
BL label |
BX |
Перейти и обменять |
BX Hs |
BX Hs |
CMN |
Отрицательно сравнить |
CMN Rd, Rs |
CMN Rd, Rs |
CMP |
Сравнить |
CMP Rd, #Offset8 |
CMP Rd, #Offset8 |
EOR |
EOR |
EOR Rd, Rs |
EORS Rd, Rd, Rs |
LDMIA |
Загрузить множество |
LDMIA Rb!, {Rlist} |
LDMIA Rb!, {Rlist} |
LDR |
Загрузить слово |
LDR Rd, [PC, #lmm] |
LDR Rd, [PC, #lmm] |
LDRB |
Загрузить байт |
LDRB Rd, [Rb, Ro] |
LDRB Rd, [Rb, Ro] |
LDRH |
Загрузить полуслово |
LDRH Rd, [Rb, #lmm] |
LDRH Rd, [Rb, #lmm] |
LSL |
Логически сдвинуть влево |
LSL Rd, Rs, #Offset5 |
MOVS Rd, Rs, LSL #Offset5 |
LDRSB |
Загрузить байт со знаком |
LDRSB Rd, [Rb, Ro] |
LDRSB Rd, [Rb, Ro] |
LDRSH |
Загрузить полуслово со знаком |
LDRSH Rd, [Rb, Ro] |
LDRSH Rd, [Rb, Ro] |
LSR |
Логически сдвинуть вправо |
LSR Rd, Rs |
MOVS Rd, Rd, LSR Rs |
MOV |
Переместить содержимое регистра |
MOV Rd, #Offset8 |
MOVS Rd, #Offset8 |
MUL |
Перемножить |
MUL Rd, Rs |
MULS Rd, Rs, Rd |
MVN |
Переместить NOT регистр |
MVN Rd, Rs |
MVNS Rd, Rs |
NEG |
Отрицать |
NEG Rd, Rs |
RSBS Rd, Rs, #0 |
ORR |
Выполнить OR |
ORR Rd, Rs |
ORRS Rd, Rd, Rs |
POP |
Поднять регистр |
POP {Rlist} |
LDMIA R13!, {Rlist} |
PUSH |
Опустить регистр |
PUSH {Rlist} |
STMDB R13!, {Rlist} |
ROR |
Вращать вправо |
ROR Rd, Rs |
MOVS Rd, Rd, ROR Rs |
SBC |
Вычесть с переносом |
SBC Rd, Rs |
SBCS Rd, Rd, Rs |
STMIA |
Сохранить множество |
STMIA Rb!, {Rlist} |
STMIA Rb!, {Rlist} |
STR |
Сохранить слово |
STR Rd, [Rb, Ro] |
STR Rd, [Rb, Ro] |
STRB |
Сохранить байт |
STRB Rd, [Rb, Ro] |
STRB Rd, [Rb, Ro] |
STRH |
Сохранить полуслово |
STRH Rd, [Rb, Ro] |
STRH Rd, [Rb, Ro] |
SWI |
Программное прерывание |
SWI Value8 |
SWI Value8 |
SUB |
Вычесть |
SUB Rd, Rs, Rn |
SUBS Rd, Rs, Rn |
TST |
Тестировать биты |
TST Rd, Rs |
TST Rd, Rs |
Мы рекомендуем использовать комплекта инструментальных средств разработки программного обеспечения фирмы ARM (ARM Software Development Toolkit).
Чтобы получить
полное представление о
Патентованными
методами сжатия кода, концепция Thumb привносит
32-разрядную
Принимаемый подход был использован Micrologic Solutions для получения результатов для Espresso, Xlisp и Eqntott. Эти подпрограммы были взяты из SPECint набора программ эталонного тестирования. Значения для четырех популярных конкурирующих процессоров были получены с от третьих поставщиков. Данные для ARM7TDMI Thumb-ориентированного ядра были сгенерированы с использованием C компилятора ARM Thumb, описанного в Software Development Route.
Процессор |
Eqntott |
Xlisp |
Espresso |
ARM7TDMI |
10608 |
26388 |
72596 |
ARM7 ядро |
16768 |
40768 |
109932 |
Intel 386 |
17640 |
28097 |
125686 |
Intel 8088 |
19106 |
29401 |
137194 |
Moto 68020 |
20542 |
46746 |
131854 |
Sparc 2 |
22256 |
44648 |
142752 |
Для обеспечения честного сравнения фирма ARM использовала также значения размеров кодов, публично доступные для конкурирующих решений и добавляла данные по ARM7TDMI Thumb-ориентированному ядру. Указанные в байтах размеры кода, являются данными в Dhrystone 1.1, поскольку эти данные свободно доступны.
Процессор |
Размер кода (Байты) |
Соотношение |
ARM7TDMI |
1032 |
1,00 |
H8/500 |
1097 |
1,06 |
CPU32 |
1254 |
1,22 |
68000 |
1268 |
1,23 |
I386 |
1280 |
1,24 |
I960 |
1280 |
1,24 |
SH7032 |
1384 |
1,34 |
H8/300H |
1530 |
1,48 |
MC68HC11 |
1558 |
1,51 |
29000 |
2296 |
2,22 |
Z80 |
3201 |
3,10 |