|

楼主 |
发表于 2020-4-1 19:08:49
|
显示全部楼层
本帖最后由 hpdell 于 2020-4-1 20:17 编辑
刚刚试过了,貌似还是一样的会出现 HardFault_Handler ... ...?
我重新封装为
//内存池类型定义
typedef enum
{
AXISRAM = 0, //内部内存池
SRAM1 , //内部内存池
// SRAM4 , //内部内存池
SDRAMEX //外部内存池(SDRAM)
} MEMORY_DefType;
// D1域, AXI SRAM, 512KB, 地址 0x2400 0000
#define AXISRAM_RT_ADDR (uint32_t)(0x24000000)
#define AXISRAM_RT_MAX_SIZE 512*1024 // 单片机内部 AXI SRAM 最大管理 512KByte 的空间
// D2域, 128KB SRAM1(0x30000000) + 128KB SRAM2(0x30020000)
#define SRAM1_RT_ADDR (uint32_t)(0x30000000)
#define SRAM1_RT_MAX_SIZE 256*1024 // 单片机内部 AXI SRAM 最大管理 256KByte 的空间
// D2域 32KB SRAM3(0x30040000) 这个空间不用管理,预留给 eth 网络使用
//// D3域, 64KB SRAM4(0x38000000)
//#define SRAM4_RT_ADDR (uint32_t)(0x38000000)
//#define SRAM4_RT_MAX_SIZE 64*1024 // 单片机内部 AXI SRAM 最大管理 256KByte 的空间
//SDRAM
#define SDRAM_RT_ADDR (SDRAM_MALLOC_BASE_USER_ADDR)
#define SDRAM_RT_MAX_SIZE (uint32_t)(SDRAM_MALLOC_MAX_SIZE)
/* Types */
typedef struct mem { /* << Memory Pool management struct >> */
struct mem *next; /* Next Memory Block in the list */
U32 len; /* Length of data block */
} MEMP;
void my_mem_init(MEMORY_DefType memx)
{
if(memx == AXISRAM)
{
rt_init_mem((void *)AXISRAM_RT_ADDR, AXISRAM_RT_MAX_SIZE);
} else if(memx == SRAM1)
{
rt_init_mem((void *)SRAM1_RT_ADDR, SRAM1_RT_MAX_SIZE);
} else if(memx == SDRAMEX)
{
rt_init_mem((void *)SDRAM_RT_ADDR, SDRAM_RT_MAX_SIZE);
}
}
// =========================================================================================================
// 以下为外部调用函数
/*
内存初始化
*/
void bsp_MemoryInit(void)
{
my_mem_init(AXISRAM); //初始化内部内存池
my_mem_init(SRAM1); //初始化内部内存池
my_mem_init(SDRAMEX); //初始化外部SDRAM内存池
}
/*
内存申请
*/
void *mymalloc(MEMORY_DefType memx,uint32_t size)
{
void * MallocAddr = NULL;
if(AXISRAM == memx)
{
MallocAddr = rt_alloc_mem ((void *)AXISRAM_RT_ADDR, size);
}
else if(SRAM1 == memx)
{
MallocAddr = rt_alloc_mem ((void *)SRAM1_RT_ADDR, size);
}
else if(SDRAMEX == memx)
{
MallocAddr = rt_alloc_mem ((void *)SDRAM_RT_ADDR, size);
}
return MallocAddr;
}
/*
内存释放
*/
void myfree(MEMORY_DefType memx,void *ptr)
{
if(AXISRAM == memx)
{
rt_free_mem ((void *)AXISRAM_RT_ADDR, ptr);
}
else if(SRAM1 == memx)
{
rt_free_mem ((void *)SRAM1_RT_ADDR, ptr);
}
else if(SDRAMEX == memx)
{
rt_free_mem ((void *)SDRAM_RT_ADDR, ptr);
}
}
优化设置为 0:
==============================================
优化设置为 3
|
|