簡體   English   中英

如何使用簡單的指令或指令獲取硬故障異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM