2009-08-29 22 views
3

我調試使用的IAR工作臺工具鏈的嵌入式系統的一些奇怪的ARM例外。有時候,當一個異常被捕獲時,SVC_STACK被報告超出範圍(超出範圍!)這是相關的,還是僅僅是J-Link JTAG調試器的工件?什麼是SVC_STACK用於?它被設置爲0x1000的大小,但是當它超出範圍時,它在我們的堆區域中是正確的。謝謝!輸入ARM9 SVC_STACK超出範圍?

回答

4

ARM的SVC模式發生異常時(未IRQ或FIQ - 快速IRQ)。它也可以通過設置CPRS寄存器在非用戶模式下執行的代碼直接輸入,但我認爲除了初始化系統時這種情況並不常見。

當異常發生時,處理器切換到SVC堆棧,它必須被設置在系統的初始化非常早。我猜你的初始化代碼沒有正確設置SVC堆棧,或者有可能是其中一個異常處理程序編碼不正確,並且正在摧毀堆棧。

第三種可能性是,您使用的是建立ARM棧它希望的方式(基本上覆蓋了IAR的初始化代碼可能設立SVC堆棧)的RTOS。如果是這樣的話,它可能是一切正常,但IAR調試認爲SVC堆棧超出範圍 - 調試器會得到鏈接器配置文件中的信息 - 但如果東西堆更改爲內存的另一個領域,那麼調試器會感到困惑。

使用RTOS時,IAR中的用戶模式堆棧始終發生在我身上 - 堆棧是基於任務控制塊進行分配的,調試器認爲它不在CSTACK段中,調試器會發出刺激性警告。有一些項目配置設置可以用來消除警告,但我不記得我的頭頂是什麼 - 我們很少對它感到困擾,只是隨着噪音而生活。

你需要驗證棧'堆在堆'的區域是有效的 - 如果你沒有明確的代碼,這很可能是錯誤的(或者你可能會需要詢問你的RTOS供應商)。

ARM Architecture Reference Manual(ARM ARM)可從arm.com免費獲得,並詳細瞭解ARM堆棧的工作原理。另一個很好的參考是Andrew Sloss等人的ARM System Developer's Guide

+0

謝謝 - 正確的金錢。從IAR - 「EWARM 4.42版的堆棧插件不支持RTOS,所以它總是會抱怨堆棧溢出,如果你使用的是RTOS,你應該禁用堆棧插件。該死 - 我希望是那樣 - 更多的調試! – Jeff 2009-08-31 20:08:06