![](/img/trans.png)
[英]simple struct dereference trigger ARM hard_fault hardware exception
[英]How to get a hard fault exception with a simple or instruction on arm
目前我們正在尋找一個幻象,它的形式是當我們在某些代碼中編譯(不調用它)時,對 memset 的一個特定調用會生成一個硬故障異常。
給 memset 的地址和長度是有效的。 在單指令模式下單步執行它表明它總是在 OR 指令處失敗。 但是處理器決定調用 0xfffffff9,而不是計算該值,然后跳轉到硬故障處理程序,原因是一條未知指令。
memset 發生的地方的反匯編:
0x80192f0 <+0x0020> 03 2c cmp r4, #3
0x80192f2 <+0x0022> 2e d9 bls.n 0x8019352 <memset+130>
0x80192f4 <+0x0024> cd b2 uxtb r5, r1
# The following line crashes
0x80192f6 <+0x0026> 45 ea 05 25 orr.w r5, r5, r5, lsl #8
0x80192fa <+0x002a> 0f 2c cmp r4, #15
0x80192fc <+0x002c> 45 ea 05 45 orr.w r5, r5, r5, lsl #16
0xffffff9 的反匯編:
0xfffffff7 00 00 movs r0, r0
0xfffffff9 00 00 movs r0, r0
0xfffffffb 00 00 movs r0, r0
我們在哪里可以找到這個異常的來源?
我們在 STM32F429II(Cortex-M4)上運行該軟件。
請記住,對於 Cortex-M,鏈接寄存器值指示如何從異常中返回,而不是要返回的地址。 相關地址將在堆棧上(假設堆棧也沒有失敗)。
0xFFFFFFF1 返回處理程序模式。
異常返回從主堆棧中獲取狀態。 返回后執行使用MSP。
0xFFFFFFF9 返回線程模式。
異常返回從主堆棧中獲取狀態。 返回后執行使用MSP。
0xFFFFFFFD 返回線程模式。
異常返回從進程堆棧中獲取狀態。 返回后執行使用PSP。
Cortex-M 也永遠無法從“本地外設”內存空間執行代碼。
@魯迪! 我希望你已經解決了這個問題。 我剛剛遇到了同樣的問題,想分享我的經驗。
MCU 從orr.w指令變為 HardFault 的事實並不意味着您的問題出在指令本身。 我使用 HFSR 寄存器(由@starblue 提到)來查找它發生變化的時刻。 如果您使用 Eclipse - 只需添加內存觀察點或
(uint32_t)*((uint32_t *) 0xE000ED2C)
到表達式並找到值變得不等於零的那一行。
在我的情況下,它與空指針值分配一致。 在跳轉到 Hardfault 處理程序之前是 15 條裝配線。 在您的情況下,它甚至可能在其他線程中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.