Почему адрес функции NMI, сохраненный в векторном адресе NMI, заканчивается битом 1 в коре ARM? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть ядерная плата STM32-F49ZI, представляющая собой ARM Cortex 4 - 32-битный MCU.У меня есть свой собственный обработчик NMI, т.е. функция NMI_Handler, адрес которой заканчивается битом 0. Я вижу это в отладчике.Однако векторный адрес обработчика NMI хранит тот же адрес функции NMI_Handler, за исключением того, что бит заканчивается на 1. Мой вопрос, почему существует расхождение.Я узнал, что это потому, что ARM Cortex M поддерживает только инструкции Thumb, т.е. только 16-битные инструкции.Я не могу понять это рассуждение.В чем причина этого?Почему он устанавливает последний бит равным 1.

void NMI_Handler()
{

}

В окне сторожевого таймера отображается

NMI_Handler address - 0x8010 1000

Однако адрес, сохраненный в векторном адресе NMI, равен -

0x8010 1001.

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Хотя Cortex-M4 только поддерживает набор команд THUMB2, для двоичной совместимости по всем текущим частям ARM он использует LSB всех адресов векторов, ветвей и переходов для указания режима THUMB для поддержкиARM / THUMB взаимодействие.Он указывает процессору, что код, к которому нужно перейти, - это код THUMB.Для процессоров, которые поддерживают наборы команд ARM и THUMB, он вызывает переключение режимов набора команд, если текущий режим не THUMB.

Ваша функция обработчика NMI_Handler будет расположена по четному адресу, как указано в вашей карте ссылок, но для вектора будет установлен LSB.Когда счетчик программ загружается с адреса вектора или ветви, LSB устанавливается на ноль.

См. Поле «Примечание» в разделе технических справочных материалов Cortex M4 3.9.1 Обработка исключенийи расстановка приоритетов

1 голос
/ 30 мая 2019

ARM-архитектура адреса нечетна, тогда набор команд равен THUMB, если даже тогда это набор команд ARM.

Так что это должно быть странно

...