ФЭНДОМ


Общие сведения

Системная архитектура процессоров M-профиля кардинально отличается от таковой в профилях A и R. В частности, формат регистров состояния программы (PSR) во всех трёх профилях совпадает лишь в части, доступной непривилегированному коду.

В отличие от профилей A и R, где большая часть функций управления процессором возложена на регистры сопроцессора CP15, формально не являющегося частью центрального процессора (и вообще отсутствующего у некоторых старых процессорных ядер, например, ARM7TDMI архитектуры ARMv4T), в М-профиле самые важные функции управления возложены на несколько регистров, входящих в состав процессорного ядра и доступных с помощью команд MRS и MSR, а все остальные — на довольно многочисленный набор регистров, отображённых на память по строго определённым адресам и доступных с помощью обычных команд загрузки и сохранения данных. В этом разделе описываются регистры, непосредственно входящие в состав ядра; описания прочих регистров можно найти в разделе «Пространство управления системой в M-профиле» и его подразделах.

Регистры состояния

Документация фирмы ARM делит единый регистр состояния на три части: регистр состояния приложения APSR (application program status register), регистр состояния прерывания IPSR (interrupt program status register) и регистр состояния выполнения программы EPSR (execution program status register). Их формат для архитектуры ARMv7-M приведён на рисунке ниже. Те же регистры для версии ARMv6-M имеют несколько упрощённый формат, о чём будет сказано в соответствующих местах описания.

ARM M profile PSR

Формат регистров состояния для M-профиля

Регистр APSR содержит биты, которые могут явным образом изменяться непривилегированными программами с помощью команды MSR, а также считываться командой MRS. Назначение этих разрядов будет описано ниже. В версии ARMv6-M имеются лишь четыре флага условий N, Z, V и C; остальные биты этого регистра отсутствуют.

Регистр IPSR состоит из единственного поля, занимающего разряды 8–0 в версии ARMv7-M и 5–0 в версии ARMv6-M. В режиме потока там всегда находится нуль, а в режиме обработчика — номер (вектор) текущего обрабатываемого прерывания. Привилегированный код может прочитать значение этого поля командой MRS, однако запись в него игнорируется.

Регистр EPSR включает бит T и поле ICI/IT, разделённое на две части. При считывании командой MRS все эти биты будут иметь нулевое значение, а попытка записи в них игнорируется.

Бит T отражает текущую используемую систему команд и в процессорах M-профиля всегда должен быть равен единице, поскольку они поддерживают только набор Thumb/Thumb-2 (если он равен нулю, попытка выполнения первой же команды после его сброса приведёт к возникновению прерывания).

Поле ICI/IT, отсутствующее в версии ARMv6-M, предназначено для хранения состояния выполнения условного блока команд, начинаемого командой IT, либо состояния выполнения прерываемых команд групповой загрузки или сохранения регистров LDM, STM, PUSH и POP. В случае возникновения прерывания сохранённое в стеке значение этого поля используется для продолжения выполнения условного блока или прерываемой команды после возврата из обработчика прерывания. При использовании поля ICI/IT для хранения состояния условного блока используются все его разряды; их назначение приведено в описании команды IT. Если же это поле используется при выполнении прерываемой команды, биты EPSR 26:25 и 11:10 будут равны нулю, а в битах 15:12 будет находиться номер регистра, сохраняемого или загружаемого следующим. Если прерываемая команда используется внутри условного блока, поле ICI/IT хранит информацию, относящуюся к условному блоку; в этом случае при возврате из обработчика прерывания прерываемая команда будет повторена с самого начала.

Ещё один, девятый бит регистра EPSR считается зарезервированным, однако при сохранении регистра состояния в стеке во время входа в обработчик прерывания он устанавливается, если указатель стека (SP) был дополнительно уменьшен на 4 для обеспечения выравнивания на границу двойного слова, и сбрасывается, если дополнительное уменьшение SP не выполнялось. При возврате из обработчика прерывания этот бит анализируется с целью определения того, как именно надо скорректировать SP.

