12. Обзор процессора ARM7TDMI
12.1 Обзор
Ядро ARM7TDMI способен выполнять как 32-битные ARM® команды, так и 16-битные Thumb® команды, что позволяет пользователю сделать оптимальный выбор между производительностью и размером кода. Процессор ARM7TDMI реализован по фон-неймановской архитектуре, использующей трехступенчатое конвейерное выполнение команд: Выборка, Декодирования и Выполнение.
Основные отличительные особенности процессора ARM7TDMI:
- Ядро ARM7TDMI, основанное на архитектуре ARMv4T
- Двойная система команд
- 32-битная система команд ARM® с высокой производительностью
- 16-битная система команд Thumb ® с высокой плотностью кода
- Трехступенчатый конвейер команд
- Выборка команды (F)
- Декодирование команды (D)
- Выполнение (E)
12.2 Процессор ARM7TDMI
Для получения более подробной информации по ядру ARM7TDMI обращайтесь к следующим документам:
12.2.1 Типы выполняемых команд
Любые выполняемые команды ARM7TDMI могут быть либо 32-разрядными (в состоянии ARM), либо 16-разрядными (в состоянии THUMB).
12.2.2 Типы поддерживаемых данных
ARM7TDMI поддерживает работу со следующими типами данных: байт (8 бит), полуслово (16 бит), целое слово (32 бита). При выполнении команд работы с целыми словами, адреса последних должны быть выровнены по четырехбайтной границе, а адреса полуслов - по двухбайтной границе.
Поведение процессора ARM7TDMI при выполнении команд с данными, размещенными по не выровненным адресам (в зависимости от типа самих данных), зависит только от текущего режима работы ядра.
12.2.3 Режимы работы ARM7TDMI
Ядро ARM7TDMI, основанное на ARM архитектуре v4T, поддерживает работу в семи режимах:
- Пользовательский режим (user): обычный режим работы программы
- Быстрое прерывание (FIQ): используется для высокоскоростной передачи данных между процессами (задачами) и внутренними периферийными модулями
- Прерывание (IRQ): используется для обработки прерываний общего назначения
- Режим супервизора (supervisor): защищенный режим для работы операционных систем
- Аварийный режим (abort): поддержка работы виртуальной памяти и/или ее защиты
- Системный режим (system): привилегированный режим для ядра операционной системы
- Неопределенный режим (undefined): программная эмуляция аппаратных сопроцессоров
Смена режима может осуществляться либо программно, либо по внешнему событию (например, внешнему прерыванию), либо по возникновению исключительной ситуации. Подавляющее большинство прикладных программ создано для работы в пользовательском режиме (user).
12.2.4 Регистры ARM7TDMI
Процессор ARM7TDMI имеет в своем составе всего тридцать семь 32-битных регистров:
- 31 регистр общего назначения
- 6 регистров состояния ядра
Все эти 37 регистров недоступны в один и тот же момент времени. Набор регистров, которые доступны из прикладной программы единовременно, зависит от текущего состояния ядра.
В любом состоянии ядра ARM7TDMI доступно не более 16 регистров, при этом все остальные регистры являются их синонимами, а обращение к ним может быть использовано с целью ускорения работы самой программы.
Регистр 15 является программным счетчиком (PC) и может использоваться в любой команде для относительного доступа к данным в памяти (относительно адреса самой команды).
Регистр 14 используется для хранения адреса возврата из последней вызванной подпрограммы.
Регистр 13 используется для хранения адреса вершины программного стека.
Таблица 12-1. Карта размещения регистров ARM7TDMI в различных состояниях ядра ARM
Пользоват. и системный режимы |
Режим Супервизора |
Аварийный Режим |
Неопредел. режим |
Прерывание |
Быстрое прерывание |
R1 |
R1 |
R1 |
R1 |
R1 |
R1 |
R2 |
R2 |
R2 |
R2 |
R2 |
R2 |
R3 |
R3 |
R3 |
R3 |
R3 |
R3 |
R4 |
R4 |
R4 |
R4 |
R4 |
R4 |
R5 |
R5 |
R5 |
R5 |
R5 |
R5 |
R6 |
R6 |
R6 |
R6 |
R6 |
R6 |
R7 |
R7 |
R7 |
R7 |
R7 |
R7 |
R8 |
R8 |
R8 |
R8 |
R8 |
R8_FIQ |
R9 |
R9 |
R9 |
R9 |
R9 |
R9_FIQ |
R10 |
R10 |
R10 |
R10 |
R10 |
R10_FIQ |
R11 |
R11 |
R11 |
R11 |
R11 |
R11_FIQ |
R12 |
R12 |
R12 |
R12 |
R12 |
R12_FIQ |
R13 |
R13_SVC |
R13_ABORT |
R13_UNDEF |
R13_IRQ |
R13_FIQ |
R14 |
R14_SVC |
R14_ABORT |
R14_UNDEF |
R14_IRQ |
R14_FIQ |
PC |
PC |
PC |
PC |
PC |
PC |
|
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
CPSR |
|
SPSR_SVC |
SPSR_ABORT |
SPSR_UNDEF |
SPSR_IRQ |
SPSR_FIQ |
|
регистры с банковым размещением |
Регистры R0…R7 - регистры общего назначения с небанковым размещением. Это означает, что физически размещение этих регистров не зависит от рабочего состояния ядра процессора. Более того, ядро процессора не использует эти регистры в своих целях, т.е. каждый из них может использоваться в прикладной программе как обычные регистры.
Регистры R8…R14 - регистры с банковым размещением. Это означает, что физически размещение этих регистров зависит от рабочего состояния ядра процессора.
12.2.4.1 Режимы исключительных ситуаций и их обработка
Во всех исключительных ситуация ядра используются регистры R13 и R14.
Сразу после возникновения исключительно ситуации в регистре R14 размещается адрес той команды, выполнение которой вызвало эту исключительную ситуацию. После обработки исключительной ситуации производится возврат в прерванную основную программу. Возврат возможен либо по адресу прерванной команды, либо в любое другое место программы (изменение содержимого регистра R14).
Регистр R13 используется для поддержки работы своего программного стека для каждого из режимов ядра процессора. В режиме быстрого прерывания (FIQ) выполняется аппаратное сохранение и восстановление регистров R8…R12.
Из всех семи режимов ядра процессора только системный режим не имеет собственных банковых регистров, поэтому он использует в своей работе регистры пользовательского режима.
Из всех семи режимов ядра процессора только системный режим не имеет собственных банковых регистров, поэтому он использует в своей работе регистры пользовательского режима. Задачи, которые требуют своего выполнения в привилегированном режиме, могут быть запущены в системном режиме, что позволит отслеживать все классы исключительных ситуаций.
12.2.4.2 Статусные регистры процессора
Все режимы работы ядра процессора размещаются в статусных регистрах. Текущее состояние ядра процессора находится в статусном регистре текущей программы (CPSR). Этот регистр имеет указанные следующие поля.
- четыре флага АЛУ: минус, ноль, перенос и переполнение (N, Z, C,V)
- два бита запрета прерываний (один для IRQ и один для FIQ)
- один бит, определяющий текущий режим ядра: ARM или Thumb
- пять бит, определяющих текущее состояние ядра процессора
Все пять исключительных состояний ядра имеют сохраненный статусный регистр текущей программы (SPSR), который хранит содержимое регистра CPSR при возникновении исключительной ситуации.
12.2.4.3 Типы исключительных ситуаций
Ядро поддерживает пять типов исключительных ситуаций, работающих в привилегированном режиме. Ниже приведен их список:
- быстрое прерывание (FIQ)
- обычное прерывание (IRQ)
- аварийная ситуация при работе с памятью (используется для реализации защищенного режима работы памяти или виртуальной памяти)
- сбой при выполнении команды или выполнение несуществующей команды
- программные прерывания (SWI)
Исключительные ситуации вызываются от внешних или внутренних источников.
В один и тот же момент времени могут возникать две и более исключительных ситуации.
Сразу после возникновения исключительной ситуации для сохранения PC используется регистр R14, а для хранения регистра CPSR - регистр SPSR (для соответствующего состояния ядра).
После обработки исключительной ситуации содержимое регистра SPSR копируется в регистр CPSR, а содержимое R14 копируется в программный счетчик PC. Для осуществления этого существуют два способа:
- выполнение команды обработки данных с установленным битом S и указанием регистра PC в качестве регистра-получателя
- выполнение команды групповой загрузки регистров (LDM) с восстановлением CPSR
12.2.5 Обзор системы команд в режиме ARM
Все команды в режиме ARM делятся на следующие группы:
- Команды перехода
- Команды обработки данных
- Команды передачи статусного регистра
- Команды загрузки/хранения
- Команды сопроцессоров
- Команды обработки исключительных ситуаций
Команды в режиме ARM могут выполняться по условию. Для этого в коде каждой команды присутствует 4-битное поле условия: биты [31:28].
В таблице 12-2 приведен полный список команд в режиме ARM.
Таблица 12-2. Список команд в режиме ARM
Мнемоника |
Команда |
ADC |
Сложение с переносом |
ADD |
Сложение |
AND |
Логическое И |
B |
Переход |
BIC |
Очистить бит |
BL |
Переход со ссылкой |
BX |
Переход и переключение режима ядра |
CDP |
Обработать данные сопроцессором |
CMN |
Сравнить с отрицательным операндом |
CMP |
Сравнение |
EOR |
Исключающее ИЛИ |
LDC |
Загрузить в сопроцессор из памяти |
LDM |
Загрузить сразу несколько регистров |
LDR |
Загрузить регистр из памяти по указанному адресу |
LDRB |
Загрузка байта |
LDRBT |
Загрузка байта с переводом |
LDRSB |
Загрузка байта со знаком |
LDRT |
Загрузка слова с переводом |
LDRSH |
Загрузка полуслова со знаком |
LDRH |
Загрузка полуслова |
MCR |
Скопировать регистр CPU в регистр сопроцессора |
MLA |
Умножение со сложением |
MOV |
Загрузить в регистр константу |
MRC |
Скопировать регистр сопроцессора в регистр CPU |
MRS |
Переместить регистр статуса/флагов PSR в регистр Rn |
MSR |
Загрузить в PSR статус/флаги указанный регистр |
MUL |
Умножение |
MVN |
Загрузить регистр отрицательной константой |
ORR |
Логическое ИЛИ |
RSB |
Обратное вычитание |
RSC |
Обратное вычитание с переносом |
SBC |
Вычитание с переносом |
SMULL |
Умножение со знаком с 64-битным результатом |
SMLAL |
Умножение со знаком с 64-битным результатом и накоплением |
STC |
Сохранить регистр сопроцессора в памяти |
STM |
Сохранить сразу несколько регистров |
STR |
Сохранить регистр в памяти |
SUB |
Вычитание |
SWI |
Программное прерывание |
SWP |
Обменять местами содержимое регистра и памяти |
TEQ |
Побитовая проверка на равенство |
TST |
Проверка битов |
UMULL |
Умножение без знака с 64-битным результатом |
UMLAL |
Умножение без знака с 64-битным результатом и накоплением |
12.2.6 Обзор системы команд в режиме Thumb
Система команд ядра в режиме Thumb является подмножеством команд в режиме ARM.
Все команды в режиме Thumb делятся на следующие группы:
- Команды перехода
- Команды обработки данных
- Команды загрузки/хранения
- Команды пакетной загрузки/хранения
- Команды обработки исключительных ситуаций
В режиме Thumb доступны для работы восемь регистров общего назначения: R0…R7. Эти регистры являются физически теми же самыми регистрами в режиме ARM. Некоторые Thumb команды также имеют доступ к программному счетчику PC (ARM регистр R15), регистру ссылки LR (ARM регистр R14) и указателю на вершину стека (ARM регистр R13). Все остальные Thumb команды не имеют доступа к регистрам ядра R8…R15.
Мнемоника |
Команда |
ADC |
Сложение с учетом переноса |
ADD |
Сложение |
AND |
Логическое "И" |
ASR |
Арифметический сдвиг вправо |
B |
Безусловный переход |
Bxx |
Переход по условию |
BIC |
Сброс битов (маскирование) |
BL |
Переход со ссылкой |
BX |
Переход и смена режима ядра |
CMN |
Сравнение с отрицанием |
CMP |
Сравнение |
EOR |
Исключающее "ИЛИ" |
LDMIA |
Групповая загрузка регистров |
LDR |
Загрузка целого слова |
LDRB |
Загрузка байта |
LDRH |
Загрузка полуслова |
LSL |
Логический сдвиг влево |
LDSB |
Загрузка байта со знаком |
LDSH |
Загрузка полуслова со знаком |
LSR |
Логический сдвиг вправо |
MOV |
Пересылка |
MUL |
Умножение |
MVN |
Пересылка с инверсией |
NEG |
Инверсия (побитовое "НЕ") |
ORR |
Логическое "ИЛИ" |
POP |
Извлечение регистров из вершины стека |
PUSH |
Размещение регистров в вершине стека |
ROR |
Циклический сдвиг вправо |
SBC |
Вычитание с переносом |
STMIA |
Групповое сохранение регистров |
STR |
Сохранение целого слова |
STRB |
Сохранение байта |
STRH |
Сохранение полуслова |
SWI |
Программное прерывание |
SUB |
Вычитание |
TST |
Побитовая проверка |
|