2014-10-02 126 views
4

我想監視C嵌入式ARM MCU上的堆棧指針。隨着項目的發展,我想知道剩下多少空間,並且如果需要的話可以繪製更多地圖。ARM彙編 - 監視器堆棧指針

我已經知道編譯時生成的映射文件的堆棧的起始地址和頂端地址。

我想獲得sp所指向的地址,所以我可以做一些基本的數學計算,並以百分比爲基礎監視堆棧,但我是ARM新手,不明白爲什麼我的程序集不工作。

這是我在做什麼:

int stackptr; 
asm 
{     
    LDR r0, =stackptr // put address of C variable stackptr in r0 
    MOV r1, sp   // move value of sp to r1 
    STR r1, [r0]  // put value of r1 in address contained in r0 (stackptr) 
} 

// math using stackptr... 

如果我看到存儲在stackptr地址,其在堆棧的一開始就和它不改變(我打電話這個每100ms)。我預計這會在我的堆棧中間的某處跳動。另外,如果我嘗試獲取堆棧基地址和限制(使用與sb和sl相同的方法),我只能得到0。從我的研究來看,我並不擔心這一點,似乎他們並不總是被使用。

感謝您的幫助

+3

該代碼是否通過中斷運行?如果是這樣,它可能有自己的堆棧(和堆棧指針)。 – EOF 2014-10-02 22:46:02

+0

我無法與您的特定平臺說話,但有多種方法可以完成此任務。你可能想看看[IAR寫的這篇精彩的文章](http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Mastering_stack_and_heap_for_system_reliability.pdf)。 – 2014-10-02 23:28:53

+1

這是一個Cortex-M(只有'[2 SP寄存器](http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/BABDGADF.html)),還是一個Cortex- A /舊式架構(最多8個存儲副本)?另外,是否有任何一種操作系統或其他上下文切換? – Notlikethat 2014-10-02 23:47:48

回答

3

嘗試使stackptrvolatile,因爲編譯器可以認爲這是沒有得到更新,並在寄存器中使用陳舊的副本或完全優化掉訪問它。

解決問題的另一種方法可能是要求編譯器計算可能的堆棧使用情況並創建報告。例如使用GCC,您可以使用-fstack-usage and -Wstack-usage標誌。 -fstack-usage創建一個具有相同名稱的.su文件,報告每個函數的堆棧使用情況。 -Wstack-usage=X如果一個函數需要比傳入的棧更多的堆棧,則會發出警告。當然,這是靜態分析,因此編譯器無法處理所有情況(但如果是這樣,則會生成警告)。如果你不使用GCC,我也希望任何商業編譯器都有這樣的功能。