OSDev Wiki
Advertisement

Содержание

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

Блок управления системой (SCB, system control block), являющийся частью пространства управления системой (SCS), содержит большую часть регистров, управляющих работой собственно процессора. Кроме них, для управления используются ещё несколько регистров, входящих прямо в состав процессорного ядра, и ряд других регистров SCS.

Регистры SCB, как и все регистры на шине PPB, используют порядок следования байтов «младший-старший» независимо от порядка следования байтов в остальной части системы. Если в описании регистра прямо не сказано иное, доступ к нему возможен только для привилегированного кода и только выровненным полным словом. Попытка доступа меньшей ширины либо невыровненного доступа приведёт к непредсказуемым последствиям, попытка обращения к регистру со стороны непривилегированного кода вызовет отказ UsageFault или HardFault.

При наличии расширения безопасности некоторые регистры целиком или отдельные биты регистров могут иметь отдельные экземпляры для безопасного и небезопасного режимов работы; наличие отдельных вариантов указывается в описании регистра явным образом. Адрес регистра, приводимый в его описании, обеспечивает доступ к варианту этого регистра, соответствующему текущему активному режиму безопасности (т. е. к безопасной версии регистра, если процессор работает в безопасном режиме, и к небезопасной версии в небезопасном режиме). Из безопасного кода можно получить доступ к регистрам небезопасного режима с помощью адресов, численно на 00020000 большими, чем основные адреса; попытка небезопасного кода обратиться по таким адресам для записи игнорируется, а при чтении возвращает нули. В тех случаях, когда необходимо указать не только регистр, но и его версию безопасности, к его имени добавляется суффикс _S или _NS для безопасного и небезопасного режимов соответственно.

Возможности доступа отладчика к регистрам зависят от режима безопасности и от состояния некоторых битов, контролирующих возможности отладки.

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

Адрес Обозначение Доступ Значение после сброса Описание
E000ED00 CPUID
RO
определяется производителем
Основной регистр идентификации процессора
E000ED04 ICSR
RW
00000000
Регистр состояния и управления прерываниями
E000ED08 VTOR
RW
см. примечание 1
Регистр адреса таблицы векторов прерываний
E000ED0C AIRCR
RW
см. примечание 2
Регистр управления сбросами и прерываниями
E000ED10 SCR
RW
00000000
Регистр управления системой
E000ED14 CCR
RW
см. примечание 3
Регистр управления и конфигурации
E000ED18 SHPR1
RW
00000000
Регистр приоритетов системных обработчиков 1
E000ED1C SHPR2
RW
00000000
Регистр приоритетов системных обработчиков 2
E000ED20 SHPR3
RW
00000000
Регистр приоритетов системных обработчиков 3
E000ED24 SHCSR
RW
00000000
Регистр состояния и управления системными обработчиками
E000ED28 CFSR
RW
00000000
Регистр состояния отказов с настраиваемыми приоритетами
E000ED2C HFSR
RW
00000000
Регистр состояния серьёзного отказа
E000ED30 DFSR
RW
см. примечание 4
Регистр состояния отладочных отказов
E000ED34 MMFAR
RW
не определено
Регистр адреса отказа памяти
E000ED38 BFAR
RW
не определено
Регистр адреса отказа шины
E000ED3C AFSR
RW
не определено
Вспомогательный регистр состояния отказов
E000ED40

E000ED84

RO
Регистры идентификации процессора и его средств
E000ED88 CPACR
RW
не определено
Регистр управления доступом к сопроцессорам
E000ED8C Зарезервировано

Примечания. 1. Начальное значение регистра VTOR определяется реализацией.
2. Относительно начального состояния регистра AIRCR документация противоречива. С одной стороны, для ARMv8-M указывается, что после тёплого сброса все его биты, кроме 15, равны нулю, а значение бита 15 определяется реализацией, так как оно показывает порядок следования байтов. С другой стороны, это же руководство утверждает, что 1) при отсутствии расширения безопасности бит 13 считывается как единица (в более ранних версиях архитектуры он зарезервирован и равен нулю); 2) бит 5 показывает, используется ли неявный ESB, причём его использование или неиспользование может быть жёстко сконфигурировано (и бит тогда доступен только для чтения); 3) бит 4 указывает, зависит ли время выполнения команд от используемых ими данных, и это может быть жёстко сконфигурировано.
3. Состояние регистра CCR после сброса определяется конфигурацией процессора.
4. Регистр DFSR устанавливается в 0 только сбросом по включению питания.

Помимо регистров, входящих в состав SCB, важную роль в управлении вычислительной системой играют некоторые другие регистры, не вошедшие в отдельную категорию, а также регистры контроллера прерываний, таймера и устройства защиты памяти. В процессорах, имеющих FPU, к ним добавляются регистры управления FPU. Последние документация ARM относит к регистрам SCB, хотя они, как и другие перечисленные здесь регистры различных технических средств, занимают адреса, относящиеся к другим областям SCS.

Описание регистров SCB

Основной регистр идентификации процессора CPUID

Адрес: E000ED00.
Доступ: только чтение. В версии ARMv8.1-M этот регистр доступен для непривилегированных запросов отладчика, только если установлен любой из битов DAUTHCTRL_S.UIDAPEN или DAUTHCTRL_NS.UIDAPEN.
Наличие: всегда.

Формат основного регистра идентификации процессора в версии ARMv7-M

Этот регистр служит одним из средств идентификации процессора, на котором выполняется программа. Назначение его полей:

Разряды Доступ Обозначение Функция
31:24
RO
IMPLEMENTER
Код разработчика, выданный компанией ARM. Сама ARM для своих разработок использует код 41.
23:20
RO
VARIANT
Номер варианта архитектуры, определяемый реализацией.
19:16
RO
ARCHITECTURE
Код версии архитектуры. Содержит значение 1100 для ARMv6-M и 1111 для ARMv7-M. Для ARMv8-M, судя по всему, используются эти же значения в зависимости от того, имеется или нет базовое расширение, т.е. преемницей какой из предыдущих версий архитектуры является данная реализация.
15:4
RO
PARTNO
Номер компонента, определяемый реализацией.
3:0
RO
REVISION
Номер ревизии, определяемый реализацией.


