Прерванная загрузка-несколько / Store-Multiple в CortexM - PullRequest
0 голосов
/ 22 октября 2018

Я сталкиваюсь с проблемой, связанной с возвратом от прерывания, когда 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]:

  1. Не поддерживаются.Это означает, что инструкции LDM и STM не прерываются.ARMv7-M зарезервирован.
  2. Команды LDM и STM перезапускаются.
  3. Инструкции LDM и STM являются продолжаемыми.

Мое оборудование реализовано с опцией 3.

Что я не могу понять, так это то, что если я заставлю поле ICI IPSR равным 0, будет ли перезапущена моя инструкция LDM / STM или я все равно получу исключение?

И даже если оно получитперезапущенный (с учетом прерванной инструкции STM) он выдвинет поверх уже частично выдвинутых регистров, в конечном итоге повредив стек в этом случае, или отрегулирует указатель стека перед возобновлением операции.

1 Ответ

0 голосов
/ 22 октября 2018

Поле ICI / IT является частью EPSR, а не IPSR, не то, чтобы оно имело огромное значение, если вы взаимодействуете с xPSR.

Если команда STM или LDM прервана, EPSRустановить, чтобы указать точку, с которой может быть продолжено выполнение, и затем запись исключения инициируется.Поэтому именно значение PSR в стеке содержит эту информацию, так же как оно содержит бит Thumb из прерванного кода.Если ваш новый контекст имеет ноль в битах ISI стекового PSR, вы не должны видеть исключение ошибки использования по указанным вами причинам.(В отсутствие какого-либо кода я не могу быть более конкретным, чем этот.)

Если LDM и STM реализованы как перезапускаемые или продолжаемые, то нет, стек не будет поврежден этим процессом.(Это было бы кошмаром!) Если LDM и STM перезапускаются, тогда указатель стека просто сбрасывается до значения, которое он имел в начале LDM / STM, и инструкция выполняется заново;если они являются продолжаемыми, то указатель стека не изменяется, но для выполнения инструкции выполняется частичный STM / LDM.

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

...