STM32 RAM溢出分析(KEIL在Build的時候提示Error:L6406E:No space in execution)

先請問大家一個問題: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編譯優化掉。使得數據一直不會變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章