Известные значения этого регистра (r и p означают ревизию ядра и её патч):

  • 41rCC20p — Cortex-M0
  • 41rCC60p — Cortex-M0+
  • 41rCC21p — Cortex-M1
  • 41rFС23p — Cortex-M3 (для Cortex-M3 r2p1 в его TRM указано значение 0x410FC241 — что, очевидно, является ошибкой, так как соответствует ядру Cortex-M4 r0p1)
  • 41rFС24p — Cortex-M4
  • 41rFС27p — Cortex-M7
  • 41rCD20p — Cortex-M23
  • 41rFD21p — Cortex-M33
  • 41rFD22p — Cortex-M55

Регистр состояния и управления прерываниями ICSR

Адрес: E000ED04.
Доступ: чтение/запись. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.

Формат регистра состояния и управления прерываниями

Разряды Доступ Обозначение Функция
31
RW
PENDNMISET

Чтение:

  • 0 — запрос немаскируемого прерывания (NMI) отсутствует;
  • 1 — запрос NMI имеется.

Запись:

  • 0 — игнорируется;
  • 1 — вызывает появление запроса NMI.

Если биты NMIPENDSET и PENDNMICLR одновременно установлены, результат непредсказуем.

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

Примечание. Ядро Cortex-M1 сбрасывает этот запрос при записи единицы в бит AIRCR.VECTCLRACTIVE, хотя официально об этом в документации не говорится.

30
WO
PENDNMICLR

Запись:

  • 0 — игнорируется;
  • 1 — сброс запроса NMI.

Если биты NMIPENDSET и PENDNMICLR одновременно установлены, результат непредсказуем.

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

Этот бит появился в версии ARMv8-M.

29
Зарезервирован.
28
RW
PENDSVSET

Чтение:

  • 0 — запроса прерывания PendSV нет;
  • 1 — запрос прерывания PendSV имеется.

Запись:

  • 0 — игнорируется;
  • 1 — выдача запроса прерывания PendSV.

Результат одновременной записи единиц в биты PENDSVSET и PENDSVCLR непредсказуем.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности.

Этот бит отсутствует, если прерывание PendSV не поддерживается.

Примечание. В ядре Cortex-M1 даже при наличии системных расширений этот бит доступен только для записи (при считывании возвращается нуль), что противоречит руководству по архитектуре ARMv6-M.

27
WO
PENDSVCLR

Запись:

  • 0 — игнорируется;
  • 1 — сброс запроса прерывания PendSV.

Результат одновременной записи единиц в биты PENDSVSET и PENDSVCLR непредсказуем.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности.

Этот бит отсутствует, если прерывание PendSV не поддерживается.

26
RW
PENDSTSET

Чтение:

  • 0 — запроса прерывания SysTick нет;
  • 1 — запрос прерывания SysTick имеется.

Запись:

  • 0 — игнорируется;
  • 1 — выдача запроса прерывания SysTick.

Результат одновременной записи единиц в биты PENDSTSET и PENDSTCLR непредсказуем.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности, если для них предусмотрены отдельные таймеры. Если имеется один общий таймер, то при сброшенном бите ICSR.STTNS запись единицы в бит PENDSTSET игнорируется, а при считывании возвращается нуль.

Этот бит отсутствует, если SysTick не реализован.

Примечание. В ядре Cortex-M1 даже при наличии SysTick этот бит доступен только для записи (при считывании всегда возвращается нуль), что противоречит руководству по архитектуре ARMv6-M.

25
WO
PENDSTCLR

Запись:

  • 0 — игнорируется;
  • 1 — сброс ожидающего запроса прерывания SysTick.

Результат одновременной записи единиц в биты PENDSTSET и PENDSTCLR непредсказуем.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности, если для них предусмотрены отдельные таймеры. Если имеется один общий таймер, то при сброшенном бите ICSR.STTNS запись единицы в бит PENDSTCLR игнорируется.

Этот бит отсутствует, если SysTick не реализован.

24
RW
STTNS

Показывает доступность SysTick небезопасному коду:

  • 0 — SysTick является безопасным и поэтому недоступен небезопасному коду;
  • 1 — SysTick доступен любому коду.

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

Этот бит появился в ARMv8-M с расширением безопасности и одним SysTick.

23
RO
ISRPREEMPT

Показывает, будет ли при выходе из отладочного останова начата обработка ожидающего прерывания:

  • 0 — обработка прерывания не начнётся;
  • 1 — обработка прерывания начнётся.

Состояние этого бита не определено, если процессор не находится в отладочном останове.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит имеется лишь при поддержке отладки.

22
RO
ISRPENDING

Показывает, имеется ли ожидающее обработки внешнее прерывание:

  • 0 — внешних прерываний, ожидающих обработки, нет;
  • 1 — имеется по крайней мере одно ожидающее обработки внешнее прерывание.

Этот бит формируется без учёта состояния бита DHCSR.C_MASKINTS, т. е. показывает лишь наличие запросов прерываний, но не возможность вызова их обработчиков.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит имеется лишь при поддержке отладки.

21
Зарезервирован.
20:12
RO
VECTPENDING

Номер самого приоритетного из ожидающих разрешённых запросов прерываний. Учитывается запрет отдельных запросов их масками или битом DHCSR.C_MASKINTS, но не учитывается общий запрет прерываний битом PRIMASK.PM. Если таковых нет, содержит нуль.

Поддержка режимов безопасности. Это поле не имеет отдельных версий для режимов безопасности. Однако, начиная с ARMv8.1-M, оно содержит 1, если из безопасного режима считывается регистр небезопасного режима, а самым приоритетным является запрос прерывания для безопасного режима.

Примечание. В ядре Cortex-M1 это поле присутствует лишь в случае, если поддерживаются системные расширения, хотя по документации на архитектуру ARMv6-M оно является обязательным.

11
RO
RETTOBASE

При опросе из режима обработчика показывает, имеется ли ещё какое-либо активное прерывание, помимо обрабатываемого в данный момент:

  • 0 — имеется как минимум одно другое активное прерывание;
  • 1 — других активных прерываний нет.

В режиме потока значение этого бита не определено.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит зарезервирован.

10:9
Зарезервированы.
8:0
RO
VECTACTIVE

Номер прерывания, чей обработчик выполняется в данный момент; 0 для режима потока. Значение этого поля совпадает с битами 8:0 регистра IPSR.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M это поле присутствует лишь при поддержке отладки.

Регистр адреса таблицы векторов прерываний VTOR

Адрес: E000ED08.
Доступ: только чтение или чтение/запись в зависимости от реализации. Начальное значение и количество реализованных разрядов также определяются реализацией. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда

Формат регистра адреса таблицы векторов прерываний

Разряды Доступ Обозначение Функция
31:7
RW/RO
TBLOFF
Старшие разряды адреса таблицы векторов.
6:0
Зарезервированы.

В некоторых реализациях один или два старших бита поля TBLOFF могут быть жёстко заведены на 0, что ограничивает выбор положения таблицы векторов в памяти. Чтобы проверить возможности размещения таблицы векторов, программа может записать в регистр VTOR все единицы, а затем считать из него реально записанное значение.

Примечание. В ранних версиях документации писалось, что поле TBLOFF содержит смещение таблицы векторов; отсюда произошли аббревиатуры VTOR и TBLOFF. Позднее вместо некорректного для данного случая термина «смещение» стали применять правильный «адрес», однако обозначения регистра и поля оставили без изменений.

Регистр управления сбросами и прерываниями AIRCR

Адрес: E000ED0C.
Доступ: чтение/запись. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.

Формат регистра управления сбросами и прерываниями

Разряды Доступ Обозначение Функция
31:16
RW/RO
VECTKEY
VECTKEYSTAT

Чтение: в ARMv6-M значение не определено, в остальных версиях – константа FA05.

Запись: в ARMv6-M, если при записи в регистр значение этого поля не равно 05FA, последствия будут непредсказуемы; в остальных версиях такая запись будет проигнорирована.

Поддержка режимов безопасности. Это поле не имеет отдельных версий для режимов безопасности.

15
RO
ENDIANNESS

Указывает на принятый в данной реализации порядок следования байтов данных в памяти (за исключением SCS):

  • 0 — «младший–старший»;
  • 1 — «старший–младший».

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности.

14
RW/RO
PRIS

Управление приоритетами небезопасных прерываний:

  • 0 – небезопасные прерывания имеют обычные приоритеты;
  • 1 – приоритеты небезопасных прерываний уменьшаются.

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

Этот бит появился в ARMv8-M.

13
RW/RO
BFHFNMINS

Управление режимом обработки прерываний NMI, HardFault и BusFault:

  • 0 – прерывания обрабатываются в безопасном режиме;
  • 1 – прерывания могут обрабатываться в небезопасном режиме.

Если одновременно установлены биты BFHFNMINS и PRIS, последствия будут непредсказуемы.

Поддержка режимов безопасности. Этот бит реализован лишь в процессорах с расширением безопасности. Возможность его записи безопасным кодом определяется реализацией; небезопасный код может только считывать его значение. В ARMv8-M, если расширение безопасности отсутствует, этот бит, как утверждает документация, считывается как единица, однако она же утверждает, что тёплым сбросом он обнуляется. Вероятно, это ошибка, и при отсутствии расширения безопасности он всегда равен нулю (что соответствует более ранним версиям архитектуры).

Этот бит появился в ARMv8-M.

12:11
Зарезервированы.
10:8
RW
PRIGROUP

Это поле управляет группированием приоритетов прерываний.

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

В версиях ARMv8-M без основного расширения и ARMv6-M группирование не поддерживается, и эти разряды зарезервированы.

7:6
Зарезервированы.
5
RW/RO
IESB

Управление неявным барьером синхронизации ошибок (ESB):

  • 0 – неявный ESB запрещён;
  • 1 – неявный ESB разрешён.

ESB может вставляться при входе и выходе из прерывания и при отложенном сохранении контекста FPU. Кроме того, когда он разрешён, неточные прерывания BusFault будут вызывать повышение приоритета подобно точным отказам, но, поскольку реальное место возникновения такого отказа неизвестно, всё равно в качестве причины прерывания будет указываться неточный отказ.

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

Этот бит появился в ARMv8-M с поддержкой RAS; возможность его программного изменения и состояние после сброса определяется реализацией. Насчёт состояния этого бита документация противоречива: с одной стороны, прямо говорится, что тёплый сброс его обнуляет, с другой стороны, столь же прямо утверждается, что процессор может быть жёстко сконфигурирован на применение или неприменение ESB, что будет отражаться данным битом при его считывании.

4
RW
DIT

Управление независимым от данных временем выполнения команд (DIT):

  • 0 – архитектура не даёт каких-либо гарантий относительно времени выполнения команд;
  • 1 – архитектура гарантирует, что команды, время выполнения которых определено как не зависящее от данных, действительно являются таковыми.

Поддержка режимов безопасности. Каждый режим безопасности имеет свой вариант этого бита.

Этот бит появился в ARMv8-M с поддержкой DIT. Возможность его программного изменения, а также его состояние после сброса определяется реализацией (в части сброса документация противоречит сама себе, утверждая, что он сбрасывается в нуль, и одновременно утверждая, что он показывает, зависит время выполнения команд от данных или нет).

3
RW
SYSRESETREQS

Разрешение сброса небезопасным кодом:

  • 0 – сброс посредством установки бита SYSRESETREQ может быть запрошен из обоих режимов безопасности;
  • 1 – сброс может быть запрошен только из безопасного режима.

Поддержка режимов безопасности. Этот бит не имеет версий для разных режимов безопасности и недоступен для небезопасного кода.

Этот бит появился в ARMv8-M.

2
RW/RO
SYSRESETREQ

Запрос выполнения тёплого сброса:

  • 0 — запроса на сброс нет;
  • 1 — выдача запроса на сброс.

Поддержка режимов безопасности. Этот бит не имеет версий для разных режимов безопасности. В процессорах с расширением безопасности небезопасная запись в него игнорируется, если установлен бит AIRCR.SYSRESETREQS.

Сброс может быть произведён в любой момент после установки данного бита, но не обязательно немедленно после такой установки.

Документация на ARMv6-M указывает данный бит как доступный только для записи, на ARMv8-M — как на доступный для чтения и записи; для ARMv7-M информация не приводится.

1
WO
VECTCLRACTIVE

