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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|