2012-03-01 4 views
2

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

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

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

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

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

+0

Вы пишете ISR? –

+1

Можете ли вы просто перейти к вектору сброса, а не возвращаться из ISR? Должна быть возможность написать функцию, которая возвращает большую часть состояния процессора к чему-то, напоминающему состояние при сбросе, а затем перескакивает. – RBerteig

+0

Я написал ISR. Я не хочу полностью переустанавливать эту часть, так как существует достаточная сумма инициализации коммитов, которую нельзя переделать. Я могу перейти от прерывания к нужному коду, но тогда прерывание обрабатывается навсегда и больше никогда не будет запущено. – Vatsu1

ответ

4

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

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

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

2

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

В C, я писал:

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

Это, вероятно, будет намного чище сброса, чем другой метод, который вы пытаетесь.

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

+0

Метод запроса системного сброса выглядит более чисто, чем редактирование адреса возврата прерывания, но я не уверен, какие эффекты, запрашивающие сброс системы, будут иметь в этом чипе. Существует множество аналоговых и цифровых периферийных устройств, окружающих CM3, и код запуска, который чип выполняет для выполнения этих функций (что я действительно не хочу связывать) может занять слишком много времени. – Vatsu1