Сброс состояния активности прерываний:

  • 0 — сброс не выполняется;
  • 1 — выполнение сброса активных прерываний, включая обнуление регистра IPSR и перевод процессора в режим потока.

Этот бит сбрасывается автоматически. Запись единицы, если процессор не находится в отладочном останове, в ARMv6-M и ARMv7-M приведёт к непредсказуемым результатам; в ARMv8-M она будет проигнорирована.

Поддержка режимов безопасности. Этот бит не имеет версий для разных режимов безопасности. В процессорах с расширением безопасности запись в него единицы всегда сбрасывает IPSR; признаки активности небезопасных прерываний сбрасываются только в случае, если сброшен бит DHCSR.S_NSUIDE; признаки активности безопасных прерываний сбрасываются только в случае, если сброшен бит DHCSR.S_SUIDE и установлен бит DHCSR.S_SDE.

Примечание. В ядре Cortex-M1 запись 1 в этот разряд приводит к сбросу не только активных, но и ожидающих запросов прерываний NMI и HardFault, хотя документация на архитектуру не упоминает о такой возможности. Кроме того, его установка вызывает сброс состояния блокировки процессора.

0
WO
VECTRESET

Запрос выполнения локального сброса:

  • 0 — запрос отсутствует;
  • 1 — выдача запроса.

Этот бит сбрасывается автоматически. Если при записи 1 процессор не находится в отладочном останове, а также если этот бит устанавливается совместно с битом AIRCR.SYSRESETREQ, результаты будут непредсказуемы.

Этот бит имеется лишь в версии ARMv7-M.

Регистр управления системой SCR

Адрес: E000ED10.
Доступ: чтение/запись. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда в ARMv7-M и ARMv8-M, только при поддержке управления питанием в командах WFI и WFE в ARMv6-M.

Формат регистра управления системой

Разряды Доступ Обозначение Функция
31:5
Зарезервированы.
4
RW
SEVONPEND
Определяет, является ли появление ожидающего запроса прерывания сигналом пробуждения для команды WFE:
  • 0 — не является
  • 1 — является

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

3
RW
SLEEPDEEPS
Управление использованием бита SLEEPDEEP:
  • 0 — бит SLEEPDEEP доступен в обоих режимах безопасности;
  • 1 — бит SLEEPDEEP доступен только для безопасного режима.

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

Этот бит появился в версии ARMv8-M. Если глубокий сон не поддерживается, этот бит всегда равен нулю.

2
RW
SLEEPDEEP

Определяет, в насколько глубокий сон может погружаться процессор при переходе в ожидание:

  • 0 — обычный сон, быстрое пробуждение;
  • 1 — глубокий сон, медленное пробуждение.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для разных режимов. Возможность доступа к нему в небезопасном режиме определяется битом SCR.SLEEPDEEPS.

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

1
RW
SLEEPONEXIT

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

  • 0 — нет, перехода в сон не будет;
  • 1 — да, по завершении последнего обработчика процессор переходит в сон.

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

0
Зарезервирован.

Регистр управления и конфигурации CCR

Адрес: E000ED14.
Доступ: только чтение в ARMv6-M, чтение/запись в остальных версиях. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.

Формат регистра управления и конфигурации

Разряды Доступ Обозначение Функция
31:21
Зарезервированы
20
RO/RW
TRD

Проверка сигнатуры целостности и запрет повторного входа в поток в командах SG:

  • 0 — проверка отключена;
  • 1 — проверка выполняется; попытка входа в безопасный поток, когда уже активен вызов безопасного потока, приведёт к отказу.

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

Этот бит появился в версии ARMv8.1-M.

19
RO/RW
LOB

Разрешение работы кэша циклов и переходов:

  • 0 — кэш выключен;
  • 1 — кэш включен.

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

Этот бит появился в версии ARMv8.1-M. Он равен нулю в более ранних версиях, а также при отсутствии кэша циклов и переходов.

18
RO/RW
BP

Управляет работой предсказателя переходов:

  • 0 — предсказатель переходов выключен;
  • 1 — предсказатель переходов включён.

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

Если предсказатель переходов отсутствует, этот бит всегда будет равен нулю. Если он присутствует и не может быть выключен, этот бит всегда будет равен единице.

В версиях ARMv8-M без основного расширения и ARMv-6 всегда равен нулю.

17
RO/RW
IC

Управляет работой кэша команд:

  • 0 — кэш выключен;
  • 1 — кэш включён.

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

Перед включением необходимо выполнить инвалидацию кэша, после включения – барьер синхронизации команд.

В версиях ARMv8-M без основного расширения и ARMv-6, а также при отсутствии кэша в других версиях этот бит равен нулю.

16
RO/RW
DC

Управляет работой кэша данных и/или общего кэша команд и данных:

  • 0 — кэш выключен;
  • 1 — кэш включён.

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

Перед включением необходимо выполнить инвалидацию кэша, после включения – барьер синхронизации команд. Кроме того, при выключении надо выполнить очистку кэша, чтобы все изменённые данные были гарантированно записаны в память.

В версиях ARMv8-M без основного расширения и ARMv-6, а также при отсутствии кэша в других версиях этот бит равен нулю.

15:11
Зарезервированы.
10
RO/RW
STKOFHFNMIGN

Игнорирование отказов из-за выхода за пределы стека при работе на уровне привилегий меньше нуля (NMI или HardFault):

  • 0 — переполнение стека не игнорируется;
  • 1 — переполнение стека игнорируется.

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

Этот бит присутствует только в архитектуре ARMv8-M с основным расширением.

9
RO/RW
STKALIGN

Определяет, необходимо ли при входе в обработчик прерывания принудительно выравнивать стек на границу двойного слова:

  • 0 — нет, не надо;
  • 1 — да, надо.

Если процессор имеет и использует FPU, стек всегда выравнивается на границу двойного слова независимо от состояния этого разряда.

Конкретная реализация версии ARMv7-M может сделать этот бит неизменяемым; ARM рекомендует в таких случаях использовать принудительное выравнивание на границу двойного слова.

Версии ARMv6-M и ARMv8-M всегда обеспечивают принудительное выравнивание, а этот бит доступен только для чтения, возвращая единицу.

8
RO/RW
BFHFNMIGN

