Advanced RISC Machines

Автор: Пользователь скрыл имя, 27 Февраля 2013 в 23:59, реферат

Описание работы

Процессоры ARM поддерживаются многими программными продуктами как самой компании, так и других производителей. Эти продукты образовали солидную инфраструктуру ПО и средств разработки. Среди них - отладчики, компиляторы С++, внутрисхемные эмуляторы, таблицы разработки, операционные системы реального времени, драйверы низкого уровня, а также программные применения высокого уровня. Accelerated Technology, Enea OSE Systems, ISI, JavaSoft, JMI, Microtec, Microsoft, Perihelion, Psion, Wind River и другие компании обеспечивают совместимость своих ОС и средств разработки с процессорами ARM.

Работа содержит 1 файл

Advanced RISC Machines.doc

— 565.00 Кб (Скачать)

Рисунок 10: Конвейерная выборка, декодирование  и выполнение

Декодирование и выполнение в едином цикле 

 

    И 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 архитектурах.

Аспекты программного обеспечения

36 команд

 

    Система команд 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 регистров.

Рисунок 13: Отображение Thumb регистров  состояния на регистры состояния ARM

Бит состояния Thumb/ARM

 

    Переключения между системами команд выполняются командой BX, которая изменяет логическое состояние бита Thumb/ARM в регистре состояния программы (PSR) Thumb-ориентированного ядра. Этот бит и команда и обеспечивают то, что подпрограммы в Thumb и ARM кодах могут находиться вместе в одном и том же пространстве памяти:    

Новая мнемоника включает команды ASR, LSL, LSR, ROR, LDRH, LDSB, LDSH, PUSH, POP и STRH. Это  не новые команды, но они действительно  соответствуют полным 32-разрядным  командам ARM, поскольку виртуально каждой команде Thumb соответствует эквивалентная команда ARM.

Возможность работы с памятью большой  емкости

 

    Потребность встраиваемых применений в памяти большой емкости  продолжает расти. Следовательно, для  обеспечения длительного использования  приборов они должны быть способны обрабатывать память большой емкости. В ARM состоянии с его 4 Гбайтами адресного пространства это - не проблема. Нет проблем и в режиме Thumb, так как Thumb-ориентированные ядра - такие же полные 32-разрядные процессоры с 32-разрядным адресным пространством. В принципе, 16-разрядные коды операций ограничивают максимальное адресуемое пространство 64 Кбайтами, но система команд Thumb обеспечивает выполнение и длинной команды перехода в адресном пространстве до 4 Мбайтов и полные переходы в пределах 4 Гбайтового пространства посредством двух команд.

Thumb код в действии

Простая подпрограмма на языке C

 

    Ниже приводится простая подпрограмма на языке C, показывающая различия между кодами ARM и Thumb. Эта  подпрограмма возвращает абсолютную величину целого числа C, переданного ему как параметр.    

Код на языке C:

if (x>=0)

 
 

return x;

else

 
 

return -x;


 

Эквивалент ARM ассемблерной версии - (исключая преамбулу):

Iabs     CMP     r0, #0     ; Сравнить r0 с нулем   

RSBLT     r0, r0, #0     ; Если r0 < 0 (меньше чем = LT), то выполнить   

             ; r0 = 0-r0   

MOV     pc, lr     ; Переместить Linc Register в PC (Возврат)  


 

Версия Thumb ассемблирования:

CODE16             ; Директива, определяющая 16-разрядную (Thumb) команду

Iabs     CMP     r0, #0     ; Сравнить r0 с нулем   

BGE     return     ; Перейти к Return если больше или равно нулю   

NEG     r0, r0     ; Если нет, инвертировать r0

return     MOV     pc, lr     ; Переместить Link регистр в PC (Возврат) 

 

   

 


 

    Размеры кода для обоих версий показываются в таблице.

Таблица 1: Размер кода для подпрограммы абсолютной величины

Код

Количество команд

Размер (байты)

Соотношение

ARM

3

12

1,0

Thumb

4

8

0,67


 

Меньший размер ассемблированного  кода Thumb

 

    Сравнение, приведенное в таблице 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 кодов показаны  ниже.

Таблица 2: Размеры кодов подпрограмм  преобразования двоичной величины в  шестнадцатиричную 

Код

Количество команд

Размер (Байты)

Соотношение

ARM

11

44

1,0

Thumb

12

24

0,55


 

    В данном случае код Thumb оказывается на 45% более плотным  чем эквивалентный код ARM, в точно таком же алгоритме.

Таблица 3: Система команд Thumb

Мнемоника

Команда

Пример

Эквивалент кода 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


 

Mаршрут разработки программного обеспечения

 

    Мы рекомендуем  использовать комплекта инструментальных средств разработки программного обеспечения  фирмы ARM (ARM Software Development Toolkit).

Тестирование Thumb

 

    Чтобы получить полное представление о производительности ARM7TDMI Thumb-ориентированного ядра относительно альтернативных решений, фирма ARM сформировала комплект эталонных тестов, которые проверяют два критических аспекта концепции Thumb:

  1. Тестирование размера кода
  2. Тестирование производительности

Тестирование размера кода

 

    Патентованными  методами сжатия кода, концепция Thumb привносит 32-разрядную производительность в 16-разрядные  системы при обеспечении 16-разрядной  стоимости систем. Эталонное тестирование размера кода, отслеживает эффективность  этого решения в обеспечении разработчиков минимальным, возможным в 8/16-разрядных системах, размером кода.     

Принимаемый подход был использован Micrologic Solutions для получения результатов  для Espresso, Xlisp и Eqntott. Эти подпрограммы были взяты из SPECint набора программ эталонного тестирования. Значения для четырех популярных конкурирующих процессоров были получены с от третьих поставщиков. Данные для ARM7TDMI Thumb-ориентированного ядра были сгенерированы с использованием C компилятора ARM Thumb, описанного в Software Development Route.

Таблица 4: Размер кода пользователя в  байтах для трех эталонных тестов 
Источник: Micrologic Solutions

Процессор

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, поскольку эти данные свободно доступны.

Рисунок 15: Нормализованный размер кода Dhrystone для модели с памятью  большой емкости

Таблица 5: Нормализованный размер кода Dhrystone для модели с памятью большой емкости 
Источник: Microprocessor Forum 1993 и данные поставщиков

Процессор

Размер кода (Байты)

Соотношение

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

Информация о работе Advanced RISC Machines