2012-06-03 35 views
4

我希望能夠在256 KB內存的有限資源環境(目前我正在模擬器程序中測試)中調試C程序正在使用的內存總量。確定嵌入式C程序的總內存使用情況

我有能力將調試語句打印到屏幕上,但是我應該使用什麼方法來計算我的C程序使用了多少(包括全局變量,局部變量[從我的主函數循環的角度來看],程序代碼本身等。)?

第二個方面是顯示特定變量的位置/範圍,而不僅僅是它們的大小。

-Edit- CPU是Hitachi SH2,我沒有一個IDE讓我把斷點放到程序中。

+0

CPU和開發環境是什麼?當我開發ARM7系統時,IDE將在每次成功構建後輸出項目內存使用情況的數據。我們沒有使用動態內存的事實也變得更容易。 – dandan78

+0

日立SH2 - 這是一箇舊的遊戲機。 Dev env是Notepad ++和gcc – ammianus

+0

你的模擬器可能已經有了這些信息。 – Dtyree

回答

3

使用IDE選項可以執行正確的操作(可能標記爲checkobx),以便構建過程(即鏈接器)將生成映射文件。 嵌入式系統的映射文件通常會以詳細的方式爲您提供所需的信息:內存段,它們的大小,每個內存使用多少內存,程序存儲器,數據存儲器等。通常有地圖文件提供的大量數據,您可能需要編寫一個腳本來準確計算所需的數據,或者將其複製到Excel。地圖文件也可能包含您的摘要信息。

堆棧有點棘手。如果地圖文件給出,那麼你有它。如果沒有,你需要自己找到它。嵌入式編譯器通常允許您定義堆棧位置和大小。在你開始的程序中放置一個斷點。當應用程序停止時,整個堆棧爲零。恢復應用程序並讓它工作一段時間。最後停下來檢查堆棧內存。您將看到非零值而不是零。使用的堆棧一直持續到零部分再次啓動。

+0

對於第一部分,我確實有一個由gcc使用-Map標誌生成的地圖,謝謝我將不得不通過它,總結這樣的信息:Memory Configuration Name起源長度屬性 rom 0x0000000002000000 0x0000000000400000 xr ram 0x0000000006000000 0x000000000003fc00 xw * default * 0x0000000000000000 0xffffffffffffffff – ammianus

+0

看來我的地圖文件並不包含堆棧信息。會有一個寄存器或者可能告訴我當前堆棧位置的東西嗎? – ammianus

+0

是的,如果你使用的gcc的版本是嵌入式應用的話,那應該在編譯器的文檔中。 –

0

一般來說,你將有MMAP生成的文件,其中的數據去,像不同的部分:
.intvect

.intvect_end
.rozdata
.robase
.rosdata
.RODATA
。文字....等等!

與其他屬性,如基地,大小(十六進制),大小(dec)等每個部分。

+0

還有其他部分可用,mmap給你一幅完整的圖片......你需要分析你的侷限性! – RKT

+0

據我所知,.data節必須分析RAM初始化數據的開始和結束。 – RKT

0

儘管在任何時候局部變量可能佔用更多或更少的空間(因爲它們進出了作用域),它們在棧上被實例化。在單線程環境中,堆棧將是鏈接時已知的固定分配。所有靜態分配的數據也是如此。唯一的運行時變量部分id是動態分配的數據,但即使這樣,sich數據也是從堆中分配的,在大多數裸機單線程環境中,這是一個固定的鏈路時分配。

因此,有關內存分配的所有信息可能已由鏈接器提供。通常(取決於您使用的工具鏈和鏈接器參數)鏈接器運行時會輸出基本信息。您通常可以請求生成完整的鏈接器映射文件,這將爲您提供詳細信息。一些連接器可以執行堆棧使用情況分析,這會給你任何特定功能的最壞情況堆棧使用情況。在單線程環境中,來自main()的堆棧使用會給最糟糕的總體使用情況(儘管中斷處理程序需要考慮,鏈接程序不是線程或中斷感知,某些體系結構具有單獨的中斷堆棧,有些共享)。

儘管堆本身通常是一個固定的分配(在鏈接器執行了靜態分配的堆棧和靜態數據之後,通常是所有可用的內存),但如果使用的是動態內存分配,它在運行時可能很有用知道從堆中分配了多少內存,以及有關分配數量,平均分配大小以及空閒塊數量和大小的信息。由於動態內存分配是通過系統的標準庫實現的,因此任何此類分析工具都將專門針對您的庫,並且根本不會提供。如果你有圖書館資源,你可以自己實施這些設施。

在多線程環境中,可以靜態分配線程堆棧或從堆中分配線程堆棧,但是以上所述的相同分析方法都適用。對於堆棧使用情況分析,每個線程的最壞情況是從每個線程的入口點開始測量的,而不是從main()開始測量。

相關問題