Определяет, необходимо ли вырабатывать прерывание при точном отказе во время доступа к данным в обработчике NMI или HardFault:

  • 0 — да, надо, что приведёт к возникновению блокировки;
  • 1 — нет, отказ должен игнорироваться.

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

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит зарезервирован.

7:5
Зарезервированы.
4
RO/RW
DIV_0_TRP

Управляет возникновением отказа при делении на 0:

  • 0 — деление на 0 не вызывает отказа;
  • 1 — деление на 0 вызывает отказ.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит зарезервирован.

3
RO/RW
UNALIGN_TRP

Управляет возникновением отказа при выполнении невыровненного доступа:

  • 0 — невыровненный доступ не вызывает отказа;
  • 1 — невыровненный доступ вызывает отказ.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит зарезервирован и равен единице.

2
Зарезервирован.
1
RO/RW
USERSETMPEND

Управляет доступом непривилегированного кода к регистру STIR:

  • 0 — непривилегированный код не имеет доступа к регистру STIR;
  • 1 — непривилегированный код имеет доступ к регистру STIR.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима безопасности.

В версиях ARMv8-M без основного расширения и ARMv6-M этот бит зарезервирован.

0
RO/RW
NONBASETHRDENA

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

  • 0 — попытка перейти в режим потока при приоритете выполнения выше базового вызовет отказ;
  • 1 — переход в режим потока при приоритете выполнения выше базового возможен.

В версиях ARMv6-M и ARMv8-M этот бит зарезервирован.

Регистры приоритетов системных обработчиков SHPR1, SHPR2, SHPR3

Адрес: E000ED18, E000ED1C, E000ED20.
Доступ: только словами в ARMv8-M без основного расширения и в ARMv6-M, словами, полусловами и байтами в ARMv8-M с основным расширением и в ARMv7-M. При наличии расширения безопасности эти регистры имеют отдельные версии для каждого из режимов. Начиная с ARMv8.1-M, может ли отладчик осуществлять запись в эти регистры, если процессор не остановлен, зависит от реализации.
Наличие: SHPR1 отсутствует в ARMv8-M без основного расширения и в ARMv6-M, остальные регистры присутствуют всегда.

Формат регистра приоритета системных обработчиков 1

Формат регистра приоритета системных обработчиков 2

Формат регистра приоритета системных обработчиков 3

Все три регистра имеют одинаковую структуру и разделены на четыре 8-разрядных поля, каждое из которых задаёт приоритет соответствующего обработчика прерывания. Регистр SHPR1 определяет приоритеты прерываний с номерами 4–7, SHPR2 — с номерами 8–11, SHPR3 — с номерами 12–15. Число реально используемых разрядов в каждом поле может быть меньше 8 и определяется реализацией (реализованные разряды всегда являются старшими в каждом из байтов).

Регистр состояния и управления системными обработчиками SHCSR

Адрес: E000ED24.
Доступ: чтение/запись. При наличии расширения безопасности этот регистр имеет отдельные версии для каждого из режимов. В ARMv6-M доступность этого регистра со стороны процессора определяется реализацией. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только при поддержке отладки в ARMv6-M, всегда в остальных версиях.

Формат регистра состояния и управления системными обработчиками

Разряды Доступ Обозначение Функция
31:22
Зарезервированы.
21
RW
HARDFAULTPENDED

Наличие запроса прерывания HardFault:

  • 0 — запрос HardFault отсутствует;
  • 1 — запрос HardFault ожидает обработки.

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

Этот бит появился в ARMv8-M.

20
RW
SECUREFAULTPENDED

Наличие запроса прерывания SecureFault:

  • 0 — запрос SecureFault отсутствует;
  • 1 — запрос SecureFault ожидает обработки.

Поддержка режимов безопасности. Этот бит имеется только при наличии расширения безопасности и не имеет отдельных версий для разных режимов. Он доступен только безопасному коду.

Этот бит появился в ARMv8-M с основным расширением.

19
RW
SECUREFAULTENA

Разрешение прерывания SecureFault:

  • 0 — прерывание SecureFault запрещено;
  • 1 — прерывание SecureFault разрешено.

Поддержка режимов безопасности. Этот бит имеется только при наличии расширения безопасности и не имеет отдельных версий для разных режимов. Он доступен только безопасному коду.

Этот бит появился в ARMv8-M с основным расширением.

18
RW
USGFAULTENA

Разрешение прерывания UsageFault:

  • 1 — прерывание UsageFault запрещено;
  • 1 — прерывание UsageFault разрешено.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

17
RW
BUSFAULTENA

Разрешение прерывания BusFault:

  • 1 — прерывание BusFault запрещено;
  • 1 — прерывание BusFault разрешено.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

16
RW
MEMFAULTENA

Разрешение прерывания MemManage:

  • 1 — прерывание MemManage запрещено;
  • 1 — прерывание MemManage разрешено.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

15
RW
SVCALLPENDED

Наличие запроса прерывания SVCall:

  • 0 — запрос SVCall отсутствует;
  • 1 — запрос SVCall ожидает обработки.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv6-M без системного расширения.

14
RW
BUSFAULTPENDED

Наличие запроса прерывания BusFault:

  • 0 — запрос BusFault отсутствует;
  • 1 — запрос BusFault ожидает обработки.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

13
RW
MEMFAULTPENDED

Наличие запроса прерывания MemManage:

  • 0 — запрос MemManage отсутствует;
  • 1 — запрос MemManage ожидает обработки.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

12
RW
USGFAULTPENDED

Наличие запроса прерывания UsageFault:

  • 0 — запрос UsageFault отсутствует;
  • 1 — запрос UsageFault ожидает обработки.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

11
RW
SYSTICKACT

Признак активности прерывания SysTick:

  • 0 — прерывание SysTick не активно;
  • 1 — прерывание SysTick активно.

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

Этот бит отсутствует в ARMv6-M независимо от наличия таймера.

10
RW
PENDSVACT

Активность прерывания PendSV:

  • 0 — прерывание PendSV не активно;
  • 1 — прерывание PendSV активно.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv6-M независимо от наличия системного расширения.

9
Зарезервирован
8
RW
MONITORACT

Активность прерывания DebugMonitor:

  • 0 — прерывание DebugMonitor не активно;
  • 1 — прерывание DebugMonitor активно.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для каждого режима. Если бит DEMCR.SDME установлен, доступ к биту MONITORACT у небезопасного кода отсутствует.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

