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解決問題。
注:我用的是正點原子的內存管理的方法遇到了這個問題。以上爲個人遇到這個報錯後的解決辦法和個人理解,僅供參考。若有錯誤,歡迎指出。謝謝