1st edition: 20090417, only the url link.
2nd edition: 20141204, 計算記憶體用量
我想找出 stm32f4 simple scheme (後文簡稱為 sss) 的記憶體用量, sss 沒有使用類似 malloc 的動態記憶體配置, 我們從三個方面來估算其使用的記憶體。
- 執行檔案大小
- bss,
- stack
stack
怎麼算出使用的 stack 容量有點難倒我, 畢竟 stack 的用量會和程式的執行流程有關, 就算同一支程式, 執行的流程不同, 也會得到不同的 stack 用量。
不記得是怎麼因為 __builtin_return_address 而查到這篇。
http://blog.linux.org.tw/~jserv/archives/001870.html
不過我正好需要這個功能。我打算讓 gcc 在離開 function 前插入一段程式碼, 紀錄 stack reigster, 把穿梭在這些 function 裡頭的 stack register 最小值記下, 而 stack register 初使值是 0x1000fff0, 兩者的差就是答案。說來簡單, 實作上愈到不少問題, 誰叫我要用 c++ 呢? 又多折磨我一點點。
在 void __cyg_profile_func_exit(void *this_func, void *call_site) 讀取 sp 的值。注意: 這兩個 function 要放在 extern "C" 裡頭。
另外需要 4.9.1 g++ 才能成功編譯, 4.7, 4.8 皆失敗, 4.9.1 來的正是時候。
L6323, L6367 是反組譯之後可以看到被插入的 function。
在我隨意的測試下, sp 是 100052A8。
1000fff0 - 100052A8 = ad48 = 44360 bytes
bss
比找出 stack 用量簡單不少, 用 readelf 讀出來就搞定:
[ 5] .bss NOBITS 20000060 010060
01df74 00 WA 0 0 4
0x01df74 = 122740 bytes
程式檔案本身
為什麼要加上程式檔案本身呢? 畢竟程式檔案本身會被載入記憶體, 不計算它好像說不過去, 但其中的 .data section 還要另外再算, 不過因為不是很大 (34 bytes),
就忽略不計。
descent@debianlinux:stm32f4_simple_scheme$ ls -l myur.bin
-rwxr-xr-x 1 descent descent 22948 Nov 18 11:38 myur.bin
合計
44360 + 122740 + 22948 = 190048 bytes
若要再加上 .data section 34 byte, 就是 190048 + 34 = 190082 bytes
就算不加上程式本身, 192k 的記憶體被我用的也差不多了。當然這是因為我那些 pool 佔據了大量的記憶體, 改用 malloc 就會有所改善。
以下影片是我隨機跑了幾個 expression 的測試結果。
ref:
How much stack memory do I need for my ARM® Cortex®-M applications?
提到 gcc 的 --protect_stack, --protect_stack_all option。
網誌管理員已經移除這則留言。
回覆刪除