SII (Стена обсуждения | вклад) м (→Общие сведения) |
SII (Стена обсуждения | вклад) |
||
Строка 533: | Строка 533: | ||
| |
| |
||
Разрешение сброса небезопасным кодом: |
Разрешение сброса небезопасным кодом: |
||
− | * 0 – сброс посредством установки бита SYSRESETREQ может быть запрошен из обоих |
+ | * 0 – сброс посредством установки бита SYSRESETREQ может быть запрошен из обоих режимов безопасности; |
− | * 1 – сброс может быть запрошен только из безопасного |
+ | * 1 – сброс может быть запрошен только из безопасного режима. |
− | Этот бит |
+ | '''Поддержка режимов безопасности'''. Этот бит не имеет версий для разных режимов безопасности и недоступен для небезопасного кода. |
+ | Этот бит появился в ARMv8-M. |
||
− | Тёплый сброс обнуляет этот бит. |
||
|- |
|- |
||
|<center>2</center> |
|<center>2</center> |
||
Строка 548: | Строка 548: | ||
* 1 — выдача запроса на сброс. |
* 1 — выдача запроса на сброс. |
||
− | В процессорах с расширением безопасности небезопасная запись в |
+ | '''Поддержка режимов безопасности'''. Этот бит не имеет версий для разных режимов безопасности. В процессорах с расширением безопасности небезопасная запись в него игнорируется, если установлен бит AIRCR.SYSRESETREQS. |
− | |||
⚫ | |||
Сброс может быть произведён в любой момент после установки данного бита, но не обязательно немедленно после такой установки. |
Сброс может быть произведён в любой момент после установки данного бита, но не обязательно немедленно после такой установки. |
||
+ | |||
⚫ | |||
|- |
|- |
||
|<center>1</center> |
|<center>1</center> |
||
|<center>WO</center> |
|<center>WO</center> |
||
|<center>VECTCLRACTIVE</center> |
|<center>VECTCLRACTIVE</center> |
||
+ | | |
||
− | + | Сброс состояния активности прерываний: |
|
* 0 — сброс не выполняется. |
* 0 — сброс не выполняется. |
||
* 1 — выполнение сброса активных прерываний, включая обнуление регистра [[регистры состояния и управления в M-профиле#Регистры состояния|IPSR]] и перевод процессора в [[Режимы процессора в M-профиле|режим потока]]. |
* 1 — выполнение сброса активных прерываний, включая обнуление регистра [[регистры состояния и управления в M-профиле#Регистры состояния|IPSR]] и перевод процессора в [[Режимы процессора в M-профиле|режим потока]]. |
||
⚫ | В процессорах с расширением безопасности |
||
Этот бит сбрасывается автоматически. Запись единицы, если процессор не находится в отладочном останове, в ARMv6-M и ARMv7-M приведёт к непредсказуемым результатам; в ARMv8-M она будет проигнорирована. |
Этот бит сбрасывается автоматически. Запись единицы, если процессор не находится в отладочном останове, в ARMv6-M и ARMv7-M приведёт к непредсказуемым результатам; в ARMv8-M она будет проигнорирована. |
||
⚫ | '''Поддержка режимов безопасности'''. Этот бит не имеет версий для разных режимов безопасности. В процессорах с расширением безопасности запись в него единицы всегда сбрасывает IPSR; признаки активности небезопасных прерываний сбрасываются только в случае, если сброшен бит [[Отладочные регистры в M-профиле#Регистр состояния и управления отладочными остановами DHCSR|DHCSR]].S_NSUIDE; признаки активности безопасных прерываний сбрасываются только в случае, если сброшен бит DHCSR.S_SUIDE и установлен бит DHCSR.S_SDE. |
||
⚫ | В ядре Cortex-M1 запись 1 в этот разряд приводит к сбросу не только активных, но и ожидающих запросов прерываний NMI и HardFault, хотя документация на архитектуру не упоминает о такой возможности. Кроме того, его установка вызывает сброс состояния [[Обработка прерываний в M-профиле#Блокировка при невозможности входа в обработчик прерывания|блокировки процессора]]. |
||
⚫ | '''Примечание'''. В ядре Cortex-M1 запись 1 в этот разряд приводит к сбросу не только активных, но и ожидающих запросов прерываний NMI и HardFault, хотя документация на архитектуру не упоминает о такой возможности. Кроме того, его установка вызывает сброс состояния [[Обработка прерываний в M-профиле#Блокировка при невозможности входа в обработчик прерывания|блокировки процессора]]. |
||
− | В версии ARMv8-M этот бит показан как доступный для чтения-записи, однако там же оговорено, что из него всегда считывается нуль, т. е. реально он доступен только на запись. |
||
|- |
|- |
||
|<center>0</center> |
|<center>0</center> |
||
Строка 576: | Строка 576: | ||
* 1 — выдача запроса. |
* 1 — выдача запроса. |
||
⚫ | |||
− | Этот бит используется лишь в версии ARMv7-M; в других версиях он зарезервирован. |
||
+ | Этот бит имеется лишь в версии ARMv7-M. |
||
⚫ | |||
|} |
|} |
||
Версия от 22:49, 14 октября 2021
Общие сведения
Блок управления системой (SCB, system control block), являющийся частью пространства управления системой (SCS), содержит большую часть регистров, управляющих работой собственно процессора. Кроме них, для управления используются ещё несколько регистров, входящих прямо в состав процессорного ядра, и ряд других регистров SCS.
Регистры SCB, как и все регистры на шине PPB, используют порядок следования байтов «младший-старший» независимо от порядка следования байтов в остальной части системы. Если в описании регистра прямо не сказано иное, доступ к нему возможен только для привилегированного кода и только выровненным полным словом. Попытка доступа меньшей ширины либо невыровненного доступа приведёт к непредсказуемым последствиям, попытка обращения к регистру со стороны непривилегированного кода вызовет отказ UsageFault или HardFault.
При наличии расширения безопасности некоторые регистры целиком или отдельные биты регистров могут иметь отдельные экземпляры для безопасного и небезопасного режимов работы; наличие отдельных вариантов указывается в описании регистра явным образом. Адрес регистра, приводимый в его описании, обеспечивает доступ к варианту этого регистра, соответствующему текущему активному режиму безопасности (т. е. к безопасной версии регистра, если процессор работает в безопасном режиме, и к небезопасной версии в небезопасном режиме). Из безопасного кода можно получить доступ к регистрам небезопасного режима с помощью адресов, численно на 00020000 большими, чем основные адреса; попытка небезопасного кода обратиться по таким адресам для записи игнорируется, а при чтении возвращает нули. В тех случаях, когда необходимо указать не только регистр, но и его версию безопасности, к его имени добавляется суффикс _S или _NS для безопасного и небезопасного режимов соответственно.
Возможности доступа отладчика к регистрам зависят от режима безопасности и от состояния некоторых битов, контролирующих возможности отладки.
Перечень всех регистров SCB приведён в следующей таблице, а их подробные описания даны ниже в соответствующих подразделах.
Адрес | Обозначение | Доступ | Значение после сброса | Описание |
---|---|---|---|---|
E000ED00 | CPUID | Основной регистр идентификации процессора | ||
E000ED04 | ICSR | Регистр состояния и управления прерываниями | ||
E000ED08 | VTOR | Регистр адреса таблицы векторов прерываний | ||
E000ED0C | AIRCR | Регистр управления сбросами и прерываниями | ||
E000ED10 | SCR | Регистр управления системой | ||
E000ED14 | CCR | Регистр управления и конфигурации | ||
E000ED18 | SHPR1 | Регистр приоритетов системных обработчиков 1; отсутствует в ARMv6-M | ||
E000ED1C | SHPR2 | Регистр приоритетов системных обработчиков 2 | ||
E000ED20 | SHPR3 | Регистр приоритетов системных обработчиков 3 | ||
E000ED24 | SHCSR | Регистр состояния и управления системными обработчиками | ||
E000ED28 | CFSR | Регистр состояния отказов с настраиваемыми приоритетами; отсутствует в ARMv6-M | ||
E000ED2C | HFSR | Регистр состояния серьёзного отказа; отсутствует в ARMv6-M | ||
E000ED30 | DFSR | Регистр состояния отладочных отказов, см. раздел «Отладочные регистры» | ||
E000ED34 | MMFAR | Регистр адреса отказа памяти; отсутствует в ARMv6-M | ||
E000ED38 | BFAR | Регистр адреса отказа шины; отсутствует в ARMv6-M | ||
E000ED3C | AFSR | Вспомогательный регистр состояния отказов. Определяется реализацией; отсутствует в ARMv6-M | ||
E000ED40 E000ED84 |
Регистры идентификации процессора и его средств | |||
E000ED88 | CPACR | Регистр управления доступом к сопроцессорам; отсутствует в ARMv6-M | ||
E000ED8C | Зарезервировано |
Примечания. 1. Начальное значение регистра VTOR определяется реализацией.
2. Относительно начального состояния регистра AIRCR документация противоречива. С одной стороны, для ARMv8-M указывается, что после тёплого сброса все его биты, кроме 15, равны нулю (а значение бита 15 определяется реализацией, указывая, какой порядок следования байтов поддерживается). С другой стороны, это же руководство утверждает, что 1) при отсутствии расширения безопасности бит 13 считывается как единица (в более ранних версиях архитектуры он зарезервирован и равен нулю); 2) бит 5 показывает, используется ли неявный ESB, причём его использование или неиспользование может быть жёстко сконфигурировано (и бит тогда доступен только для чтения); 3) бит 4 указывает, зависит ли время выполнения команд от используемых ими данных, и это может быть жёстко сконфигурировано.
3. Регистр DFSR устанавливается в 0 только сбросом по включению питания.
4. Регистры MMFAR и BFAR в документации определены как доступные для чтения и записи, однако более логичным является доступ только для чтения.
Помимо регистров, входящих в состав SCB, важную роль в управлении вычислительной системой играют некоторые другие регистры, не вошедшие в отдельную категорию, а также регистры контроллера прерываний, таймера и устройства защиты памяти. В процессорах, имеющих FPU, к ним добавляются регистры управления FPU. Последние документация ARM относит к регистрам SCB, хотя они, как и другие перечисленные здесь регистры различных технических средств, занимают адреса, относящиеся к другим областям SCS.
Описание регистров SCB
Основной регистр идентификации процессора CPUID
Адрес: E000ED00.
Доступ: только чтение. В версии ARMv8.1-M этот регистр доступен для непривилегированных запросов отладчика, только если установлен любой из битов DAUTHCTRL_S.UIDAPEN или DAUTHCTRL_NS.UIDAPEN.
Наличие: всегда.
Этот регистр служит одним из средств идентификации процессора, на котором выполняется программа. Назначение его полей:
Разряды | Обозначение | Функция |
---|---|---|
IMPLEMENTER | Код разработчика, выданный компанией ARM. Сама ARM для своих разработок использует код 41 | |
VARIANT | Номер варианта архитектуры, определяемый реализацией | |
ARCHITECTURE | Код версии архитектуры. Содержит значение 1100 для ARMv6-M и 1111 для ARMv7-M. Для ARMv8-M, судя по всему, используются эти же значения в зависимости от того, имеется или нет базовое расширение, т.е. преемницей какой из предыдущих версий архитектуры является данная реализация | |
PARTNO | Номер компонента, определяемый реализацией | |
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.
Доступ: чтение/запись. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.
Разряды | Доступ | Обозначение | Функция |
---|---|---|---|
NMIPENDSET |
Чтение:
Запись:
Если биты NMIPENDSET и PENDNMICLR одновременно установлены, результат непредсказуем. Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. Если бит AIRCR.BFHFNMINS сброшен, считывание этого бита в небезопасном режиме возвращает нуль, а запись игнорируется. Примечание. Ядро Cortex-M1 сбрасывает этот запрос при записи единицы в бит AIRCR.VECTCLRACTIVE, хотя официально об этом в документации не говорится. | ||
PENDNMICLR |
Запись:
Если биты NMIPENDSET и PENDNMICLR одновременно установлены, результат непредсказуем. Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. Если бит AIRCR.BFHFNMINS сброшен, запись в него в небезопасном режиме игнорируется. Этот бит появился в версии ARMv8-M. | ||
Зарезервирован | |||
PENDSVSET |
Чтение:
Запись:
Результат одновременной записи единиц в биты PENDSVSET и PENDSVCLR непредсказуем. Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности. Этот бит отсутствует, если прерывание PendSV не поддерживается. Примечание. В ядре Cortex-M1 даже при наличии системных расширений этот бит доступен только для записи (при считывании возвращается нуль), что противоречит руководству по архитектуре ARMv6-M. | ||
PENDSVCLR |
Запись:
Результат одновременной записи единиц в биты PENDSVSET и PENDSVCLR непредсказуем. Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности. Этот бит отсутствует, если прерывание PendSV не поддерживается. | ||
PENDSTSET |
Чтение:
Запись:
Результат одновременной записи единиц в биты PENDSTSET и PENDSTCLR непредсказуем. Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности, если для них предусмотрены отдельные таймеры. Если имеется один общий таймер, то при сброшенном бите ICSR.STTNS запись единицы в бит PENDSTSET игнорируется, а при считывании возвращается нуль. Этот бит отсутствует, если SysTick не реализован. Примечание. В ядре Cortex-M1 даже при наличии SysTick этот бит доступен только для записи (при считывании всегда возвращается нуль), что противоречит руководству по архитектуре ARMv6-M. | ||
PENDSTCLR |
Запись:
Результат одновременной записи единиц в биты PENDSTSET и PENDSTCLR непредсказуем. Поддержка режимов безопасности. Этот бит имеет отдельные версии для режимов безопасности, если для них предусмотрены отдельные таймеры. Если имеется один общий таймер, то при сброшенном бите ICSR.STTNS запись единицы в бит PENDSTCLR игнорируется. Этот бит отсутствует, если SysTick не реализован. | ||
STTNS |
Показывает доступность SysTick небезопасному коду:
Поддержка режимов безопасности. Этот бит имеется только при наличии расширения безопасности и только в случае, если реализован лишь один таймер; в этом случае он доступен лишь из безопасного режима. При наличии двух таймеров или при их отсутствии он всегда считывается как нуль, а запись в него игнорируется. Этот бит появился в ARMv8-M с расширением безопасности и одним SysTick. | ||
ISRPREEMPT |
Показывает, будет ли при выходе из отладочного останова начата обработка ожидающего прерывания:
Состояние этого бита не определено, если процессор не находится в отладочном останове. Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. В версиях ARMv8-M без основного расширения и ARMv6-M этот бит имеется лишь при поддержке отладки. | ||
ISRPENDING |
Показывает, имеется ли ожидающее обработки внешнее прерывание:
Этот бит формируется без учёта состояния бита DHCSR.C_MASKINTS, т. е. показывает лишь наличие запросов прерываний, но не возможность вызова их обработчиков. Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. В версиях ARMv8-M без основного расширения и ARMv6-M этот бит имеется лишь при поддержке отладки. | ||
Зарезервирован | |||
VECTPENDING |
Номер самого приоритетного из ожидающих разрешённых запросов прерываний. Учитывается запрет отдельных запросов их масками или битом DHCSR.C_MASKINTS, но не учитывается общий запрет прерываний битом PRIMASK.PM. Если таковых нет, содержит нуль. Поддержка режимов безопасности. Это поле не имеет отдельных версий для режимов безопасности. Однако, начиная с ARMv8.1-M, оно содержит 1, если из безопасного режима считывается регистр небезопасного режима, а самым приоритетным является запрос прерывания для безопасного режима. Примечание. В ядре Cortex-M1 это поле присутствует лишь в случае, если поддерживаются системные расширения, хотя по документации на архитектуру ARMv6-M оно является обязательным. | ||
RETTOBASE |
При опросе из режима обработчика показывает, имеется ли ещё какое-либо активное прерывание, помимо обрабатываемого в данный момент:
В режиме потока значение этого бита не определено. Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. В версиях ARMv8-M без основного расширения и ARMv6-M этот бит зарезервирован. | ||
Зарезервированы | |||
VECTACTIVE |
Номер прерывания, чей обработчик выполняется в данный момент; 0 для режима потока. Значение этого поля совпадает с битами 8:0 регистра IPSR. Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. В версиях ARMv8-M без основного расширения и ARMv6-M это поле присутствует лишь при поддержке отладки. |
Регистр адреса таблицы векторов прерываний VTOR
Адрес: E000ED08.
Доступ: только чтение или чтение/запись в зависимости от реализации. Начальное значение и количество реализованных разрядов также определяются реализацией. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда
Разряды | Обозначение | Функция |
---|---|---|
TBLOFF | Старшие разряды адреса таблицы векторов | |
Зарезервированы |
В некоторых реализациях один или два старших бита поля TBLOFF могут быть жёстко заведены на 0, что ограничивает выбор положения таблицы векторов в памяти. Чтобы проверить возможности размещения таблицы векторов, программа может записать в регистр VTOR все единицы, а затем считать из него реально записанное значение.
Примечание. В ранних версиях документации писалось, что поле TBLOFF содержит смещение таблицы векторов; отсюда произошли аббревиатуры VTOR и TBLOFF. Позднее вместо некорректного для данного случая термина «смещение» стали применять правильный «адрес», однако обозначения регистра и поля оставили без изменений.
Регистр управления сбросами и прерываниями AIRCR
Адрес: E000ED0C.
Доступ: чтение/запись. При наличии расширения безопасности регистр имеет отдельные версии для каждого из режимов.
Наличие: всегда.
Разряды | Доступ | Обозначение | Функция |
---|---|---|---|
VECTKEYSTAT |
Чтение: в ARMv6-M значение не определено, в остальных версиях – константа FA05. Запись: в ARMv6-M, если при записи в регистр значение этого поля не равно 05FA, последствия будут непредсказуемы; в остальных версиях такая запись будет проигнорирована. Поддержка режимов безопасности. Это поле не имеет отдельных версий для режимов безопасности. | ||
Указывает на принятый в данной реализации порядок следования байтов данных в памяти (за исключением SCS):
Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности. | |||
Управление приоритетами небезопасных прерываний:
Поддержка режимов безопасности. Этот бит не имеет отдельных версий для режимов безопасности и реализован лишь при наличии расширения безопасности. Запись этого бита из небезопасного кода игнорируется, считывание возвращает нуль. Возможность записи в него безопасным кодом определяется реализацией. Этот бит появился в ARMv8-M. | |||
Управление режимом обработки прерываний NMI, HardFault и BusFault:
Если одновременно установлены биты BFHFNMINS и PRIS, последствия будут непредсказуемы. Поддержка режимов безопасности. Этот бит реализован лишь в процессорах с расширением безопасности. Возможность его записи безопасным кодом определяется реализацией; небезопасный код может только считывать его значение. В ARMv8-M, если расширение безопасности отсутствует, этот бит, как утверждает документация, считывается как единица, однако она же утверждает, что тёплым сбросом он обнуляется. Вероятно, это ошибка, и при отсутствии расширения безопасности он всегда равен нулю (что соответствует более ранним версиям архитектуры). Этот бит появился в ARMv8-M. | |||
Зарезервировано. | |||
Это поле управляет группированием приоритетов прерываний. Поддержка режимов безопасности. При наличии расширения безопасности каждый режим имеет свою версию этого поля. В версиях ARMv8-M без основного расширения и ARMv6-M группирование не поддерживается, и эти разряды зарезервированы. | |||
Зарезервировано. | |||
Управление неявным барьером синхронизации ошибок (ESB):
ESB может вставляться при входе и выходе из прерывания и при отложенном сохранении контекста FPU. Кроме того, когда он разрешён, неточные прерывания BusFault будут вызывать повышение приоритета подобно точным отказам, но, поскольку реальное место возникновения такого отказа неизвестно, всё равно в качестве причины прерывания будет указываться неточный отказ. Поддержка режимов безопасности. У этого бита нет отдельных версий для режимов безопасности, однако при наличии расширения безопасности, если бит AIRCR.BFHFNMINS сброшен, небезопасный код будет считывать его как нуль, а запись будет игнорироваться. Этот бит появился в ARMv8-M с поддержкой RAS; возможность его программного изменения и состояние после сброса определяется реализацией. Насчёт состояния этого бита документация противоречива: с одной стороны, прямо говорится, что тёплый сброс его обнуляет, с другой стороны, столь же прямо утверждается, что процессор может быть жёстко сконфигурирован на применение или неприменение ESB, что будет отражаться данным битом при его считывании. | |||
Управление независимым от данных временем выполнения команд (DIT):
Поддержка режимов безопасности. Каждый режим безопасности имеет свой вариант этого бита. Этот бит появился в ARMv8-M с поддержкой DIT. Возможность его программного изменения, а также его состояние после сброса определяется реализацией (в части сброса документация противоречит сама себе, утверждая, что он сбрасывается в нуль, и одновременно утверждая, что он показывает, зависит время выполнения команд от данных или нет). | |||
Разрешение сброса небезопасным кодом:
Поддержка режимов безопасности. Этот бит не имеет версий для разных режимов безопасности и недоступен для небезопасного кода. Этот бит появился в ARMv8-M. | |||
Запрос выполнения тёплого сброса:
Поддержка режимов безопасности. Этот бит не имеет версий для разных режимов безопасности. В процессорах с расширением безопасности небезопасная запись в него игнорируется, если установлен бит AIRCR.SYSRESETREQS. Сброс может быть произведён в любой момент после установки данного бита, но не обязательно немедленно после такой установки. Документация на ARMv6-M указывает данный бит как доступный только для записи, на ARMv8-M — как на доступный для чтения и записи; для ARMv7-M информация не приводится. | |||
Сброс состояния активности прерываний:
Этот бит сбрасывается автоматически. Запись единицы, если процессор не находится в отладочном останове, в ARMv6-M и ARMv7-M приведёт к непредсказуемым результатам; в ARMv8-M она будет проигнорирована. Поддержка режимов безопасности. Этот бит не имеет версий для разных режимов безопасности. В процессорах с расширением безопасности запись в него единицы всегда сбрасывает IPSR; признаки активности небезопасных прерываний сбрасываются только в случае, если сброшен бит DHCSR.S_NSUIDE; признаки активности безопасных прерываний сбрасываются только в случае, если сброшен бит DHCSR.S_SUIDE и установлен бит DHCSR.S_SDE. Примечание. В ядре Cortex-M1 запись 1 в этот разряд приводит к сбросу не только активных, но и ожидающих запросов прерываний NMI и HardFault, хотя документация на архитектуру не упоминает о такой возможности. Кроме того, его установка вызывает сброс состояния блокировки процессора. | |||
Запрос выполнения локального сброса:
Этот бит сбрасывается автоматически. Если при записи 1 процессор не находится в отладочном останове, а также если этот бит устанавливается совместно с битом AIRCR.SYSRESETREQ, результаты будут непредсказуемы. Этот бит имеется лишь в версии ARMv7-M. |
Регистр управления системой SCR
Адрес: E000ED10
Доступ: обычный
Наличие: всегда в ARMv7-M, только при поддержке управления питанием в командах WFI и WFE в ARMv6-M
Разряды | Обозначение | Функция |
---|---|---|
31:5 | Зарезервированы | |
4 | SEVONPEND | Определяет, является ли появление ожидающего запроса прерывания сигналом пробуждения для команды WFE:
|
3 | Зарезервирован | |
2 | SLEEPDEEP | Определяет, в насколько глубокий сон может погружаться процессор при переходе в ожидание:
Поддержка различных видов сна и их конкретный смысл определяются реализацией. Если состояние глубокого сна не поддерживается, запись в этот бит игнорируется, а при считывании всегда возвращается нуль |
1 | SLEEPONEXIT | Определяет, необходимо ли переходить в сон по завершении последнего активного обработчика прерывания:
|
0 | Зарезервирован |
Регистр управления и конфигурации CCR
Адрес: E000ED14
Доступ: обычный в ARMv7-M, только чтение в ARMv6-M
Наличие: всегда
Разряды | Обозначение | Функция |
---|---|---|
31:19 | Зарезервированы | |
18 | BP | Управляет работой предсказателя переходов:
Если предсказатель переходов отсутствует, этот бит всегда будет равен нулю. Если он присутствует и не может быть выключен, этот бит всегда будет равен единице. |
17 | IC | Управляет работой кэша команд:
Перед включением необходимо выполнить инвалидацию кэша, после включения – барьер синхронизации команд. Если кэш команд отсутствует, этот бит всегда будет равен нулю. |
16 | DC | Управляет работой кэша данных и/или общего кэша команд и данных:
Перед включением необходимо выполнить инвалидацию кэша, после включения – барьер синхронизации команд. Кроме того, при выключении надо выполнить очистку кэша, чтобы все изменённые данные были гарантированно записаны в память. Если кэш данных и общий кэш отсутствуют, этот бит всегда будет равен нулю. |
15:10 | Зарезервированы | |
9 | STKALIGN | Определяет, необходимо ли при входе в обработчик прерывания принудительно выравнивать стек на границу двойного слова:
Если процессор имеет и использует FPU, стек всегда выравнивается на границу двойного слова независимо от состояния этого разряда. Конкретная реализация версии ARMv7-M может сделать этот бит неизменяемым; ARM рекомендует в таких случаях использовать принудительное выравнивание на границу двойного слова. Версия ARMv6-M всегда обеспечивает принудительное выравнивание, а этот бит доступен только для чтения, возвращая единицу. |
8 | BFHFNMIGN | Определяет, необходимо ли вырабатывать прерывание при точном отказе во время доступа к данным в обработчике NMI или HardFault:
В версии ARMv6-M этот бит зарезервирован. |
7:5 | Зарезервированы | |
4 | DIV_0_TRP | Управляет возникновением отказа при делении на 0:
В версии ARMv6-M этот бит зарезервирован. |
3 | UNALIGN_TRP | Управляет возникновением отказа при выполнении невыровненного доступа:
В версии ARMv6-M этот бит всегда равен единице. |
2 | Зарезервирован | |
1 | USERSETMPEND | Управляет доступом непривилегированного кода к регистру STIR:
В версии ARMv6-M этот бит зарезервирован. |
0 | NONBASETHRDENA | Управляет возможностью входа процессора в режим потока при приоритете выполнения, отличном от базового:
В версии ARMv6-M этот бит зарезервирован. |
Регистры приоритетов системных обработчиков SHPR1, SHPR2, SHPR3
Адрес: E000ED18, E000ED1C, E000ED20
Доступ: байтами, полусловами, словами в ARMv7-M, только словами в ARMv6-M
Наличие: SHPR1 отсутствует в ARMv6-M, остальные регистры присутствуют всегда
Все три регистра имеют одинаковую структуру и разделены на четыре 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
В версии 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
Разряды | Обозначение | Функция |
---|---|---|
31:16 | UsageFault | Индикаторы активных причин возникновения прерывания UsageFault |
15:8 | BusFault | Индикаторы активных причин возникновения прерывания BusFault |
7:0 | MemManage | Индикаторы активных причин возникновения прерывания MemManage |
Технически регистр CFSR состоит из трёх независимых регистров: MMFSR, BFSR и UFSR.
Регистр состояния прерывания MemManage MMFSR
Адрес: E000ED28
Доступ: байтовый; запись единицы сбрасывает соответствующий бит
Наличие: только ARMv7-M
Разряды | Обозначение | Функция |
---|---|---|
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
Разряды | Обозначение | Функция |
---|---|---|
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
Разряды | Обозначение | Функция |
---|---|---|
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
Разряды | Обозначение | Функция |
---|---|---|
31 | DEBUGEVT | 1 — произошло отладочное событие, обновлено содержимое регистра DFSR |
30 | FORCED | 1 — произошло повышение приоритета синхронного прерывания до HardFault |
29:2 | Зарезервированы | |
1 | VECTTBL | 1 — ошибка при попытке считать содержимое таблицы векторов прерываний |
0 | Зарезервирован |
Регистр адреса отказа памяти MMFAR
Адрес: E000ED34
Доступ: только чтение?
Наличие: только ARMv7-M
Разряды | Обозначение | Функция |
---|---|---|
31:0 | ADDRESS | Адрес, при попытке обращения по которому возникло прерывание MemManage, вызванное обнаруженным MPU нарушением защиты памяти. Если выполнялся невыровненный доступ, в регистре MMFAR будет находиться адрес, реально вызвавший нарушение защиты; он может не совпадать с адресом, использованным в команде |
В документации регистр MMFAR описан как имеющий доступ на чтение и запись, однако логично предположить, что он доступен только на чтение, поскольку он хранит адрес, обращение к которому вызвало прерывание, что устанавливается аппаратно.
Регистр адреса отказа шины BFAR
Адрес: E000ED38
Доступ: только чтение?
Наличие: только ARMv7-M
Разряды | Обозначение | Функция |
---|---|---|
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
Каждое из реализованных двухбитовых полей этого регистра определяет возможность использования сопроцессора с соответствующим номером. Возможные значения поля управления доступом:
- 00 — доступ запрещён;
- 01 — разрешён доступ только привилегированному коду;
- 10 — зарезервировано;
- 11 — разрешён полный доступ.
Сопроцессоры CP0–CP7 определяются реализацией. Сопроцессоры CP8–CP15 зарезервированы компанией ARM; в архитектуре ARMv6-M они всегда отсутствуют, а в архитектуре ARMv7-M может иметься FPU, функционал которого реализуют сопроцессоры CP10 и CP11. Когда он реализован и используется, поля управления доступом к CP10 и CP11 должны содержать одинаковые значения.