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解決問題。

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

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