Я пытаюсь получить обратный адрес обработчика IRQ в моем коде. Моя цель - сохранить значение ПК до того, как таймер сторожевого таймера истечет и до сброса для целей отладки, используя WDT_IRQHandler(). Я также проверяю этот подход с другими IRQ, чтобы проверить, понял ли я эту идею. Но, похоже, я этого не делал.Получение адреса возврата исключения в ARM Cortex M0
Я ознакомился с documentation. Я понял, что когда происходит исключение, в стек помещается 8 регистров: R0, R1, R2, R3, R12, LR, PC и XPSR.
Я также прочитал, что стек автоматически выравнивается по двойному слову. Поэтому, на мой взгляд, получение обратного адреса так же просто:
- получить адрес sp с помощью __builtin_frame_address (0);
- добавьте к нему смещение уложенного ПК (0x18) и прочитайте значение, которое предположительно является значением, которое будет восстановлено на ПК при возврате обработчика.
Проверка с прикрепленным отладчиком, похоже, это не так, содержимое на этом адресе памяти не всегда указывает на область флэш-памяти или даже на допустимую область, и в любом случае это никогда не значение что ПК будет принимать после инструкции POP.
Код работает нормально, поэтому я думаю, что это проблема, которую я имею в понимании того, как это работает.
Если я проверить разборки, в некотором IRQs постоянный добавляются к зру до расчековки (?)
00001924: 0x000009b0 ...TE_IRQHandler+280 add sp, #36 ; 0x24
00001926: 0x0000f0bd ...TE_IRQHandler+282 pop {r4, r5, r6, r7, pc}
В другом IRQs это не происходит.
Я понимаю, что может случиться, что в стек попадают больше регистров, поэтому как я могу быть уверен в том, какое смещение для извлечения ПК?
Если я проверяю дамп памяти вокруг SP, когда код по-прежнему находится в обработчике IRQ, я могу определить адрес возврата, но он всегда находится в странном месте с отрицательным смещением по сравнению с SP. Я не могу понять, как получить правильный адрес.
Спасибо. для точки 1) Я предположил, что могу проверить как MSP, так и PSP из C с помощью __get_MSP() и __get_PSP(). для 2) Я понимаю, что после нажатия код может добавить локальные переменные в стек, и они известны во время компиляции, поэтому я не могу полагаться на фиксированное смещение. Я попробую ваш подход. – Vitomakes
@Vitomakes Проверка 'MSP' и' PSP' с C не говорит вам, какой из них правильный. Конечно, если вы используете только «MSP» (очень часто), вы можете пропустить чек. –
«ITE» и «MRSEQ/MRSNE» не поддерживаются корой M0, и компилятор жалуется на то, что находится в режиме большого пальца и не может использовать TST. Но у меня есть идея, я разобраю ее – Vitomakes