С помощью команд MSR и MRS возможен доступ сразу к двум или всем трём этим регистрам. Это объясняется тем, что физически имеется только один общий регистр состояния, а APSR, IPSR и EPSR являются лишь его представлениями «во внешнем мире». Чтобы указать, к каким именно частям регистра требуется доступ, используются обозначения IAPSR, EAPSR, IEPSR и XPSR (последнее означает одновременное обращение ко всему регистру состояния).

Изменения в регистре состояния, внесённые с помощью команды MSR, вступают в силу немедленно по её завершении.

Флаги условий

Биты N, Z, C и V носят общее название флагов условий или просто флагов. Они характеризуют результат выполнения той или иной операции и могут использоваться для организации переходов и условного выполнения команд.

Флаги условий изменяются командами обработки данных в S-форме, отражая полученный в них результат. Общие правила их модификации приведены в таблице; все исключения и уточнения даются в описаниях команд.

Флаг Описание
N
Устанавливается равным старшему биту результата операции. В том случае, когда результат трактуется как число со знаком, нулевое значение N будет соответствовать нулевому или положительному результату, единичное — отрицательному
Z
Устанавливается, если результат операции равен нулю, и сбрасывается в противном случае
C
Устанавливается или сбрасывается одним из следующих способов:
  • в операциях сложения, включая команду сравнения CMN, флаг C устанавливается, если в результате сложения возник перенос (т. е. если произошло беззнаковое переполнение), и сбрасывается в противном случае;
  • в операциях вычитания, включая команду сравнения CMP, флаг C сбрасывается, если в результате вычитания возник заём (т. е. если беззнаковый результат получился меньше нуля), и устанавливается в противном случае;
  • после операций сдвига флаг C будет равен значению последнего выдвинутого разряда;
  • прочие операции обычно не изменяют значение флага C. Все особые случаи оговариваются в описаниях команд.
V
Операции сложения и вычитания устанавливают флаг V, если возникло знаковое переполнение (т. е. когда знак результата получается не тем, что должен быть по правилам математики), и сбрасывают V при отсутствии переполнения. Остальные команды, как правило, не изменяют его состояние. Все исключения оговариваются в описании команд

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

Флаг Q

Этот флаг является признаком переполнения и/или насыщения, возникшего при выполнении некоторых команд цифровой обработки сигналов. Как и флаги NZVC, этот бит может прямо изменяться непривилегированным кодом. Он присутствует только в процессорах, поддерживающих соответствующие команды; в частности, его нет ни в одном ядре архитектуры ARMv6-M.

Биты GE[3:0]

Эти биты используются командами набора SIMD и отражают выполнение условия «больше или равно» для отдельных байтов или полуслов результата. Они отсутствуют, если соответствующие команды в процессоре не реализованы (например, в ядрах архитектуры ARMv6-M).

Каждый из этих битов устанавливается в следующих случаях:

  • для беззнакового сложения байтов — если результат больше 255;
  • для беззнакового сложения полуслов — если результат больше 65535;
  • для беззнакового вычитания — если результат больше либо равен нулю;
  • для знаковой арифметики — если результат больше либо равен нулю.

Если эти условия не выполняются, соответствующий бит сбрасывается.

Регистры масок

Эти регистры управляют приоритетом кода, выполняемого процессором, а соответственно, возможностью его прерывания. Версия ARMv7-M имеет три регистра — основной маски прерываний PRIMASK, маски отказов FAULTMASK и базового приоритета BASEPRI. В версии ARMv6-M присутствует только первый регистр, два других отсутствуют, что эквивалентно наличию в них нулевых значений. Формат этих регистров показан на рисунке.

ARMv6-M and ARMv7-M special-purpose mask registers

Формат регистров масок для M-профиля

Подробно влияние этих регистров на обработку прерываний описывается в соответствующем разделе, здесь же приведены лишь краткие сведения.

В регистре PRIMASK используется только младший бит, PM. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до 0, из-за чего он может быть прерван только тяжёлым отказом (HardFault), немаскируемым прерыванием (NMI) или сбросом.

