我遇到硬故障,出現在看似隨機的時間,其中指針指向地址A5或FF(我允許的內存空間很遠低於80000000及以上)。它似乎總是與這兩個值相同的指針。使用freeRTOS在stm32上隨機分配神祕值(A5A5A5A5和FFFFFFFF)的指針使用freeRTOS導致硬故障
我正在使用運行STM32F205RE處理器的嵌入式系統,該處理器與發生此錯誤的fm/bluetooth/gps芯片(稱爲cg2900)進行通信。
使用調試器我可以看到指針分別在幾個testruns期間指向地址A5和FF。然而,它似乎隨機發生,有時我可以運行測試一小時而不失敗,而其他時間崩潰20秒。
我運行freeRTOS作爲調度程序以在不同任務之間切換(一個用於無線電,一個用於藍牙,一個用於其他定期維護),這可能會以某種方式干擾。
這可能是什麼原因?當它運行定製硬件時,不能排除它是一個硬件問題(可能)。任何指針(沒有雙關語意)如何處理調試問題?
編輯:
經過進一步調查,它似乎是很隨意的地方它崩潰,而不僅僅是特定的指針。我用了一個hardfault處理程序來獲取這些寄存器的值選擇(十六進制的值):飛機墜毀前
半長遠來看(分鐘):
R0 = 1
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 10000
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
崩潰(秒)前極短的運行:
R0 = 40026088
R1 = fffffff1
R2 = cb3
R3 = 1
R12 = 34d
LR [R14] = 40026088 subroutine call return address
PC [R15] = a5a5a5a5 program counter
PSR = fffffffd
BFAR = e000ed38
CFSR = 100
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
另一個短一(秒):
R0 = 0
R1 = fffffffd
R2 = 20000400
R3 = 20007f7c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = e000ed38
CFSR = 1
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
非常長的運行(1小時+)後:
R0 = e80000d0
R1 = fffffffd
R2 = 20000400
R3 = 2000877c
R12 = 7
LR [R14] = 200000c8 subroutine call return address
PC [R15] = 1010101 program counter
PSR = 8013d0f
BFAR = 200400d4
CFSR = 8200
HFSR = 40000000
DFSR = 0
AFSR = 0
SCB_SHCSR = 0
似乎在同一點崩潰的大部分時間。我根據以前的建議調整了內存,但我似乎仍然有同樣的問題。
謝謝你的時間!
親切的問候
這些看起來像故障安全魔術字節。你確定你沒有一個懸空的指針,一個取消引用的NULL或返回的本地數組? – 2012-12-29 09:15:24
@ H2CO3是的,他們確實看起來像魔術字節。指針指向數組的基數(全局作用域),並且我已經有了一個檢查條件,以確保我不會在其外寫入數據。指針本身一旦被初始化爲數組的基礎就決不會被賦值。 – ChewToy
如果你可以添加一些實際的代碼,這將有所幫助。 – 2012-12-29 10:25:21