Микропроцессоры на ядре ARM

Процессор на базе ядра ARM содержит двадцать семь регистров, из которых обычно программистом используется только 16.

Регистры от 0 до 7 - регистры общего назначения (РОНы). В отличие от 80х86, в котором некоторые регистры используются для организации стека, или 6502, в котором результат операции всегда помещается в аккумулятор, ARM очень гибок в отношении использования регистров.

Регистры от 8 до 12 также РОНы, но у них есть теневые регистры-двойники, которые используются только в режиме быстрого ответа на прерывания.

Регистр 13 обычно указатель стека операционной системы, но м.б. использован как РОН. Это опция ОС, а не процессора, если вы не используете стек ОС, этот регистр может использоваться как угодно. Этот регистр также имеет теневого двойника.

Регистр 14 хранит адрес возврата для более быстрых операций с подпрограммами. Команда " branch with link (BL)" используется адрес возврата, хранимый в этом регистре (R14).

Естественно, при вложенных вызовах процедур регистр 14 д.б. сохранён, возможно в других регистрах, а возможно и в стеке. После сохранения адреса возврата регистр м.б. использован как РОН. Он также имеет теневого двойника.

Регистр 15 является счётчиком программ. Наряду с 26 битами адреса он хранит статусные биты процессора.

Таким образом, по сравнению с 80х86 у программиста есть 14 РОНов, что позволяет более эффективно использовать регистровую память. К тому же схемы адресации позволяют использовать любые регистры, а не чётко обозначенные.

Таблица использования регистров:


User Mode

SVC Mode

IRQ Mode

FIQ Mode

R0 -------

R0 -------

R0 -------

R0

R1 -------

R1 -------

R1 -------

R1

R2 -------

R2 -------

R2 -------

R2

R3 -------

R3 -------

R3 -------

R3

R4 -------

R4 -------

R4 -------

R4

R5 -------

R5 -------

R5 -------

R5

R6 -------

R6 -------

R6 -------

R6

R7 -------

R7 -------

R7 -------

R7

R8 -------

R8 -------

R8

R8_fiq

R9 -------

R9 -------

R9

R9_fiq

R10 ------

R10 ------

R10

R10_fiq

R11 ------

R11 ------

R11

R11_fiq

R12 ------

R12 ------

R12

R12_fiq

R13

R13_svc

R13_irq

R13_fiq

R14

R14_svc

R14_irq

R14_fiq

------------- R15 / PC -------------

Счётчик программ имеет следующий формат:


Bit

31

30

29

28

27

26

25------------2

1

0

N

Z

C

V

I

F

Program Counter

S1

S0


N

флаг отрицательного числа

Z

флаг нуля

C

флаг переноса

V

флаг переполнения

I

флаг разрешения прерывания

F

флаг разрешения быстрого прерывания

PC

счётчик команд

S1

режим: 00 - пользователь, 01 - быстрое прерывание, 10 - прерывание, 11-супервизор

S0

В новых процессорах ARM указатель команд 32-битный, потому регистр имеет несколько другой формат. (Новейшие процессоры, например XScale, не поддерживают 26-битовый режим.

Коротко, основные отличия 32-битового формата таковы:

Отметим, что предшественник RISC-процессоров 6502 имел минимальный набор регистров:

  Аккумулятор - для результатов арифметических инструкций
  X-регистр   - Первый РОН
  Y-регистр   - Второй РОН
  PC          - Счётчик команд
  SP          - Указатель стека, смещение от страницы 1.(адрес &01xx).
  PSR         - Регистр статуса процессора (флаговый).

Режимы выполнения программ:

Отличия между IRQ и FIQ состоят в том, что в FIQ режиме необходима быстрая обработка прерываний и выход..., так как IRQ может быть прервано FIQ но IRQ не может прервать FIQ. Для быстрейшего прохождения FIQ в них используется большее количество теневых регистров, прерывания запрещены, нельзя вызывать некоторые команды - например команды программного прерывания. В общем, FIQ рекомендуется для частой обработки несложных обменов данными.

Систему команд микропроцессора детально описывать не будем. Отметим лишь, что она является типичной RISC, команды за редким исключением выполняются за 1 такт. Каждая инструкция имеет длину 32 бита, кроме случая с режимом Thumb, когда формат команд становится двуоперандным и две 16-битовые команды размещаются в 32-разрядном слове. Реально процессор поддерживает 2 набора команд, переключение между которыми производится специальными инструкциями.

Рассмотрим лишь особенности команд ARM.

Например, 3 команды сложения:

ADD R0, R0, R1
ADDS R0, R0, R1
ADDEQS R0, R0, R1
Первая команда - базовое сложение R1 к R0, без изменения регистра флагов.

Вторая команда - то же сложение, но с изменением регистра флагов.

Третья команда - то же сложение, с изменением регистра флагов. Отличие в том, что это условная инструкция, которая будет исполнена только если результатом предыдущей операции было условие "равно" - если установлен флаг Z.

Так же условными являются команды перемещения данных.

Поддерживается инструкция умножения и инструкция умножения с накоплением.

Отдельного внимания заслуживают пакетные инструкции сохранения, например

STMFD R13!, {R0-R12, R14}
...
LDMFD R13!, {R0-R12, PC}
Первая инструкция сохраняет по адресу, записанному в регистре 13 (с постинкрементом адреса - на это указывает мнемоника) с обновлением регистра 13 после операции, содержимое регистров с 0 по 12 и 14 (адрес возврата). Вторая инструкция загружает эти регистры обратно с 0 по 12 и в счётчик команд, фактически делая возврат из процедуры.

Система команд ARМ, хотя он позиционируется как RISC, достаточно сложна. Например команда:

LDREQ R0,[R1,R2,LSR #16]!

загружает регистр 0 при условии, что флаг нуля установлен, а адрес считается как сумма регистра 1 и регистра 2, сдвинутого на 16 бит влево, при этом результирующий адрес будет записан в регистр 1 по окончании загрузки.

Условное исполнение многих команд позволяет лучше загрузить конвейер и тратить меньше ресурсов на предсказание переходов.

Во время исполнения инструкции дополнительно может быть задействован сдвигатель, что позволяет сэкономить 1 такт на операции сдвига.

Необязательная установка флагов позволяет снять ряд ограничений на составления расписаний команд.

Большое количество методов адресации:

LDR R0,[R1,#16]
LDR R0,[R1,#16]!
LDR R0,[R1],#16
LDR R0,[R1,R2]
LDR R0,[R1,R2]!
LDR R0,[R1],R2
...

Свободное использование регистров в различных командах, например:

ADD PC,PC,R0,LSL #2
MOV R0,R0
B R0is0
B R0is1
B R0is2
B R0is3

или например:

ADD PC,PC,R0,LSL #3
MOV R0,R0
MOV R1,#1
B Continue
MOV R2,#2
B Comtinue
MOV R2,#4
B Continue
MOV R2,#8
B Continue


Отметим, что версии ARM являются отличным примером архитектуры ОКОД - благодаря применению практически всех технологий, позволяющих оптимизировать конвейер ОКОД-процессора, тактовая частота новейших XScale достигает 600 Мгц, что говорит об очень хороших характеристиках архитектуры в целом.