2009-09-02 59 views
1

運行嵌入式系統,無協處理器,無MMU,Atmel 9263時出現未定義指令錯誤。嵌入式系統的內存範圍爲0x20000000 - 0x23FFFFFF。我已經有兩個起這樣的:ARM未定義指令錯誤

  1. SP 0x0030B840,LR 2000AE78 - 在有效的代碼LR點,所以我不知道是什麼原因導致的異常,雖然SP是僞造的。我應該看看還有哪些其他地址,寄存器,內存位置?

  2. SP 0x20D384A8,LR 0x1FFCA59C - SP正常,LR是假的。我能做些什麼來驗證LR是如何被粉碎的?看起來它從地址空間的末端向後滾動,但我無法弄清楚。

現在我只是模擬更換大塊的代碼並運行測試阿恩,試圖找出問題 - 問題是有時需要4個小時,顯示的問題。

任何提示將不勝感激,謝謝!

芯片是AT91SAM9263,我們正在使用IAR EWARM工具鏈。我很確定它是直的ARM,但我會檢查。

EDIT

的未定義指令的另一個例子 - 此時SP/LR看起來很好。 LR = 0x2000b0c4,當我拆卸附近有:

2000b0bc e5922000 LDR R2,[R2,#+ 0]
2000b0c0 e12fff32 BLX R2
2000b0c4 e1b00004 MOVS R0,R4

因爲LR是指令遵循Undef異常 - BLX如何被識別爲未定義?請注意,CPSR是0x00000013,所以這是所有ARM模式。然而,R2是0x226d2a08,它在堆區,我認爲是不正確的 - 拆分有ANDEQ R0,R0,R12,指令是0x0000000C,其他指令看起來像數據給我。所以我認爲不好的R2是問題,我只是想了解爲什麼Undef在BLX上?

謝謝!

+1

1.)您能否給我們提供整個評估套件/ SoC的名稱? 你說的9263,所以我認爲Atmel AT91SAM9263。 2.)你有沒有針對正確的指令集版本? 如果是上述芯片組,則將ARM9作爲拱門系列 和ARMv5作爲指令集版本。在調用arm-gcc時將這些設置爲 -mcpu =和-march =。 3.)你使用ARM和Thumb還是ARM? – 2009-09-02 16:03:40

+0

你可以發佈一些數據/說明,包括r14地址(有問題的說明)。 – 2009-09-03 13:33:52

+0

謝謝 - 請參閱我的最新編輯 – Jeff 2009-09-03 14:49:33

回答

1

檢查CPSR中的T位。如果您無意中從ARM模式切換到Thumb模式(反之亦然),則會發生未定義的指令。

只要SP或LR被損壞,就可能是您執行了一些錯誤模式的指令,在觸發未定義的指令之前就會破壞它們。

編輯

應對新的錯誤情況下,問題的編輯:

LR包含從BLX R2返回地址,所以之後的是有道理的,它指向一個指令BLX。

如果R2在執行BLX R2時指向堆,那麼您將跳入堆並開始執行數據,就好像它們是指令一樣。這將在短時間內導致未定義的指令異常...

如果您想查看未定義的確切指令,請查看R14_und寄存器(在您處於未定義指令處理程序時定義的) - 它包含未定義指令之後的下一條指令的地址。

根本原因是R2中的錯誤值。假設這是C代碼,我的猜測是一個糟糕的指針取消引用,但我需要確認源代碼。

+0

CPSR = 0x00000013這意味着ARM模式,對吧? – Jeff 2009-09-03 14:34:12

+0

是的,第5位是T位,0代表ARM。 – Brent 2009-09-03 22:05:41

1

這是一個未定義的指令或數據中止,因爲您正在讀取未對齊的地址?

編輯:

在未定義例外CPSR [4:0]應該0b11011或0x1B不0×13,0×13是根據臂臂復位。