Files
player/Project/Src/Drive/Source/mymem.c

702 lines
14 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "mymem.h"
#include "sdram.h"
2025-07-05 19:47:28 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>ccm<63>ڴ棬1<E6A3AC><31>ʹ<EFBFBD>ã<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
2025-06-27 00:32:57 +08:00
#define USE_CCM 0
#ifndef BOOTLOADER
#define OS_RTT
#ifdef OS_RTT
#include "rthw.h"
#define IRQ_DISABLE() rt_enter_critical()
#define IRQ_ENABLE() rt_exit_critical()
#else
#include "os.h"
#define IRQ_DISABLE() {CPU_SR_ALLOC(); CPU_CRITICAL_ENTER();}
#define IRQ_ENABLE() CPU_CRITICAL_EXIT()
#endif
#else
#define IRQ_DISABLE() { }
#define IRQ_ENABLE() { }
#endif
2025-07-05 19:47:28 +08:00
static void exmem_init(void); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static u32 exmem_malloc(u32 size); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
static u8 exmem_free(u32 offset); //<2F>ڴ<EFBFBD><DAB4>ͷ<EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
static void mem_init(void); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static u32 mem_malloc(u32 size); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
static u8 mem_free(u32 offset); //<2F>ڴ<EFBFBD><DAB4>ͷ<EFBFBD>
2025-06-27 00:32:57 +08:00
static void ccm_init(void) ;
void mymem_init (void)
{
mem_init ();
exmem_init( );
// ccm_init();
}
2025-07-05 19:47:28 +08:00
#define EXMEM_BLOCK_SIZE (256) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>СΪ64<36>ֽ<EFBFBD>
2025-06-27 00:32:57 +08:00
#define EXMEM_MAX_SIZE ((uint64_t)((SDRAM_USER_SIZE))*EXMEM_BLOCK_SIZE/(EXMEM_BLOCK_SIZE+2))
2025-07-05 19:47:28 +08:00
#define EXMEM_ALLOC_TABLE_SIZE ((u32)(EXMEM_MAX_SIZE/EXMEM_BLOCK_SIZE)&(~3)) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD>Ϊż<CEAA><C5BC><EFBFBD><EFBFBD>˫<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ涼<DAB4><E6B6BC>˫<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define EXMEM_BASE ((u8 *)(SDRAM_USER_ADDR+EXMEM_ALLOC_TABLE_SIZE*2))
#define EXMEMMAP_BASE ((u16 *)(SDRAM_USER_ADDR))
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 exmemtblsize ; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
u32 exmemblksize; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С
uint64_t exmemsize ; //<2F>ڴ<EFBFBD><DAB4>ܴ<EFBFBD>С
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
struct _m_mallco_dev exmallco_dev;
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
//*des:Ŀ<>ĵ<EFBFBD>ַ
//*src:Դ<><D4B4>ַ
//n:<3A><>Ҫ<EFBFBD><D2AA><EFBFBD>Ƶ<EFBFBD><C6B5>ڴ泤<DAB4><E6B3A4>(<28>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>λ)
2025-06-27 00:32:57 +08:00
void mymemcpy(void *des,void *src,u32 n)
{
u8 *xdes=des;
u8 *xsrc=src;
while(n--)*xdes++=*xsrc++;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
//*s:<3A>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ
//c :Ҫ<><D2AA><EFBFBD>õ<EFBFBD>ֵ
//count:<3A><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>λ)
2025-06-27 00:32:57 +08:00
void mymemset(void *s,u8 c,u32 count)
{
u8 *xs = s;
while(count--)*xs++=c;
}
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
static void exmem_init(void)
{
2025-07-05 19:47:28 +08:00
exmemtblsize = EXMEM_ALLOC_TABLE_SIZE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
exmemblksize = EXMEM_BLOCK_SIZE; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С
exmemsize = EXMEM_MAX_SIZE; //<2F>ڴ<EFBFBD><DAB4>ܴ<EFBFBD>С
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
exmallco_dev.membase=EXMEM_BASE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD>
exmallco_dev.memmap=EXMEMMAP_BASE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
exmallco_dev.memrdy=0; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
mymemset(exmallco_dev.memmap, 0,exmemtblsize*2);//<2F>ڴ<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mymemset(exmallco_dev.membase, 0,exmemsize); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
exmallco_dev.memrdy=1; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>OK
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡ<EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ʹ<><CAB9><EFBFBD><EFBFBD>(0~100)
2025-06-27 00:32:57 +08:00
int exmem_perused(void)
{
u32 used=0;
u32 i;
for(i=0;i<exmemtblsize;i++)
{
if(exmallco_dev.memmap[i])used++;
}
return (used*10000)/(exmemtblsize);
}
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>(<28>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//size:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:0XFFFFFFFF,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C>ڴ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
static u32 exmem_malloc(u32 size)
{
signed long offset=0;
2025-07-05 19:47:28 +08:00
u32 nmemb; //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
u32 cmemb=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
u32 i;
2025-07-05 19:47:28 +08:00
// if(!mallco_dev.memrdy)mallco_dev.init();//δ<><CEB4>ʼ<EFBFBD><CABC>,<2C><>ִ<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
if(size==0)return 0XFFFFFFFF;//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
nmemb=size/exmemblksize; //<2F><>ȡ<EFBFBD><C8A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(size%exmemblksize)nmemb++;
2025-07-05 19:47:28 +08:00
for(offset=exmemtblsize-1;offset>=0;offset--)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
if(!exmallco_dev.memmap[offset])cmemb++;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else cmemb=0; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(cmemb==nmemb) //<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nmemb<6D><62><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
for(i=0;i<nmemb;i++) //<2F><>ע<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ǿ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
exmallco_dev.memmap[offset+i]=nmemb;
}
2025-07-05 19:47:28 +08:00
return (offset*exmemblksize);//<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
}
}
2025-07-05 19:47:28 +08:00
return 0XFFFFFFFF;//δ<>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>(<28>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//offset:<3A>ڴ<EFBFBD><DAB4><EFBFBD>ַƫ<D6B7><C6AB>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ͷųɹ<C5B3>;1,<2C>ͷ<EFBFBD>ʧ<EFBFBD><CAA7>;
2025-06-27 00:32:57 +08:00
static u8 exmem_free(u32 offset)
{
u32 i;
2025-07-05 19:47:28 +08:00
if(!exmallco_dev.memrdy)//δ<><CEB4>ʼ<EFBFBD><CABC>,<2C><>ִ<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
{
//mallco_dev.init();
2025-07-05 19:47:28 +08:00
return 1;//δ<><CEB4>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
if(offset<exmemsize)//ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>.
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
u32 index=offset/exmemblksize; //ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 nmemb=exmallco_dev.memmap[index]; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<nmemb;i++) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
exmallco_dev.memmap[index+i]=0;
}
return 0;
2025-07-05 19:47:28 +08:00
}else return 2;//ƫ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>.
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//------------------------------------<2D>ڲ<EFBFBD>SRAM---------------------------------------
2025-06-27 00:32:57 +08:00
#define SRAM_USER_SIZE (120*1024)
u8 g_sram_mem[SRAM_USER_SIZE];
2025-07-05 19:47:28 +08:00
#define MEM_BLOCK_SIZE (32) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>СΪ64<36>ֽ<EFBFBD>
2025-06-27 00:32:57 +08:00
#define MEM_MAX_SIZE (((SRAM_USER_SIZE))*MEM_BLOCK_SIZE/(MEM_BLOCK_SIZE+2))
2025-07-05 19:47:28 +08:00
#define MEM_ALLOC_TABLE_SIZE ((MEM_MAX_SIZE/MEM_BLOCK_SIZE)&(~3)) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD>Ϊż<CEAA><C5BC><EFBFBD><EFBFBD>˫<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>
2025-06-27 00:32:57 +08:00
#define SRAM_USER_ADDR ((u32)g_sram_mem)
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ涼<DAB4><E6B6BC>˫<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define MEM_BASE ((u8 *)(SRAM_USER_ADDR+MEM_ALLOC_TABLE_SIZE*2))
#define MEMMAP_BASE ((u16 *)(SRAM_USER_ADDR))
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 memtblsize ; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
u32 memblksize; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С
u32 memsize ; //<2F>ڴ<EFBFBD><DAB4>ܴ<EFBFBD>С
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
struct _m_mallco_dev mallco_dev;
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
static void mem_init(void)
{
2025-07-05 19:47:28 +08:00
memtblsize = MEM_ALLOC_TABLE_SIZE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
memblksize = MEM_BLOCK_SIZE; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С
memsize = MEM_MAX_SIZE; //<2F>ڴ<EFBFBD><DAB4>ܴ<EFBFBD>С
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
// mallco_dev.init=mem_init; //<2F>ڴ<EFBFBD><DAB4><EFBFBD>ʼ<EFBFBD><CABC>
// mallco_dev.perused=mem_perused; //<2F>ڴ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>
mallco_dev.membase=MEM_BASE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD>
mallco_dev.memmap=MEMMAP_BASE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
mallco_dev.memrdy=0; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
mymemset(mallco_dev.memmap, 0,memtblsize*2);//<2F>ڴ<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mymemset(mallco_dev.membase, 0,memsize); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mallco_dev.memrdy=1; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>OK
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡ<EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ʹ<><CAB9><EFBFBD><EFBFBD>(0~100)
2025-06-27 00:32:57 +08:00
int mem_perused(void)
{
u32 used=0;
u32 i;
for(i=0;i<memtblsize;i++)
{
if(mallco_dev.memmap[i])used++;
}
return (used*10000)/(memtblsize);
}
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>(<28>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//size:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:0XFFFFFFFF,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C>ڴ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
static u32 mem_malloc(u32 size)
{
signed long offset=0;
2025-07-05 19:47:28 +08:00
u16 nmemb; //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
u16 cmemb=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
u32 i;
2025-07-05 19:47:28 +08:00
// if(!mallco_dev.memrdy)mallco_dev.init();//δ<><CEB4>ʼ<EFBFBD><CABC>,<2C><>ִ<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
if(size==0)return 0XFFFFFFFF;//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
nmemb=size/memblksize; //<2F><>ȡ<EFBFBD><C8A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(size%memblksize)nmemb++;
2025-07-05 19:47:28 +08:00
for(offset=memtblsize-1;offset>=0;offset--)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
if(!mallco_dev.memmap[offset])cmemb++;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else cmemb=0; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(cmemb==nmemb) //<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nmemb<6D><62><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
for(i=0;i<nmemb;i++) //<2F><>ע<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ǿ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
mallco_dev.memmap[offset+i]=nmemb;
}
2025-07-05 19:47:28 +08:00
return (offset*memblksize);//<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
}
}
2025-07-05 19:47:28 +08:00
return 0XFFFFFFFF;//δ<>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>(<28>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//offset:<3A>ڴ<EFBFBD><DAB4><EFBFBD>ַƫ<D6B7><C6AB>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ͷųɹ<C5B3>;1,<2C>ͷ<EFBFBD>ʧ<EFBFBD><CAA7>;
2025-06-27 00:32:57 +08:00
static u8 mem_free(u32 offset)
{
int i;
2025-07-05 19:47:28 +08:00
if(!mallco_dev.memrdy)//δ<><CEB4>ʼ<EFBFBD><CABC>,<2C><>ִ<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
{
//mallco_dev.init();
2025-07-05 19:47:28 +08:00
return 1;//δ<><CEB4>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
if(offset<exmemsize)//ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>.
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
int index=offset/memblksize; //ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nmemb=mallco_dev.memmap[index]; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<nmemb;i++) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
mallco_dev.memmap[index+i]=0;
}
return 0;
2025-07-05 19:47:28 +08:00
}else return 2;//ƫ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>.
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//------------------------------------<2D>ڲ<EFBFBD>CCM---------------------------------------
2025-06-27 00:32:57 +08:00
#if USE_CCM==1
#define CCM_USER_SIZE 64*1024
u8 g_ccm_mem[CCM_USER_SIZE] __attribute__((at(0x10000000)));
2025-07-05 19:47:28 +08:00
#define CCM_BLOCK_SIZE (32) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>СΪ64<36>ֽ<EFBFBD>
2025-06-27 00:32:57 +08:00
#define CCM_MAX_SIZE (((CCM_USER_SIZE))*CCM_BLOCK_SIZE/(CCM_BLOCK_SIZE+2))
2025-07-05 19:47:28 +08:00
#define CCM_ALLOC_TABLE_SIZE ((CCM_MAX_SIZE/CCM_BLOCK_SIZE)&(~3)) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD>Ϊż<CEAA><C5BC><EFBFBD><EFBFBD>˫<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>
2025-06-27 00:32:57 +08:00
#define CCM_USER_ADDR ((u32)g_ccm_mem)
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ涼<DAB4><E6B6BC>˫<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define CCM_BASE ((u8 *)(CCM_USER_ADDR+CCM_ALLOC_TABLE_SIZE*2))
#define CCMMAP_BASE ((u16 *)(CCM_USER_ADDR))
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 ccm_memtblsize ; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
u32 ccm_memblksize; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С
u32 ccm_memsize ; //<2F>ڴ<EFBFBD><DAB4>ܴ<EFBFBD>С
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
struct _m_mallco_dev ccm_mallco_dev;
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
static void ccm_init(void)
{
2025-07-05 19:47:28 +08:00
ccm_memtblsize = CCM_ALLOC_TABLE_SIZE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
ccm_memblksize = CCM_BLOCK_SIZE; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С
ccm_memsize = CCM_MAX_SIZE; //<2F>ڴ<EFBFBD><DAB4>ܴ<EFBFBD>С
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
ccm_mallco_dev.membase=CCM_BASE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD>
ccm_mallco_dev.memmap=CCMMAP_BASE; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
ccm_mallco_dev.memrdy=0; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
mymemset(ccm_mallco_dev.memmap, 0,ccm_memtblsize*2);//<2F>ڴ<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mymemset(ccm_mallco_dev.membase, 0,ccm_memsize); //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ccm_mallco_dev.memrdy=1; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>OK
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><>ȡ<EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:ʹ<><CAB9><EFBFBD><EFBFBD>(0~100)
2025-06-27 00:32:57 +08:00
int ccm_perused(void)
{
u32 used=0;
u32 i;
for(i=0;i<ccm_memtblsize;i++)
{
if(ccm_mallco_dev.memmap[i])used++;
}
return (used*10000)/(ccm_memtblsize);
}
2025-07-05 19:47:28 +08:00
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>(<28>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//size:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:0XFFFFFFFF,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C>ڴ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
static u32 ccm_malloc(u32 size)
{
signed long offset=0;
2025-07-05 19:47:28 +08:00
u16 nmemb; //<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
u16 cmemb=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
u32 i;
2025-07-05 19:47:28 +08:00
// if(!mallco_dev.memrdy)mallco_dev.init();//δ<><CEB4>ʼ<EFBFBD><CABC>,<2C><>ִ<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
if(size==0)return 0XFFFFFFFF;//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
nmemb=size/ccm_memblksize; //<2F><>ȡ<EFBFBD><C8A1>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
if(size%ccm_memblksize)nmemb++;
2025-07-05 19:47:28 +08:00
for(offset=ccm_memtblsize-1;offset>=0;offset--)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
if(!ccm_mallco_dev.memmap[offset])cmemb++;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else cmemb=0; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(cmemb==nmemb) //<2F>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nmemb<6D><62><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
for(i=0;i<nmemb;i++) //<2F><>ע<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ǿ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
ccm_mallco_dev.memmap[offset+i]=nmemb;
}
2025-07-05 19:47:28 +08:00
return (offset*ccm_memblksize);//<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
}
}
2025-07-05 19:47:28 +08:00
return 0XFFFFFFFF;//δ<>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>(<28>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//offset:<3A>ڴ<EFBFBD><DAB4><EFBFBD>ַƫ<D6B7><C6AB>
//<2F><><EFBFBD><EFBFBD>ֵ:0,<2C>ͷųɹ<C5B3>;1,<2C>ͷ<EFBFBD>ʧ<EFBFBD><CAA7>;
2025-06-27 00:32:57 +08:00
static u8 ccm_free(u32 offset)
{
int i;
2025-07-05 19:47:28 +08:00
if(!ccm_mallco_dev.memrdy)//δ<><CEB4>ʼ<EFBFBD><CABC>,<2C><>ִ<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
{
//mallco_dev.init();
2025-07-05 19:47:28 +08:00
return 1;//δ<><CEB4>ʼ<EFBFBD><CABC>
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
if(offset<exmemsize)//ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>.
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
int index=offset/ccm_memblksize; //ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nmemb=ccm_mallco_dev.memmap[index]; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<nmemb;i++) //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
{
ccm_mallco_dev.memmap[index+i]=0;
}
return 0;
2025-07-05 19:47:28 +08:00
}else return 2;//ƫ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>.
2025-06-27 00:32:57 +08:00
}
#endif
2025-07-05 19:47:28 +08:00
//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>(<28>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//ptr:<3A>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ
2025-06-27 00:32:57 +08:00
void myfree(void *ptr)
{
IRQ_DISABLE();
u32 free_addr=(u32)ptr;
u32 offset;
if(ptr==NULL)
{
IRQ_ENABLE();
2025-07-05 19:47:28 +08:00
return;//<2F><>ַΪ0.
2025-06-27 00:32:57 +08:00
}
else if ((free_addr&0xf0000000)==0x20000000)//sram
{
offset=(u32)ptr-(u32)mallco_dev.membase;
2025-07-05 19:47:28 +08:00
mem_free(offset);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
}
else
{
offset=(u32)ptr-(u32)exmallco_dev.membase;
2025-07-05 19:47:28 +08:00
exmem_free(offset);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
}
//printf ("free:%#X\r\n",free_addr);
IRQ_ENABLE();
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>(<28>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>)
//<2F><><EFBFBD>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>䣬ʧ<E4A3AC>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>
//size:<3A>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD><E4B5BD><EFBFBD>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ.
2025-06-28 22:15:49 +08:00
void *mymalloc(size_t size)
2025-06-27 00:32:57 +08:00
{
IRQ_DISABLE();
u32 offset;
void *ret_addr=NULL;
if (size>5*1024)
offset=0XFFFFFFFF;
else
offset=mem_malloc(size);
if(offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)mallco_dev.membase+offset);
}
else
{
offset=exmem_malloc(size);
if (offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)exmallco_dev.membase+offset);
}
}
//printf ("malloc:%#X,%d\r\n",(u32)ret_addr,size);
IRQ_ENABLE();
return ret_addr;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>(<28>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>)
//<2F><><EFBFBD>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>䣬ʧ<E4A3AC>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>
//size:<3A>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD><E4B5BD><EFBFBD>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ.
2025-06-27 00:32:57 +08:00
void *mymalloc_fast(u32 size)
{
IRQ_DISABLE();
u32 offset;
void *ret_addr=NULL;
offset=mem_malloc(size);
if(offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)mallco_dev.membase+offset);
}
else
{
offset=exmem_malloc(size);
if (offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)exmallco_dev.membase+offset);
}
}
//printf ("malloc:%#X,%d\r\n",(u32)ret_addr,size);
IRQ_ENABLE();
return ret_addr;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>ڴ<EFBFBD>(<28>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>)
//<2F><><EFBFBD>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>䣬ʧ<E4A3AC>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>
//size:<3A>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD><E4B5BD><EFBFBD>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ.
2025-06-27 00:32:57 +08:00
void *mymalloc_exm(u32 size)
{
IRQ_DISABLE();
u32 offset;
void *ret_addr=NULL;
offset=exmem_malloc(size);
if (offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)exmallco_dev.membase+offset);
}
IRQ_ENABLE();
return ret_addr;
}
#if USE_CCM==1
2025-07-05 19:47:28 +08:00
//<2F>ͷ<EFBFBD>CCM<43>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
void myfree_ccm(void *ptr)
{
IRQ_DISABLE();
u32 free_addr=(u32)ptr;
u32 offset;
if(ptr==NULL)
{
IRQ_ENABLE();
2025-07-05 19:47:28 +08:00
return;//<2F><>ַΪ0.
2025-06-27 00:32:57 +08:00
}
else if ((free_addr&0xf0000000)==0x10000000)//sram
{
offset=(u32)ptr-(u32)ccm_mallco_dev.membase;
2025-07-05 19:47:28 +08:00
ccm_free(offset);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
}
else
{
offset=(u32)ptr-(u32)exmallco_dev.membase;
2025-07-05 19:47:28 +08:00
exmem_free(offset);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
}
//printf ("free:%#X\r\n",free_addr);
IRQ_ENABLE();
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD>CCM<43>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
void *mymalloc_ccm(u32 size)
{
IRQ_DISABLE();
u32 offset;
void *ret_addr=NULL;
offset=ccm_malloc(size);
if(offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)ccm_mallco_dev.membase+offset);
}
else
{
offset=exmem_malloc(size);
if (offset!=0XFFFFFFFF)
{
ret_addr=(void*)((u32)exmallco_dev.membase+offset);
}
}
IRQ_ENABLE();
return ret_addr;
}
#endif
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ڴ<EFBFBD>(<28>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>)
//memx:<3A><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
//*ptr:<3A><><EFBFBD>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ
//size:Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С(<28>ֽ<EFBFBD>)
//<2F><><EFBFBD><EFBFBD>ֵ:<3A>·<EFBFBD><C2B7><EFBFBD><E4B5BD><EFBFBD>ڴ<EFBFBD><DAB4>׵<EFBFBD>ַ.
2025-06-27 00:32:57 +08:00
void *myrealloc(void *ptr,u32 size)
{
IRQ_DISABLE();
void *ret_addr;
ret_addr=mymalloc_exm(size);
if(ret_addr!=NULL)
{
if(ptr!=NULL)
{
mymemcpy (ret_addr,ptr,size);
myfree(ptr);
}
}
IRQ_ENABLE();
return ret_addr;
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ沢<DAB4><E6B2A2><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
void *mycalloc (u32 size)
{
void *ptr=mymalloc(size);
if (ptr) mymemset(ptr,0,size);
return ptr;
}
////////////////////////////////////////////////////////////////////////////////
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýӿ<C3BD>
2025-06-27 00:32:57 +08:00
void *malloc(size_t size)
{
return mymalloc(size);
}
void free (void *ptr)
{
myfree(ptr);
}
void *realloc(void *ptr,size_t size)
{
return myrealloc(ptr,size);
}
void *calloc(size_t nmemb, size_t size)
{
return mycalloc(nmemb*size);
}