2.2 STM32 RAM溢出分析(KEIL在Build的时候提示Error:L6406E:No space in execution)
科普:
先請(qǐng)問大家一個(gè)問題:keil5編譯后生成 Program Size: Code RO-data RW-data ZI-data是什么?
Program Size: Code=x RO-data=x RW-data=x ZI-data=x 的含義
Code(代碼): 程序所占用的FLASH大小,存儲(chǔ)在FLASH.
RO-data(只讀的數(shù)據(jù)): Read-only-data,程序定義的常量,如const型,存儲(chǔ)在FLASH中。
RW-data(有初始值要求的、可讀可寫的數(shù)據(jù)):
Read-write-data,已經(jīng)被初始化的變量,存儲(chǔ)在FLASH中。初始化時(shí)RW-data從flash拷貝到SRAM。
ZI-data:Zero-Init-data,未被初始化的可讀寫變量,存儲(chǔ)在SRAM中。ZI-data不會(huì)被算做代碼里因?yàn)椴粫?huì)被初始化。
ROM(Flash) size = Code + RO-data + RW-data;
RAM size = RW-data + ZI-data
簡單的說就是在燒寫的時(shí)候是FLASH中的被占用的空間為:Code+RO Data+RW Data
程序運(yùn)行的時(shí)候,芯片內(nèi)部RAM使用的空間為: RW Data + ZI Data
==================================================
要想知道RAM溢出分析,對(duì)內(nèi)存需要比較了解。實(shí)際上:
====================================================
**Total RO Size (Code + RO Data) Total RW Size (RW Data + ZI Data) Total ROM Size (Code + RO Data + RW Data)**====================================================
ZI-data: 已定義未初始化或者初始化為0的變量大小
RW-data:已經(jīng)初始化的變量大小
Total RW Size 就是STM32中的RAM內(nèi)存空間。
個(gè)人做了一個(gè)實(shí)驗(yàn)論證了一下:
參考代碼,使用全局變量來占用RAM
測試條件:STM32F4,RAM為128K。編譯器為level 0,數(shù)組定義為全局變量,代碼路上。Program Size如下
從上面可以看出,當(dāng)數(shù)組為56K(56*1024)大小時(shí),RAM為128.5K溢出。報(bào)錯(cuò)
Error: L6406E: No space in execution regions with .ANY selector matching xxx.o(.data).
為了更為精確的測試,我們利用數(shù)組,湊齊128K,代碼同上
圖一:
圖二:
另外測試過程中發(fā)現(xiàn),定義的全局變量數(shù)組必須在函數(shù)中使用到。不然會(huì)被keil編譯優(yōu)化掉。使得數(shù)據(jù)一直不會(huì)變。
總結(jié)
以上是生活随笔為你收集整理的2.2 STM32 RAM溢出分析(KEIL在Build的时候提示Error:L6406E:No space in execution)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言桶是什么意思,桶排序算法
- 下一篇: description标签如何正确使用?