|
发表于 2021-8-11 09:07:39
|
显示全部楼层
相关的应用函数
/*
***********************************************************************************************************
内存申请
***********************************************************************************************************
*/
void *mymalloc(MEMORY_DefType memx,uint32_t size)
{
void * MallocAddr = NULL;
if(!size) return MallocAddr;
if(memx == SDRAMEX)
{
MallocAddr = MM_Get(&_ctrl_struct_sdram, size);
}
else if(memx == SRAM1)
{
MallocAddr = MM_Get(&_ctrl_struct_sram1, size);
}
else if(memx == SRAM4)
{
MallocAddr = MM_Get(&_ctrl_struct_sram4, size);
}
else if(memx == DTCMSRAM)
{
MallocAddr = MM_Get(&_ctrl_struct_dtcm, size);
}
return MallocAddr;
}
/*
***********************************************************************************************************
内存释放
***********************************************************************************************************
*/
void myfree(MEMORY_DefType memx,void *ptr)
{
if(!ptr) return ;
if(memx == SDRAMEX)
{
MM_Free(&_ctrl_struct_sdram, ptr);
}
else if(memx == SRAM1)
{
MM_Free(&_ctrl_struct_sram1, ptr);
}
else if(memx == SRAM4)
{
MM_Free(&_ctrl_struct_sram4, ptr);
}
else if(memx == DTCMSRAM)
{
MM_Free(&_ctrl_struct_dtcm, ptr);
}
}
static OS_MUTEX xMutexSram1 ; // sram1 内存管理 使用
static OS_MUTEX xMutexSram4 ; // sram4 内存管理 使用
static OS_MUTEX xMutexSdram ; // sdram 内存管理 使用
static OS_MUTEX xMutexDtcm ; // dtcm 内存管理 使用
OSMutexCreate(&xMutexSram1,
(CPU_CHAR *)"xMutexSram1",
(OS_ERR *)&err);
OSMutexCreate(&xMutexSram4,
(CPU_CHAR *)"xMutexSram4",
(OS_ERR *)&err);
OSMutexCreate(&xMutexSdram,
(CPU_CHAR *)"xMutexSdram",
(OS_ERR *)&err);
OSMutexCreate(&xMutexDtcm,
(CPU_CHAR *)"xMutexDtcm",
(OS_ERR *)&err);
void MEMORY_1_xMutexPhore(char _ch)
{
OS_ERR os_err;
if(OSRunning == 1) //OS开始跑了,才执行正常的调度处理, uCOS-III 系统使用
{
if(!_ch)
{
OSMutexPend(&xMutexSram1,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)NULL,
(OS_ERR *)&os_err); //获取信号量资源
}
else
{
//释放掉资源
(void)OSMutexPost(&xMutexSram1,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&os_err);
}
}
}
void MEMORY_4_xMutexPhore(char _ch)
{
OS_ERR os_err;
if(OSRunning == 1) //OS开始跑了,才执行正常的调度处理, uCOS-III 系统使用
{
if(!_ch)
{
OSMutexPend(&xMutexSram4,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)NULL,
(OS_ERR *)&os_err); //获取信号量资源
}
else
{
//释放掉资源
(void)OSMutexPost(&xMutexSram4,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&os_err);
}
}
}
void MEMORY_Sdram_xMutexPhore(char _ch)
{
OS_ERR os_err;
if(OSRunning == 1) //OS开始跑了,才执行正常的调度处理, uCOS-III 系统使用
{
if(!_ch)
{
OSMutexPend(&xMutexSdram,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)NULL,
(OS_ERR *)&os_err); //获取信号量资源
}
else
{
//释放掉资源
(void)OSMutexPost(&xMutexSdram,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&os_err);
}
}
}
void MEMORY_Dtcm_xMutexPhore(char _ch)
{
OS_ERR os_err;
if(OSRunning == 1) //OS开始跑了,才执行正常的调度处理, uCOS-III 系统使用
{
if(!_ch)
{
OSMutexPend(&xMutexDtcm,
(OS_TICK )0u,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)NULL,
(OS_ERR *)&os_err); //获取信号量资源
}
else
{
//释放掉资源
(void)OSMutexPost(&xMutexDtcm,
(OS_OPT )OS_OPT_POST_NONE,
(OS_ERR *)&os_err);
}
}
}
// -----------------------------------------------------------------------------------
static void mem_1_lock(void)
{
MEMORY_1_xMutexPhore(0);
}
static void mem_1_unlock(void)
{
MEMORY_1_xMutexPhore(1);
}
// -----------------------------------------------------------------------------------
static void mem_4_lock(void)
{
MEMORY_4_xMutexPhore(0);
}
static void mem_4_unlock(void)
{
MEMORY_4_xMutexPhore(1);
}
// -----------------------------------------------------------------------------------
static void mem_sdram_lock(void)
{
MEMORY_Sdram_xMutexPhore(0);
}
static void mem_sdram_unlock(void)
{
MEMORY_Sdram_xMutexPhore(1);
}
// -----------------------------------------------------------------------------------
static void mem_dtcm_lock(void)
{
MEMORY_Dtcm_xMutexPhore(0);
}
static void mem_dtcm_unlock(void)
{
MEMORY_Dtcm_xMutexPhore(1);
}
/*
***********************************************************************************************************
内存初始化
***********************************************************************************************************
*/
void bsp_MemoryInit(void)
{
uint8_t *_addr1=0;
MM_Create((void *)SRAM1_RT_ADDR, BYTE_POOL_SRAM1_SIZE, MM_PIECE_SIZE_SET(BYTE_PIECE_SIZE), &_ctrl_struct_sram1);
MM_Create((void *)SRAM4_RT_ADDR, BYTE_POOL_SRAM4_SIZE, MM_PIECE_SIZE_SET(BYTE_PIECE_SIZE), &_ctrl_struct_sram4);
MM_Create((void *)DTCMSRAM_RT_ADDR, BYTE_POOL_DTCM_SIZE, MM_PIECE_SIZE_SET(BYTE_PIECE_SIZE), &_ctrl_struct_dtcm);
MM_Create((void *)SDRAM_RT_ADDR, BYTE_POOL_SDRAM_SIZE, MM_PIECE_SIZE_SET(BYTE_PIECE_SIZE), &_ctrl_struct_sdram);
// 使用 os 系统,需要设置 加锁及解锁函数,如果没有使用 os 功能,则可以不用设置这个加锁及解锁功能函数
MM_SetFunc_Lock(&_ctrl_struct_sram1, mem_1_lock, mem_1_unlock);
MM_SetFunc_Lock(&_ctrl_struct_sram4, mem_4_lock, mem_4_unlock);
MM_SetFunc_Lock(&_ctrl_struct_dtcm, mem_dtcm_lock, mem_dtcm_unlock);
MM_SetFunc_Lock(&_ctrl_struct_sdram, mem_sdram_lock, mem_sdram_unlock);
// 貌似第一次申请到的内存地址不是 8 字节对齐的,所以初始化完成后就申请一次
_addr1 = (uint8_t *)mymalloc(SDRAMEX, 4);
_addr1 = (uint8_t *)mymalloc(SRAM1, 4);
_addr1 = (uint8_t *)mymalloc(SRAM4, 4);
_addr1 = (uint8_t *)mymalloc(DTCMSRAM, 4);
_addr1 = _addr1;
}
/*
**************************************************************************************************************
内存申请,释放测试, 貌似测试时是完全没有问题的还有播放 *.ape, *.wav, *.flac 音乐都是没有问题的,就唯独 mp3 不行 ??
使用其他 的 内存管理 程序时,播放 mp3 则是完全没有任何问题的
---------------------------------------------------
_sdram_addr1 = 0xD0D0000C
_sdram_addr2 = 0xD2500078 25,165,932
_sdram_addr3 = 0xD2500078
_sdram_addr4 = 0xD260032C
_sdram_addr1 = 0xD0D0000C
---------------------------------------------------
_sram1_addr1 = 0x3000000C
_sram1_addr2 = 0x30000C40
_sram1_addr3 = 0x30000C40
_sram1_addr4 = 0x3000205C
_sram1_addr1 = 0x3000000C
---------------------------------------------------
_dtcm_addr1 = 0x2000000C
_dtcm_addr2 = 0x20000C40
_dtcm_addr3 = 0x20000C40
_dtcm_addr4 = 0x2000205C
_dtcm_addr1 = 0x2000000C
---------------------------------------------------
**************************************************************************************************************
*/
void bsp_memory_demo(void)
{
// uint32_t _free,block_max,block_cnt,mem_used;
uint8_t *_sdram_addr1=0;
uint8_t *_sdram_addr2=0;
uint8_t *_sdram_addr3=0;
uint8_t *_sdram_addr4=0;
uint8_t *_sram1_addr1=0;
uint8_t *_sram1_addr2=0;
uint8_t *_sram1_addr3=0;
uint8_t *_sram1_addr4=0;
uint8_t *_dtcm_addr1=0;
uint8_t *_dtcm_addr2=0;
uint8_t *_dtcm_addr3=0;
uint8_t *_dtcm_addr4=0;
{
_sdram_addr1 = (uint8_t *)mymalloc(SDRAMEX, 1024*1024*24+58);
_sdram_addr2 = (uint8_t *)mymalloc(SDRAMEX, 1024*1024*3);
SYS_MemoryDebug("_sdram_addr1 = 0x%X \r\n", _sdram_addr1);
SYS_MemoryDebug("_sdram_addr2 = 0x%X \r\n", _sdram_addr2);
myfree(SDRAMEX,_sdram_addr2) ;
_sdram_addr3 = (uint8_t *)mymalloc(SDRAMEX, 1024*1024+647);
_sdram_addr4 = (uint8_t *)mymalloc(SDRAMEX, 1024*5-275);
SYS_MemoryDebug("_sdram_addr3 = 0x%X \r\n", _sdram_addr3);
SYS_MemoryDebug("_sdram_addr4 = 0x%X \r\n", _sdram_addr4);
myfree(SDRAMEX,_sdram_addr1) ;
myfree(SDRAMEX,_sdram_addr3) ;
myfree(SDRAMEX,_sdram_addr4) ;
_sdram_addr1 = (uint8_t *)mymalloc(SDRAMEX, 1024*1024*3+36);
SYS_MemoryDebug("_sdram_addr1 = 0x%X \r\n", _sdram_addr1);
myfree(SDRAMEX,_sdram_addr1) ;
SYS_MemoryDebug("\r\n---------------------------------------------------\r\n");
}
{
_sram1_addr1 = (uint8_t *)mymalloc(SRAM1, 1024*3);
_sram1_addr2 = (uint8_t *)mymalloc(SRAM1, 1024*32+65);
SYS_MemoryDebug("_sram1_addr1 = 0x%X \r\n", _sram1_addr1);
SYS_MemoryDebug("_sram1_addr2 = 0x%X \r\n", _sram1_addr2);
myfree(SRAM1,_sram1_addr2) ;
_sram1_addr3 = (uint8_t *)mymalloc(SRAM1, 1024*5);
_sram1_addr4 = (uint8_t *)mymalloc(SRAM1, 1024*5);
SYS_MemoryDebug("_sram1_addr3 = 0x%X \r\n", _sram1_addr3);
SYS_MemoryDebug("_sram1_addr4 = 0x%X \r\n", _sram1_addr4);
myfree(SRAM1,_sram1_addr1) ;
myfree(SRAM1,_sram1_addr3) ;
myfree(SRAM1,_sram1_addr4) ;
_sram1_addr1 = (uint8_t *)mymalloc(SRAM1, 1024*3);
SYS_MemoryDebug("_sram1_addr1 = 0x%X \r\n", _sram1_addr1);
myfree(SRAM1,_sram1_addr1) ;
SYS_MemoryDebug("\r\n---------------------------------------------------\r\n");
}
{
_dtcm_addr1 = (uint8_t *)mymalloc(DTCMSRAM, 1024*3);
_dtcm_addr2 = (uint8_t *)mymalloc(DTCMSRAM, 1024*32+57);
SYS_MemoryDebug("_dtcm_addr1 = 0x%X \r\n", _dtcm_addr1);
SYS_MemoryDebug("_dtcm_addr2 = 0x%X \r\n", _dtcm_addr2);
myfree(DTCMSRAM,_dtcm_addr2) ;
_dtcm_addr3 = (uint8_t *)mymalloc(DTCMSRAM, 1024*5);
_dtcm_addr4 = (uint8_t *)mymalloc(DTCMSRAM, 1024*5);
SYS_MemoryDebug("_dtcm_addr3 = 0x%X \r\n", _dtcm_addr3);
SYS_MemoryDebug("_dtcm_addr4 = 0x%X \r\n", _dtcm_addr4);
myfree(DTCMSRAM,_dtcm_addr1) ;
myfree(DTCMSRAM,_dtcm_addr3) ;
myfree(DTCMSRAM,_dtcm_addr4) ;
_dtcm_addr1 = (uint8_t *)mymalloc(DTCMSRAM, 1024*3);
SYS_MemoryDebug("_dtcm_addr1 = 0x%X \r\n", _dtcm_addr1);
myfree(DTCMSRAM,_dtcm_addr1) ;
SYS_MemoryDebug("\r\n---------------------------------------------------\r\n");
}
}
|
|