STM32报错:L6971E: system_stm32h7xx.o(.data) type RW incompatible with malloc.o(.ARM.__AT_地址) type ZI

MDK报错:Error: L6971E: system_stm32h7xx.o(.data) type RW incompatible with malloc.o(.ARM.__AT_地址) type ZI in er RW_IRAM1.

机器翻译后,大概意思是:“错误:L6971E:system_stm32h7xx.o(.data)类型RW与er RW_IRAM1中的malloc.o(.ARM._AT址)类型ZI不兼容。.”

原因:使用了内存管理(估计大家也是学习的正点原子的学习资料),导致可由系统自由分配的内存减少,当你又在程序中定义了许多变量或数组,编译系统无内存给他们分配,与内存管理中设置的内存池冲突。

解决方法

方法1、在内存管理中减小内存池的大小。(这样系统可自由分配的内存就增多)
以原子程序为例:
这个是内存池的定义(如下):

//内存池(64字节对齐)
__align(64) u8 mem1base[MEM1_MAX_SIZE];													//内部SRAM内存池
__align(64) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC01F4000)));		//外部SDRAM内存池,前面2M给LTDC用了(1280*800*2)
__align(64) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0x30000000)));			//内部SRAM1+SRAM2内存池
__align(64) u8 mem4base[MEM4_MAX_SIZE] __attribute__((at(0x38000000)));			//内部SRAM4内存池
__align(64) u8 mem5base[MEM5_MAX_SIZE] __attribute__((at(0x20000000)));			//内部DTCM内存池
__align(64) u8 mem6base[MEM6_MAX_SIZE] __attribute__((at(0x00000000)));			//内部ITCM内存池 

在头文件中定义了内存池大小(如下):

//mem1内存参数设定.mem1是H7内部的AXI内存.
#define MEM1_BLOCK_SIZE			64  	  						//内存块大小为64字节
#define MEM1_MAX_SIZE			300*1024  						//最大管理内存 448K,H7的AXI内存总共512KB
#define MEM1_ALLOC_TABLE_SIZE	MEM1_MAX_SIZE/MEM1_BLOCK_SIZE 	//内存表大小

我这里已经改成了300K大小。大家可以再头文件里更改MEM1_MAX_SIZE,来控制定义在H7内部的AXI内存的内存池mem1的大小。

方法2、把你程序中定义的大数组用内存管理的方式分配空间,即用malloc函数(内存管理中定义)为你的大数组在内存池中分配空间。(不利用留给系统自由分配的空间)
就是利用内存管理实验malloc.c里定义的这个内存分配函数了(如下):

//分配内存(外部调用)
//memx:所属内存块
//size:内存大小(字节)
//返回值:分配到的内存首地址.
void *mymalloc(u8 memx,u32 size)  
{
       
    u32 offset;   
	offset=my_mem_malloc(memx,size);  	   	 	   
    if(offset==0XFFFFFFFF)return NULL;  
    else return (void*)((u32)mallco_dev.membase[memx]+offset);  
} 

可以自己选择方法1或方法2解决问题。

注:我用的是正点原子的内存管理的方法遇到了这个问题。以上为个人遇到这个报错后的解决办法和个人理解,仅供参考。若有错误,欢迎指出。谢谢

你可能感兴趣的:(STM32,keil,mdk,stm32)