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