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编译优化掉。使得数据一直不会变。

发布了7 篇原创文章 · 获赞 8 · 访问量 2878

猜你喜欢

转载自blog.csdn.net/oDuanYanGuHong/article/details/104500651