Cortex-M3: изменение адреса возврата прерывания - PullRequest
2 голосов
/ 02 марта 2012

Мне нужно отредактировать обратный адрес ISR.ISR должен вернуться к определенному адресу после обработки прерывания, независимо от того, откуда оно пришло.Это облегчает быстрый сброс системы.Эта функция не может быть реализована в обычной прошивке, так как время слишком мало, чтобы где-то часто проверять флаг.

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

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

Идеи?Мне действительно нужно, чтобы прерывание возвращалось к одному и тому же ярлыку, независимо от того, где оно прерывается, и без суеты в ядре.

Спасибо, Стюарт

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Слово предупреждения : этот проект был написан на ассемблере с лотом предположений. Этот процесс, вероятно, небезопасен в C или сборке, где вы точно не знаете, в каком состоянии будет процессор, когда попадет прерывание.

Поработав некоторое время с кадром стека, я понял, что в сохраненном регистре состояния (xPSR) установлены некоторые биты, которые я не видел во время работы. Оказывается, что прерывание иногда срабатывало в середине команды LDM или STM. Cortex-M3 имеет функцию для сохранения состояния этих команд, чтобы они могли быть возобновлены должным образом. Проблема возникла, когда он возвращался из прерывания в указанное мной место, ожидая завершения команды LDM / STM, но не смог.

Чтобы решить эту проблему, мне просто нужно было очистить биты ICI в сохраненном регистре состояния в кадре стека. Это заставило Cortex-M3 «забыть», что он обрабатывал команду LDM / STM, и позволило процессору без каких-либо последствий вернуться в произвольное место.

2 голосов
/ 02 марта 2012

Сброс можно сделать, установив SYSRESETREQ (бит 2) в регистре управления прерываниями и сбросом приложения (addess 0xE000ED0C).

В C я написал:

// Reset by setting SYSRESETREQ
SCB->AIRCR = 0x05FA0004;

Thisвероятно, сброс будет намного чище, чем при использовании другого метода.

Более подробную информацию можно найти в Техническом справочном руководстве Cortex M3 от ARM.

...