7
RW
SVCALLACT

Активность прерывания SVCall:

  • 0 — прерывание SVCall не активно;
  • 1 — прерывание SVCall активно.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv6-M независимо от наличия системного расширения.

6
Зарезервирован.
5
RW
NMIACT

Активность прерывания NMI:

  • 0 — прерывание NMI не активно;
  • 1 — прерывание NMI активно.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для каждого режима. Если AIRCR.BFHFNMINS сброшен, небезопасный код не имеет к нему доступа. Запись в этот бит игнорируется, если либо 1) записывается единица, бит AIRCR.BFHFNMINS сброшен, доступ выполняется из небезопасного состояния и не к SHCSR_NS, либо 2) запись выполняется отладчиком и бит DHCSR.S_SDE сброшен. Этот бит может быть сброшен только доступом из безопасного режима к SHCSR_NS. Формулировка в документации прямолинейна, но невнятна: 1) с одной стороны, отладчик может изменять этот бит, если DHCSR.S_SDE установлен, а с другой — возможность сброса прямо отнесена только к программному доступу из безопасного кода к SHCSR_NS; 2) непонятно, можно ли программно установить этот бит: четыре условия, когда запись в него игнорируются, перечислены без союзов, что предполагает союз «и», но тогда формально он может обнуляться любым кодом без дополнительных условий, что не так, поэтому, вероятно, он может устанавливаться безопасным кодом при доступе к SHCSR_NS, если сама обработка NMI выполняется небезопасным кодом (AIRCR.BFHFNMINS установлен).

Этот бит появился в ARMv8-M.

4
RW
SECUREFAULTACT

Активность прерывания SecureFault:

  • 0 — прерывание SecureFault не активно;
  • 1 — прерывание SecureFault активно.

Поддержка режимов безопасности. Этот бит не имеет отдельных версий для каждого режима; небезопасному коду он недоступен.

Этот бит появился в ARMv8-M.

3
RW
USGFAULTACT

Активность прерывания UsageFault:

  • 0 — прерывание UsageFault не активно;
  • 1 — прерывание UsageFault активно.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

2
RW
HARDFAULTACT

Активность прерывания HardFault:

  • 0 — прерывание HardFault не активно;
  • 1 — прерывание HardFault активно.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Программная установка этого бита невозможна; программный сброс (запись нуля) возможен только для небезопасной версии регистра (через SHCSR_NS) и только отладчиком при установленном бите DHCSR.S_SDE либо безопасным кодом.

Этот бит появился в ARMv8-M.

1
RW
BUSFAULTACT

Активность прерывания BusFault:

  • 0 — прерывание BusFault не активно;
  • 1 — прерывание BusFault активно.

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

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

0
RW
MEMFAULTACT

Активность прерывания MemManage:

  • 0 — прерывание MemManage не активно;
  • 1 — прерывание MemManage активно.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

Разряды, указывающие нахождение прерывания в состоянии ожидания, устанавливаются аппаратно при появлении соответствующего запроса (или при его программной установке) и сбрасываются при вызове обработчика (или при программном сбросе запроса). Разряды, указывающие нахождение прерывания в активном состоянии, устанавливаются при вызове обработчика и остаются установленными до тех пор, пока не произойдёт возврат из соответствующего обработчика (или не будут сброшены признаки всех активных прерываний). Они остаются установленными, если обработчик оказывается прерванным обработчиком более приоритетного запроса.

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

Примечание. В ядре Cortex-M1 запись в этот регистр возможна только со стороны отладчика, запись со стороны процессора игнорируется, хотя это и противоречит описанию архитектуры ARMv6-M.

Регистр состояния отказов с настраиваемыми приоритетами CFSR

Адрес: E000ED28.
Доступ: чтение/запись словами, полусловами и байтами; запись единицы очищает соответствующий бит. При наличии расширения безопасности этот регистр имеет отдельные версии для каждого из режимов. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра состояния отказов с настраиваемыми приоритетами

Разряды Доступ Обозначение Функция
31:16
R/WC
UsageFault
Индикаторы активных причин возникновения прерывания UsageFault
15:8
R/WC
BusFault
Индикаторы активных причин возникновения прерывания BusFault
7:0
R/WC
MemManage
Индикаторы активных причин возникновения прерывания MemManage

Технически регистр CFSR состоит из трёх независимых регистров: MMFSR, BFSR и UFSR, описанных ниже.

Регистр состояния прерывания MemManage MMFSR

Адрес: E000ED28.
Доступ: чтение/запись отдельным байтом или словом в составе CFSR; запись единицы очищает соответствующий бит. При наличии расширения безопасности этот регистр имеет отдельные версии для каждого из режимов. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра состояния прерывания MemManage

Разряды Доступ Обозначение Функция
7
R/WC
MMFARVALID
  • 0 — содержимое регистра MMFAR некорректно;
  • 1 — содержимое регистра MMFAR корректно.

Поддержка режимов безопасности. Этот бит имеет отдельные экземпляры для каждого из режимов.

6
Зарезервирован.
5
R/WC
MLSPERR

Установлен, если прерывание MemManage возникло при отложенном сохранении состояния FPU.

Поддержка режимов безопасности. Этот бит имеет отдельные экземпляры для каждого из режимов.

4
R/WC
MSTKERR

Установлен, если прерывание MemManage возникло при входе в обработчик какого-либо прерывания.

Поддержка режимов безопасности. Этот бит имеет отдельные экземпляры для каждого из режимов.

3
R/WC
MUNSTKERR

Установлен, если прерывание MemManage возникло при выходе из обработчика какого-либо прерывания.

Поддержка режимов безопасности. Этот бит имеет отдельные экземпляры для каждого из режимов.

2
Зарезервирован.
1
R/WC
DACCVIOL

Установлен, если обнаружено нарушение прав доступа к данным; адрес этих данных находится в MMAR.

Поддержка режимов безопасности. Этот бит имеет отдельные экземпляры для каждого из режимов.

0
R/WC
IACCVIOL

Установлен, если прерывание MemManage возникло при попытке выборки команды для фактического выполнения.

Поддержка режимов безопасности. Этот бит имеет отдельные экземпляры для каждого из режимов.

