我正試圖在我的代碼中檢索IRQ處理程序的返回地址。 我的目標是使用WDT_IRQHandler(),在看門狗定時器到期之前以及用於調試目的的復位之前保存PC的值。我也正在用其他IRQ測試這種方法,以檢查我是否掌握了這個想法。 但似乎我沒有。檢索ARM Cortex M0上的異常的返回地址
我已閱讀documentation可用。 我明白,當發生異常時,8個寄存器被推送到堆棧: R0,R1,R2,R3,R12,LR,PC和XPSR。
我也讀過堆棧自動雙字對齊。所以在我看來,檢索返回地址就像:
- 使用__builtin_frame_address(0)檢索sp地址;
- 增加了堆棧PC(0x18)的偏移量,並讀取值,這應該是處理程序返回時將恢復到PC的值。
使用附加的調試器進行檢查,情況似乎並非如此,該內存地址的內容並不總是指向閃存區域,甚至不指向有效區域,並且在任何情況下它都不是該值PC將在POP指令之後承擔。
該代碼工作正常,所以我認爲這是我瞭解它如何工作的問題。
如果我檢查拆卸,在一些的IRQ常數彈出(?)之前加入到SP
00001924: 0x000009b0 ...TE_IRQHandler+280 add sp, #36 ; 0x24
00001926: 0x0000f0bd ...TE_IRQHandler+282 pop {r4, r5, r6, r7, pc}
在其他的IRQ不會發生這種情況。
據我所知,可能會發生更多寄存器被推入堆棧,所以我如何確定在哪個偏移量來檢索PC?
如果我在代碼仍然在IRQ處理程序中時檢查SP周圍的內存轉儲,我可以發現返回地址,但它總是位於一個奇怪的位置,與SP相比具有負偏移量。我無法理解如何獲得正確的地址。
謝謝。對於點1)我想我可以使用__get_MSP()和__get_PSP()從C中檢查MSP和PSP。對於2)我知道推後代碼可以將本地變量添加到堆棧,並且這些在編譯時已知,所以我不能依賴於固定的偏移量。 我會嘗試你的方法。 – Vitomakes
@Vitomakes從C中檢查'MSP'和'PSP'並不能告訴你哪一個是正確的。當然,如果你只使用'MSP'(非常常見),那麼你可以跳過檢查。 –
cortex M0不支持「ITE」和「MRSEQ/MRSNE」,並且編譯器抱怨處於拇指模式並且無法使用TST。但我明白了,我會把它整理出來 – Vitomakes