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; отсутствует в ARMv6-M
E000ED1C SHPR2
RW
00000000
Регистр приоритетов системных обработчиков 2
E000ED20 SHPR3
RW
00000000
Регистр приоритетов системных обработчиков 3
E000ED24 SHCSR
RW
00000000
Регистр состояния и управления системными обработчиками
E000ED28 CFSR
RW
00000000
Регистр состояния отказов с настраиваемыми приоритетами; отсутствует в ARMv6-M
E000ED2C HFSR
RW
00000000
Регистр состояния серьёзного отказа; отсутствует в ARMv6-M
E000ED30 DFSR
RW
см. примечание 4
Регистр состояния отладочных отказов, см. раздел «Отладочные регистры»
E000ED34 MMFAR
RW5
не определено
Регистр адреса отказа памяти; отсутствует в ARMv6-M
E000ED38 BFAR
RW5
не определено
Регистр адреса отказа шины; отсутствует в ARMv6-M
E000ED3C AFSR
RW
не определено
Вспомогательный регистр состояния отказов. Определяется реализацией; отсутствует в ARMv6-M
E000ED40

E000ED84

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

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

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

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

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

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

ARM M-profile CPUID register

Формат основного регистра идентификации процессора в версии 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.
Доступ: чтение/запись. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.

ARM M-profile ICSR

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

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

Чтение:

  • 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.
Доступ: только чтение или чтение/запись в зависимости от реализации. Начальное значение и количество реализованных разрядов также определяются реализацией. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда

ARM M-profile VTOR

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

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

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

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

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

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

ARM M-profile AIRCR

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

Разряды Доступ Обозначение Функция
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.

ARM M-profile SCR

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

Разряды Обозначение Функция
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, чтение/запись в остальных версиях. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.

ARM M-profile CCR

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

Разряды Обозначение Функция
31:21
Зарезервированы
20
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
RW
STKOFHFNMIGN

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

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

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

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

9
RO/RW
STKALIGN

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

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

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

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

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

8
RW
BFHFNMIGN

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

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

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

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

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

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

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

3
RO/RW
UNALIGN_TRP

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

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

В версии ARMv6-M этот бит всегда равен единице.

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

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

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

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

0
RW
NONBASETHRDENA

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

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

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

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

Адрес: E000ED18, E000ED1C, E000ED20
Доступ: байтами, полусловами, словами в ARMv7-M, только словами в ARMv6-M
Наличие: SHPR1 отсутствует в ARMv6-M, остальные регистры присутствуют всегда

ARM M-profile SHPR1

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

ARM M-profile SHPR2

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

ARM M-profile SHPR3

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

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

В версии ARMv6-M регистр SHPR1 отсутствует, в регистре SHPR2 используются только биты 31:30 (приоритет SVCall), в регистре SHPR3 – биты 31:30 и 23:22 (приоритеты SysTick и PendSV соответственно).

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

Адрес: E000ED24
Доступ: обычный
В архитектуре ARMv7-M доступ к этому регистру возможен и для программы, и для отладчика. В архитектуре ARMv6-M возможность доступа к этому регистру со стороны программы определяется реализацией (например, она отсутствует в ядре Cortex-M1).
Наличие: всегда в ARMv7-M, только при поддержке отладки в ARMv6-M

ARM M-profile SHCSR

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

В версии AMRv6-M без поддержки отладки этот регистр отсутствует, при наличии такой поддержки он имеется, однако включает единственный бит — SVCALLPENDED (разряд 15); все другие биты этого регистра в этой конфигурации являются зарезервированными.

Примечание. В ядре Cortex-M1 одной поддержки отладки для включения данного регистра мало, необходима также поддержка расширений для ОС. Формально это может считаться ошибкой, однако фактически разницы нет, поскольку команда SVC включается только при наличии поддержки ОС.

Разряды Обозначение Функция
31:19 Зарезервированы
18 USGFAULTENA 1 — прерывание UsageFault разрешено
17 BUSFAULTENA 1 — прерывание BusFault разрешено
16 MEMFAULTENA 1 — прерывание MemFault разрешено
15 SVCALLPENDED 1 — прерывание SVCall ожидает начала обработки
14 BUSFAULTPENDED 1 — прерывание BusFault ожидает начала обработки
13 MEMFAULTPENDED 1 — прерывание MemFault ожидает начала обработки
12 USGFAULTPENDED 1 — прерывание UsageFault ожидает начала обработки
11 SYSTICKACT 1 — прерывание SysTick активно
10 PENDSVACT 1 — прерывание PendSV активно
9 Зарезервирован
8 MONITORACT 1 — прерывание Debug Monitor активно
7 SVCALLACT 1 — прерывание SVCall активно
6:4 Зарезервированы
3 USGFAULTACT 1 — прерывание UsageFault активно
2 Зарезервирован
1 BUSFAULTACT 1 — прерывание BusFault активно
0 MEMFAULTACT 1 — прерывание MemFault активно

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

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

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

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