Регистр состояния прерывания BusFault BFSR

Адрес: E000ED29.
Доступ: чтение/запись отдельным байтом или словом в составе CFSR; запись единицы очищает соответствующий бит. При наличии расширения безопасности этот регистр не имеет отдельных версий для каждого из режимов. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра состояния прерывания BusFault

Разряды Доступ Обозначение Функция
7
R/WC
BFARVALID
  • 0 — содержимое регистра BFAR некорректно;
  • 1 — содержимое регистра BFAR корректно.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

6
Зарезервирован.
5
R/WC
LSPERR

Равен единице, если прерывание BusFault возникло при отложенном сохранении состояния FPU.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

4
R/WC
STKERR

Равен единице, если прерывание BusFault возникло при попытке входа в обработчик какого-либо прерывания.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

3
R/WC
UNSTKERR

Равен единице, если прерывание BusFault возникло при попытке выхода из обработчика какого-либо прерывания.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

2
R/WC
IMPRECISERR

Равен единице, если при обращении к данным возник неточный отказ.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

1
R/WC
PRECISERR

Равен единице, если при обращении к данным возник точный отказ; его адрес занесён в BFAR.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

0
R/WC
IBUSERR

Равен единице, если прерывание BusFault возникло при попытке выборки команды для фактического выполнения.

Поддержка режимов безопасности. Если AIRCR.BFHFNMINS сброшен, этот бит в небезопасном состоянии недоступен.

Регистр состояния прерывания UsageFault UFSR

Адрес: E000ED2A.
Доступ: чтение/запись отдельными байтами, полусловом или словом в составе CFSR; запись единицы очищает соответствующий бит. При наличии расширения безопасности этот регистр имеет отдельные версии для каждого из режимов. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра состояния прерывания UsageFault

Разряды Доступ Обозначение Функция
15:10
Зарезервированы.
9
R/WC
DIVBYZERO

Установлен, если прерывание UsageFault вызвано попыткой деления на 0.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

8
R/WC
UNALIGNED

Установлен, если прерывание UsageFault вызвано попыткой невыровненного доступа.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

7:5
Зарезервированы.
4
R/WC
STKOF

Установлен, если прерывание UsageFault вызвано переполнением стека.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Этот бит появился в ARMv8-M.

3
R/WC
NOCP

Установлен, если прерывание UsageFault вызвано обращением к сопроцессору, доступ к которому запрещён.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

2
R/WC
INVPC

Установлен, если прерывание UsageFault вызвано выполнением возврата из прерывания с неверным значением EXC_RETURN.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

1
R/WC
INVSTATE

Установлен, если прерывание UsageFault вызвано попыткой выполнения команды при неверном значении бита T или поля IT EPSR.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

0
R/WC
UNDEFINSTR

Установлен, если прерывание UsageFault вызвано попыткой выполнения отсутствующей команды либо привилегированной команды в непривилегированном режиме.

Поддержка режимов безопасности. Этот бит имеет отдельные версии для каждого режима.

Регистр состояния прерывания HardFault HFSR

Адрес: E000ED2C
Доступ: чтение/запись; запись единицы очищает соответствующий бит. Отдельных версий для каждого режима безопасности этот регистр не имеет. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра состояния серьёзных ошибок

Разряды Доступ Обозначение Функция
31
R/WC
DEBUGEVT

Установлен, если прерывание HardFault произошло из-за того, что возникло отладочное событие, при этом отладочный останов запрещён, а прерывание DebugMon не может быть вызвано.

30
R/WC
FORCED

Установлен, если прерывание HardFault произошло из-за повышения приоритета синхронного прерывания до HardFault.

29:2
Зарезервированы.
1
R/WC
VECTTBL

Установлен, если прерывание HardFault произошло из-за ошибки при попытке прочитать таблицу векторов прерываний.

0
Зарезервирован.

Регистр адреса отказа памяти MMFAR

Адрес: E000ED34.
Доступ: чтение/запись. При наличии расширения безопасности имеет отдельные версии для разных режимов безопасности. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра адреса ошибки MemManage

Разряды Доступ Обозначение Функция
31:0
R/W
ADDRESS

Адрес, при попытке обращения по которому возникло прерывание MemManage, вызванное обнаруженным MPU нарушением защиты памяти. Если выполнялся невыровненный доступ, в регистре MMFAR будет находиться адрес, реально вызвавший нарушение защиты; он может не совпадать с адресом, использованным в команде.

Содержимое этого регистра действительно лишь при установленном бите MMFSR.MMARVALID.

Регистр MMFAR может технически совпадать с регистром BFAR, поскольку прерывания MemManage и BusFault не могут произойти одновременно. В такой ситуации, если после прерывания MemManage происходит прерывание BusFault, содержимое регистра MMFAR изменяется и уже не отражает адрес, вызвавший прерывание MemManage. Произойдёт ли при этом сброс бита MMFSR.MMARVALID, документация не сообщает.

Поддержка режимов безопасности. Это поле имеет отдельные версии для каждого из режимов.

Состояние после сброса не определено.

Регистр адреса отказа шины BFAR

Адрес: E000ED38.
Доступ: чтение/запись. Отдельных версий для разных режимов безопасности не имеет. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением и ARMv7-M.

Формат регистра адреса отказа шины

Разряды Доступ Обозначение Функция
31:0
R/W
ADDRESS

Адрес данных, при обращении по которому возник точный отказ BusFault. Если отказ произошёл при невыровненном доступе, в BFAR будет находиться адрес, использованный командой, вызвавшей отказ; он не обязательно совпадает с реальным адресом обращения.

Содержимое этого регистра действительно лишь при установленном бите BFSR.BFARVALID.

Регистр BFAR может технически совпадать с регистром MMFAR, поскольку прерывания BusFault и MemManage не могут произойти одновременно. В такой ситуации, если после прерывания BusFault происходит прерывание MemManage, содержимое регистра BFAR изменяется и уже не отражает адрес, вызвавший прерывание BusFault. Произойдёт ли при этом сброс бита BFSR.BFARVALID, документация не сообщает.

