Я сталкиваюсь с проблемой, связанной с возвратом от прерывания, когда IRQ прервал множественную инструкцию загрузки / сохранения.
Когда IRQ прерывает множественную инструкцию загрузки / сохранения, поле ICI EPSR указывает, чтоинструкция LDM / STM должна быть продолжена после возврата из прерывания.
В кадре исключения входа прерывания (содержащем сохраненный контекст вызывающего абонента) аппаратно сохраняется в текущем стеке.
В моемВ этом случае Kernel Software сохраняет сохраненный контекст Callee и подготавливает новый контекст, который включает в себя фиктивный фрейм исключений в стеке.После подготовки нового контекста выполняется инструкция BX LR, которая выводит фиктивный кадр исключения.Поскольку фиктивный фрейм исключений содержит адрес возврата (адрес возврата указывает на новый обработчик прерываний), выполнение переходит к новому обработчику прерываний.
В этом случае, если прерванная инструкция была инструкцией LDM / STM, я получаюисключение USAGE-FAULT с INVSTATE, потому что аппаратное обеспечение при возврате из прерывания ожидает соответствующую инструкцию LDM / STM, в то время как в моем случае адрес возврата находится в другом месте.
В Справочном руководстве по архитектуре ARM упоминаетсятри варианта проектирования, которые могут быть реализованы для CortexM.
В регистре атрибутов набора инструкций 2 (ID_ISAR2), биты [11: 8]:
- Не поддерживаются.Это означает, что инструкции LDM и STM не прерываются.ARMv7-M зарезервирован.
- Команды LDM и STM перезапускаются.
- Инструкции LDM и STM являются продолжаемыми.
Мое оборудование реализовано с опцией 3.
Что я не могу понять, так это то, что если я заставлю поле ICI IPSR равным 0, будет ли перезапущена моя инструкция LDM / STM или я все равно получу исключение?
И даже если оно получитперезапущенный (с учетом прерванной инструкции STM) он выдвинет поверх уже частично выдвинутых регистров, в конечном итоге повредив стек в этом случае, или отрегулирует указатель стека перед возобновлением операции.