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