Поддержка режимов безопасности. Это поле не имеет отдельных версий для каждого из режимов. Если AIRCR.BFHFNMINS сброшен, доступ в небезопасном режиме невозможен (запись игнорируется, чтение возвращает нуль). Если реализация имеет совмещённые регистры BFAR и MMFAR, совмещаются BFAR и безопасная версия MMFAR, чтобы код небезопасного режима не мог получить содержимое BFAR через доступный ему MMFAR.

Состояние после сброса не определено.

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

Вспомогательный регистр состояния отказов AFSR

Адрес: E000ED3C.
Доступ: чтение/запись. Отдельных версий для разных режимов безопасности не имеет. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: формально отсутствует лишь в ARMv6-M, фактически — определяется реализацией.

Назначение разрядов этого регистра определяется реализацией.

Регистр AFSR в Cortex-M3 и Cortex-M4

Биты регистра AFSR в ядрах Cortex-M3 и Cortex-M4 устанавливаются, когда появляется единица на соответствующем входе шины вспомогательных отказов AUXFAULT (причины установки тех или иных линий этой шины определяются подключением процессорного ядра к остальной части вычислительной системы). Для сброса установленного бита программа должна записать единицу в соответствующую позицию этого регистра.

Появление единицы в каком-либо разряде AUXFAULT не вызывает прерывания, поэтому единственный способ узнать об изменении состояния его битов заключается в регулярном программно опросе.

Регистр управления доступом к сопроцессорам CPACR

Адрес: E000ED88.
Доступ: чтение/запись. При наличии расширения безопасности имеет отдельные версии дляр азных режимов. Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: отсутствует в ARMv8-M без основного расширения и в ARMv6-M.

Формат регистра управления доступом к сопроцессорам

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

Возможные значения поля управления доступом для имеющегося сопроцессора:

  • 00 — доступ запрещён;
  • 01 — разрешён доступ только привилегированному коду;
  • 10 — зарезервировано;
  • 11 — разрешён полный доступ.

Назначение и наличие сопроцессоров CP0–CP7 определяется реализацией. Наличие сопроцессоров CP8—CP15 также определяется реализацией, однако функции этих сопроцессоров определяются компанией ARM.

В настоящее время определено назначение лишь сопроцессоров CP11 и CP10: оба они на самом деле являются одним сопроцессором, реализующем FPU и MVE (последнее расширение может присутствовать в ARMv8-M). Реальное управление доступом к этому сопроцессору задаётся полем CP10; программа должна заносить в CP11 те же значения, что и в CP10, но не полагаться на содержимое поля CP11.

Состояние полей регистра CPACR после сброса определяется реализацией.

Регистр управления небезопасными доступами NSACR

Адрес: E000ED8C.
Доступ: При отсутствии расширения безопасности считывается как 00000CFF, запись невозможна. При наличии расширения безопасности имеется в единственном экземпляре и доступен безопасному коду для чтения и записи; небезопасный код доступа не имеет (считывается нуль, запись игнорируется). Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: имеется только в ARMv8-M с основным расширением.

Формат регистра управления небезопасными доступами

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

Состояние после сброса определяется реализацией.

Регистр состояния прерывания SecureFault SFSR

Адрес: E000EDE4.
Доступ: чтение/запись; запись единицы очищает соответствующий бит. Отдельных версий для каждого режима безопасности этот регистр не имеет; доступ небезопасного кода невозможен (запись игнорируется, при считывании возвращается нуль). Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением.

Формат регистра состояния прерывания SecureFault

Разряды Доступ Обозначение Функция
31:8
Зарезервированы
7
R/WC
LSERR

Установлен, если прерывание SecureFault возникло из-за при отложенной активации или деактивации состояния.

При сбросе обнуляется.

6
R/WC
SFARVALID,
  • 0 — содержимое регистра SFAR некорректно;
  • 1 — содержимое регистра SFAR корректно.

При сбросе обнуляется.

5
R/WC
LSPERR

Установлен, если прерывание SecureFault возникло из-за обнаружения нарушения SAU или IDAU при отложенном сохранении контекста FPU.

При сбросе обнуляется.

4
R/WC
INVTRAN

Установлен, если прерывание SecureFault возникло из-за перехода, не отмеченного как осуществляющего переход из безопасной в небезопасную память.

При сбросе обнуляется.

3
R/WC
AUVIOL

Установлен, если прерывание SecureFault возникло из-за попытки небезопасного доступа к безопасной части адресного пространства. Этот бит не устанавливается, если данное нарушение возникло при отложенном сохранении контекста FPU (см. бит LSPERR) или при выборке вектора прерывания.

При сбросе обнуляется.

2
R/WC
INVER

Установлен, если прерывание SecureFault возникло из-за попытки возврата из прерывания в небезопасное состояние со сброшенным битом EXC_RETURN.DCRS или установленным битом EXC_RETURN.ES.

При сбросе обнуляется.

1
R/WC
INVIS

Установлен, если прерывание SecureFault возникло из-за попытки возврата из прерывания при неверном значении сигнатуры целостности в кадре стека.

При сбросе обнуляется.

0
R/WC
INVEP

Установлен, если прерывание SecureFault возникло из-за недопустимой попытки войти в безопасное состояние.

При сбросе обнуляется.

Регистр адреса прерывания SecureFault SFAR

Адрес: E000EDE8.
Доступ: чтение/запись. Отдельных версий для каждого режима безопасности этот регистр не имеет; доступ небезопасного кода невозможен (запись игнорируется, при считывании возвращается нуль). Начиная с ARMv8.1-M, возможность записи в этот регистр отладчиком, если процессор не остановлен, определяется реализацией.
Наличие: только ARMv8-M с основным расширением.

Формат регистра адреса прерывания SecureFault

Разряды Доступ Обозначение Функция
31:0
R/W
ADDRESS

Адрес, при попытке обращения по которому возникло прерывание SecureFault.

Содержимое этого регистра действительно лишь при установленном бите SFSR.SFARVALID.

Регистр SFAR может технически совпадать с регистрами BFAR и MMFAR_S, поскольку прерывания SecureFault, BusFault и MemManage не могут произойти одновременно. В такой ситуации, если после прерывания SecureFault происходит прерывание BusFault или MemManage, содержимое регистра SFAR изменяется и уже не отражает адрес, вызвавший прерывание SecureFault. Произойдёт ли при этом сброс бита SFSR.SFARVALID, документация не сообщает.

Состояние после сброса не определено.

Advertisement