在不使用遞歸的C程序中,理論上應該可以計算調用給定函數所需的最大/最差情況堆棧大小,以及任何它呼籲。是否有任何免費的開源工具可以做到這一點,無論是源代碼還是編譯後的ELF文件?MSP430上的C程序所需的最大堆棧大小
另外,有沒有辦法從ELF文件中提取函數的堆棧幀大小,所以我可以嘗試手動解決它?
我在使用MSPGCC 3.2.3編譯MSP430(我知道它是舊版本,但我必須在這種情況下使用它)。要分配的堆棧空間在源代碼中設置,並且應儘可能小,以便其餘內存可用於其他事情。我已經讀過,你需要考慮到中斷使用的堆棧空間,但我使用的系統已經考慮到了這一點 - 我試圖計算出多少額外的空間來添加。另外,我已經讀過函數指針,這很難。在這裏使用函數指針的少數地方,我知道它們可以調用哪些函數,所以如果已知調用函數和調用函數所需的堆棧空間,可以手動考慮這些情況。
靜態分析看起來像是一個比運行時棧繪製更強大的選項,但如果沒有好的方法來靜態執行,在運行時進行處理是一種選擇。
編輯:
我發現GCC的-fstack-usage
標誌,它在編譯節省了幀大小爲每個功能。不幸的是,MSPGCC不支持它。但是對於那些試圖在不同平臺上做類似事情的人來說,這可能很有用。
這真的是解決您的問題的方法嗎?我總是非常慷慨,並且用堆疊金絲雀保護它,看它是否完好無損。我認爲這種方法的主要問題是它可能會在以後引發麻煩。比如當你需要用24位PC而不是16位(現在只是一般的8位體驗)來尋求更大的程序存儲空間時,或者你只需要一些額外的功能,就可以通過一些額外的調用來實現。然後精確設置的堆棧可能真的回到你身上。當然,如果你擠出最後一點,那麼確定,但我認爲這應該是最後一個。 – Jubatian
「是否有任何免費的開源工具可以做到這一點?」。有一個免費版本(不開放源代碼)的IAR IDE(30天或4K代碼限制),其中鏈接器列表選項生成應用程序的堆棧使用情況。儘管你正在使用GCC,爲了得到Stack Stack(總數和每個函數),代碼大小(總數和每個函數)和其他細節(如內存放置和變量地址和大小等)的詳細信息,可以使用IAR嵌入式工作臺。 – Harikrishnan
[在編譯時檢查堆棧使用情況]可能的重複(http://stackoverflow.com/questions/126036/checking-stack-usage-at-compile-time) – shodanex