先請問大家一個問題:keil5編譯後生成 Program Size: Code RO-data RW-data ZI-data是什麼?
要想知道RAM溢出分析,對內存需要比較瞭解。實際上:
====================================================
**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:已經初始化的變量大小
Total RW Size 就是STM32中的RAM內存空間。
個人做了一個實驗論證了一下:
參考代碼,使用全局變量來佔用RAM
#define KB_BYTE 1
uint8_t fft1_output[1024*KB_BYTE];
void StartTask06(void const * argument)
{
BaseType_t xReturn = pdPASS;
int AI_Result[3]={0};
for(;;)
{
xReturn=xSemaphoreTake(xBSem_AI_Start_Flag,portMAX_DELAY); //
if(xReturn==pdTRUE){
for(uint32_t i;i<1024*KB_BYTE;i++){
fft1_output[i]=fft1_output[i]+fft1_output[i];
}
}
}
}
測試條件:STM32F4,RAM爲128K。編譯器爲level 0,數組定義爲全局變量,代碼路上。Program Size如下
從上面可以看出,當數組爲56K(56*1024)大小時,RAM爲128.5K溢出。報錯
Error: L6406E: No space in execution regions with .ANY selector matching xxx.o(.data).
爲了更爲精確的測試,我們利用數組,湊齊128K,代碼同上
圖一:
圖二:
另外測試過程中發現,定義的全局變量數組必須在函數中使用到。不然會被keil編譯優化掉。使得數據一直不會變。