В регистре FAULTMASK используется тоже только младший бит, FM. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до –1, и он может быть прерван только NMI или сбросом. Он может быть установлен лишь при текущем уровне приоритета, численно равным или большим нуля; попытка установить этот бит в обработчике HardFault или NMI игнорируется. Возврат из любого прерывания, кроме NMI, сбрасывает этот бит.

Регистр BASEPRI содержит одноимённое поле, которое позволяет повысить приоритет текущего выполняемого кода и тем самым повлиять на способность прерываний вытеснить его с процессора. В отличие от маски PM, поле BASEPRI не запрещает прерывания полностью, а лишь поднимает «верхнюю планку» приоритета. Значение в BASEPRI влияет на текущий приоритет выполнения лишь в случае, если оно численно меньше, чем собственный приоритет текущего выполняющегося обработчика (т. е. нельзя понизить приоритет кода ниже его собственного уровня), при этом значение 0 используется как индикатор того, что повышение приоритета с помощью BASEPRI отключено.

Размер регистра BASEPRI зависит от реализации и может достигать 8 битов. Их количество равно числу разрядов приоритета прерывания, обеспечиваемому данной реализацией.

Для обращения ко всем этим регистрам используются команды MSR и MRS. Кроме того, биты PM и FM могут устанавливаться и сбрасываться командой CPS. Попытки изменения этих регистров непривилегированным кодом игнорируются.

Если команда MSR или CPS используется для повышения (численно — понижения) текущего приоритета выполнения, новый приоритет вступает в силу сразу по завершении выполнения этой команды. Если же она применяется для понижения текущего приоритета, новый приоритет гарантированно вступит в силу лишь после выполнения команды ISB либо при входе или выходе из обработчика прерывания.

Команда MSR, осуществляющая запись в BASEPRI, имеет два варанта. Первый всегда записывает новое значение, а второй — лишь в случае, если новое значение численно меньше старого либо если старое значение BASEPRI равно нулю (т. е. в случае, если запись повышает текущий приоритет выполнения).

При сбросе во все три регистра масок заносятся нули.

Регистр CONTROL

Регистр CONTROL содержит следующие биты:

  • Биты 31—3 не используются и должны быть равны нулю.
  • Бит 2, FPCA, имеется в процессорах, располагающих сопроцессором арифметики с плавающей запятой (FPU). Когда разрешено автоматическое сохранение контекста (установлен бит FPCCR.ASPEN), процессор устанавливает этот бит при успешном выполнении любой команды с плавающей запятой. В процессорах архитектуры ARMv6-M этот бит всегда равен нулю, так как они не могут иметь FPU.
  • Бит 1, SPSEL, выбирает текущий используемый стек. Когда он равен нулю, используется основной стек (его указатель находится в регистре SP_main, или MSP), когда равен единице — стек процесса (указатель в SP_process, или PSP). Последнее возможно только при работе процессора в режиме потока; в режиме обработчика этот бит должен быть равен нулю. Явная запись (командой MSR) в этот разряд в режиме обработчика игнорируется, однако он неявно загружается при выполнении возврата из обработчика прерывания.
  • Бит 0, nPRIV, определяет привилегированность кода, выполняемого процессором в режиме потока. Когда он равен нулю, выполняется привилегированный код, когда равен единице — непривилегированный. В режиме обработчика всегда выполняется привилегированный код независимо от состояния этого разряда. Если процессор архитектуры ARMv6-M не поддерживает непривилегированное исполнение, этот разряд всегда будет равен нулю, а запись в него игнорируется.

Изменения в регистре CONTROL гарантированно возымеют эффект лишь после выполнения команды ISB либо входа или возврата из обработчика прерывания.

При сбросе все биты регистра CONTROL обнуляются. При входе в обработчик прерывания бит SPSEL обнуляется, а бит FPCA устанавливается, если процессор располагает FPU. При возврате из обработчика прерывания бит FCPA изменяется в соответствии со значением кода EXC_RETURN.

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.