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

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