Команда Cortex-m0 pop не работает при выполнении в векторной области?

Есть ли какая-то официальная причина, по которой эта инструкция не сработает при выполнении из векторной области (то есть ниже адреса 0xC0) на Cortex-M0, но работает правильно в более высокой FLASH?

pop {r4,pc}

Когда этот код выполняется с адреса ниже 0xC0, ПК фактически не извлекается из стека, и выполнение продолжается со следующей инструкции после «pop» (что является мусором).


person Andrew Sterian    schedule 04.09.2018    source источник
comment
какой адрес вставлен в счетчик программы?   -  person old_timer    schedule 05.09.2018
comment
Выровнен ли указатель стека и указывает на то, что нужно?   -  person old_timer    schedule 05.09.2018
comment
приведите минимальный пример, демонстрирующий проблему.   -  person old_timer    schedule 05.09.2018
comment
после чего идет инструкция и как узнать, что она выполняется?   -  person old_timer    schedule 05.09.2018
comment
1. В счетчик не вставляется адрес, адрес следующей инструкции загружается, как если бы инструкции никогда не было. 2. Указатель стека выровнен и правильно. Команда pop - это всего лишь несколько инструкций после нажатия с небольшим количеством MOV / CMP / BNE между ними. 3. Работаем по минимальному примеру. 4. Следующая инструкция - это NOP, я могу пройти через код с помощью отладчика и наблюдать, как POP успешно выполняется по адресу ›256 и терпит неудачу по адресу‹ 256.   -  person Andrew Sterian    schedule 05.09.2018
comment
Если вы можете пройти через это, вы уже должны увидеть ответ. Но буду ждать примера.   -  person old_timer    schedule 05.09.2018
comment
А пока не могли бы вы показать нам машинный код для инструкции до и после этого?   -  person old_timer    schedule 05.09.2018
comment
В адресном пространстве ниже 0xC0 нет ничего особенного.   -  person old_timer    schedule 05.09.2018


Ответы (2)


Похоже, вы пытаетесь вернуться из обработчика исключений или изменить счетчик программы из обработчика исключений. Инструкция pop, которая загружает значение в компьютер, или инструкция bx заставит процессор вернуться из исключения, однако он не вернется на адрес, который вы вставляете в компьютер, вместо этого он раскрутит стек и вернется к место, которое было выдвинуто во время записи исключения. Это подробно описано в M0. Руководство пользователя - ввод и возврат исключения.

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

person Colin    schedule 05.09.2018
comment
Спасибо, но я не пытался этого сделать. Буквально кодовая последовательность была: PUSH {R4, LR} ... POP {R4, PC} - person Andrew Sterian; 05.09.2018

Проблема решена ... это проблема конкретного производителя. Пространство FLASH для этой SoC по адресам ‹256 является защищенным и« виртуальным »- оно функционирует как векторы исключений, но не функционирует нормально (по замыслу) для выполнения кода или для общего FLASH-хранилища.

Спасибо всем за помощь.

person Andrew Sterian    schedule 05.09.2018
comment
укажите номер детали, чтобы мы знали, что эти детали особенные. - person old_timer; 05.09.2018
comment
Я использовал некоторые детали Cortex-M основных производителей и никогда не видел, чтобы у всех моих программ были обработчики. это очень любопытно - person old_timer; 05.09.2018