ФЭНДОМ


Сброс в M-профиле рассматривается как особый вид прерывания, имеющего высший приоритет, численно равный –3 в версиях ARMv6-M и ARMv7-M либо –4 в версии ARMv8-M, и номер вектора 1.

В 6-й и 7-й версиях профиля документация различает два вида сброса:

  • сброс при включении питания (power-on reset), устанавливающий в исходное состояние всю аппаратуру;
  • локальный сброс (local reset), сбрасывающий в исходное состояние собственно процессорное ядро и большую часть регистров пространства управления системы, но не затрагивающий аппаратуру, связанную с отладкой, где это возможно.

В версии ARMv8-M эти два вида сбросов переименованы соответственно в холодный (cold) и тёплый (warm).

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

Сразу после сброса:

  • если в процессоре реализовано расширение безопасности, он находится в безопасном состоянии; в процессорах без такого расширения (в том числе в любых процессорах архитектур ARMv6-M и ARMv7-M) – формально (с точки зрения документации на архитектуру ARMv8-M) в небезопасном состоянии. Формальность в этом случае связана с тем, что безопасный режим у таких процессоров отсутствует в принципе;
  • процессор находится в режиме потока;
  • регистр CONTROL содержит 0 (установлен привилегированный режим, выбран основной стек, команды FPU ещё не выполнялись). При наличии расширения безопасности обнуляются регистры CONTROL обоих режимов (безопасного и небезопасного);
  • регистры границ основного стека MSPLIM и стека процесса PSPLIM равны нулю (только ARMv8-M). Если имеется рашсирение безопасности, обнуляются регистры границ для обоих режимов безопасности;
  • большинство регистров общего назначения, кроме LR, PC и MSP, а также регистр APSR имеют непредсказуемые значения;
  • в ARMv7-M и в ARMv8-M с основным расширением регистр LR содержит FFFFFFFF (недопустимый код EXC_RETURN; см. описание входа и возврата из обработчиков прерываний); в ARMv6-M и ARMv8-M без основного расширения состояние LR не определено;
  • регистр MSP содержит адрес вершины основного стека, считанный из нулевого слова таблицы векторов прерываний (её адрес находится в регистре VTOR и не меняется при сбросе). При наличии расширения безопасности загрузка производится из таблицы векторов безопасного режима в MSP безопасного режима, при этом содержимое MSP небезопасного режима не определено;
  • регистр PC содержит адрес точки входа в обработчик сброса, считанный из первого слова таблицы векторов;
  • регистры состояния IPSR, EPSR, PRIMASK, FAULTMASK и BASEPRI (в ARMv6-M и ARMv8-M без основного расширения два последних регистра отсутстуют) содержат нули, за исключением бита T регистра EPSR, который равен младшему биту первого слова таблицы векторов и задаёт используемую обработчиком сброса систему команд. Если он не равен 1, сразу после сброса возникнет прерывание UsageFault (HardFault для ARMv6-M и ARMv8-M без основного расширения). В версии ARMv8-M с расширением безопасности обнуляются регистры PRIMASK, FAULTMASK и BASEPRI обоих режимов безопасности;
  • регистры пространства управления системой (SCS) установлены в их исходные значения;
  • если имеется FPU, то:
  • поля CP10 и CP11 регистра CPACR равны нулю, чем запрещается использование FPU;
  • в регистре FPCCR установлены биты ASPEN и LSPEN и сброшен бит LSPACT (если будут использоваться команды FPU, разрешается автоматическое отложенное сохранение его контекста; отложенного запроса на сохранение контекста нет); другие его разряды не изменяются. При наличии расширения безопасности бит ASPEN устанавливается, а LSPACT сбрасывается в регистрах FPCCR для обоих режимов безопасности; кроме того, сбрасывается бит LSPENS (разрешено изменение бита LSPEN из обоих режимов безопасности);
  • регистр FPDSCR содержит 0. При наличии расширения безопасности обнуляются регистры FPDSCR обоих режимов безопасности;
  • состояние остальных регистров FPU непредсказуемо;
  • все признаки активных прерываний и все запросы пробуждения для команды WFE сброшены;
  • локальный монитор синхронизации, используемый командами типа LDREX и STREX, сброшен.

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

Установка бита SYSRESETREQ регистра AIRCR вызывает локальный (тёплый) сброс посредством внешнего по отношению к собственно процессору электронного компонента. Какое другое оборудование будет сброшено вместе с процессором, определяется реализацией. Точный момент начала выполнения сброса не определён, поэтому для того, чтобы сброс гарантированно произошёл до выполнения каких-либо иных действий, после записи в регистр AIRCR необходимо выполнить команду DSB и зациклить процессор.

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

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