2017-02-09 14 views
0

Я использую Crossworks в качестве платформы разработки.ARM M0 + указатель стека исключений после перегрузки загрузчика

Я не думаю, что я это сделал, но загрузчик, который я написал, помещал «основной» стек в низкую память. Позже вовремя (после обновления Crossworks) - я написал код приложения, и компоновщик разместил стек в высокой памяти.

После 3 дней отладки я обнаружил свою причину повреждения памяти в своем приложении.

Приложение использует указатель стека, определенный при сбросе (перемещенный адрес нуль - 0x4000), который был высокой памятью, но код прерывания использовал указатель стека из загрузчика (низкую память), который искажал мои данные там.

Вопрос: В литературе ARM говорится (я не использую стек процесса) - что обработчики приложений и исключений используют «основной» стек. Загрузочный загрузчик загружает SP из первого слова и переходит к адресу, содержащемуся во втором слове. Код запуска затем снова устанавливает указатель стека. Таким образом, если код запуска устанавливает указатель стека («основной» стек), а THAT - это стек, который использует приложение, HOW является обработчиком исключения, все еще использующим указатель стека из загрузчика?

Учитывая, что у меня есть загрузчик с использованием стека в низкой памяти и приложение с использованием стека в высокой памяти - как я могу получить исключение приложения, использовать тот же указатель стека, который в настоящее время считается «основным» стеком?

У меня есть продукт в поле, поэтому мне нужно исправить указатель стека исключений приложения, а не просто создать новый загрузчик, который использует стек высокой памяти.

Надеюсь, я объяснил это яснее, чем грязь.

+0

Я проверяю свой загрузчик - я использовал как «основной» стек, так и стек процесса, так что это может быть частью моей проблемы. - В приложении - я использую только «основной» стек. – JHinkle

ответ

0

Загрузочный загрузчик использовал стек процесса, так что контрольный регистр имел бит 1.

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