Адрес: E000ED28
Доступ: байтами, полусловами и словами; запись единицы сбрасывает соответствующий бит
Наличие: только ARMv7-M

ARM M-profile CFSR

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

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

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

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

Адрес: E000ED28
Доступ: байтовый; запись единицы сбрасывает соответствующий бит
Наличие: только ARMv7-M

ARM M-profile MMFSR

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

Разряды Обозначение Функция
7 MMFARVALID 1 — содержимое регистра MMAR корректно
6 Зарезервирован
5 MLSPERR 1 — при отложенном сохранении состояния FPU возникло прерывание MemManage
4 MSTKERR 1 — при входе в обработчик какого-либо прерывания возникло прерывание MemManage
3 MUNSTKERR 1 — при выходе из обработчика какого-либо прерывания возникло прерывание MemManage
2 Зарезервирован
1 DACCVIOL 1 — обнаружено нарушение прав доступа к данным; адрес данных, к которым происходило обращение, находится в MMAR
0 IACCVIOL 1 — попытка недопустимой выборки и исполнения команды. Отказ возникает лишь в случае, если производится попытка реально выполнить команду

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

Адрес: E000ED29
Доступ: байтовый; запись единицы сбрасывает соответствующий бит
Наличие: только ARMv7-M

ARM M-profile BFSR

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

Разряды Обозначение Функция
7 BFARVALID 1 — содержимое регистра BFAR корректно
6 Зарезервирован
5 LSPERR 1 — BusFault возник при отложенном сохранении состояния FPU
4 STKERR 1 — BusFault возник при попытке входа в обработчик какого-либо прерывания
3 UNSTKERR 1 — BusFault возник при попытке выхода из обработчика какого-либо прерывания
2 IMPRECISERR 1 — возник неточный отказ при обращении к данным
1 PRECISERR 1 — произошёл точный отказ при обращении к данным; адрес отказа занесён в BFAR
0 IBUSERR 1 — обнаружен отказ при попытке выборки команды. Прерывание возникает лишь в случае, если предпринимается попытка реально выполнить эту команду

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

Адрес: E000ED2A
Доступ: байтами и полусловами; запись единицы сбрасывает соответствующий бит
Наличие: только ARMv7-M

ARM M-profile UFSR

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

Разряды Обозначение Функция
15:10 Зарезервированы
9 DIVBYZERO 1 — попытка деления на 0
8 UNALIGNED 1 — попытка невыровненного доступа
7:4 Зарезервированы
3 NOCP 1 — попытка доступа к отсутствующему или выключенному сопроцессору
2 INVPC 1 — ошибочное значение EXC_RETURN
1 INVSTATE 1 — попытка выполнения команды при неверном значении бита T или поля IT регистра EPSR
0 UNDEFINSTR 1 — попытка выполнить неизвестную или привилегированную команду

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

Адрес: E000ED2C
Доступ: запись 1 очищает соответствующий бит
Наличие: только ARMv7-M

ARM M-profile HFSR

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

Разряды Обозначение Функция
31 DEBUGEVT 1 — произошло отладочное событие, обновлено содержимое регистра DFSR
30 FORCED 1 — произошло повышение приоритета синхронного прерывания до HardFault
29:2 Зарезервированы
1 VECTTBL 1 — ошибка при попытке считать содержимое таблицы векторов прерываний
0 Зарезервирован

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

Адрес: E000ED34
Доступ: только чтение?
Наличие: только ARMv7-M

ARM M-profile MMFAR

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

Разряды Обозначение Функция
31:0 ADDRESS Адрес, при попытке обращения по которому возникло прерывание MemManage, вызванное обнаруженным MPU нарушением защиты памяти. Если выполнялся невыровненный доступ, в регистре MMFAR будет находиться адрес, реально вызвавший нарушение защиты; он может не совпадать с адресом, использованным в команде

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

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

Адрес: E000ED38
Доступ: только чтение?
Наличие: только ARMv7-M

ARM M-profile BFAR

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

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

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

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

Адрес: E000ED3C
Доступ: определяется реализацией
Наличие: определяется реализацией; в ARMv6-M всегда отсутствует

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

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

По TRM для версий Cortex-M3 r2p0 и Cortex-M4 r0p1, содержит состояния входов AUXFAULT. Появление единицы на входе устанавливает соответствующий бит; его сброс возможен только путём программной записи в него единицы.

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

Адрес: E000ED88
Доступ: обычный
Наличие: только ARMv7-M

ARM M-profile CPACR

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

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

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

Сопроцессоры CP0–CP7 определяются реализацией. Сопроцессоры CP8–CP15 зарезервированы компанией ARM; в архитектуре ARMv6-M они всегда отсутствуют, а в архитектуре ARMv7-M может иметься FPU, функционал которого реализуют сопроцессоры CP10 и CP11. Когда он реализован и используется, поля управления доступом к CP10 и CP11 должны содержать одинаковые значения.

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

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

Регистр адреса отказа безопасности SFAR

Advertisement