mymalloc函数里增加memset来初始化数据 全为0,能解决一些奇怪的问题:
void *mymalloc(uint8_t memx, uint32_t size)
{
uint32_t offset;
offset = my_mem_malloc(memx, size);
if (offset == 0XFFFFFFFF)
{
return NULL;
}
else
{
//
memset((void *)((uint32_t)mallco_dev.membasememx + offset),0 , size);//ruan added
return (void *)((uint32_t)mallco_dev.membasememx + offset);
}
}
=============================================================
/**
****************************************************************************************************
* @file malloc.c
* @version V1.0
* @brief ÄÚ´æ¹ÜÀí ´úÂë
****************************************************************************************************
* @attention Waiken-Smart >>ÛÇÚÖÇÔ¶
*
* ʵÑéÆ½Ì¨: STM32H743IIT6Сϵͳ°å
*
****************************************************************************************************
*/
#include "./MALLOC/malloc.h"
#include "string.h"
#if !(__ARMCC_VERSION >= 6010050) /* ²>>ÊÇAC6±àÒëÆ÷£¬¼´Ê¹ÓÃAC5±àÒëÆ÷ʱ */
/* ÄÚ´æ³Ø(64×Ö½Ú¶ÔÆë) */
static __align(64) uint8_t mem1baseMEM1_MAX_SIZE; /* ÄÚ²¿SRAMÄÚ´æ³Ø */
static __align(64) uint8_t mem2baseMEM2_MAX_SIZE attribute((at(0XC03E8000))); /* ÍⲿSDRAMÄÚ´æ³Ø,Ç°Ãæ4MBÓÃ×öRGB LCDÆÁµÄÏÔ´æ(1280*800*4) */
static __align(64) uint8_t mem3baseMEM3_MAX_SIZE attribute((at(0x30000000))); /* ÄÚ²¿SRAM1+SRAM2ÄÚ´æ³Ø */
static __align(64) uint8_t mem4baseMEM4_MAX_SIZE attribute((at(0x38000000))); /* ÄÚ²¿SRAM4ÄÚ´æ³Ø */
static __align(64) uint8_t mem5baseMEM5_MAX_SIZE attribute((at(0x20000000))); /* ÄÚ²¿DTCMÄÚ´æ³Ø */
static __align(64) uint8_t mem6baseMEM6_MAX_SIZE attribute((at(0x00000000))); /* ÄÚ²¿ITCMÄÚ´æ³Ø */
/* ÄÚ´æ¹ÜÀí±í */
static MT_TYPE mem1mapbaseMEM1_ALLOC_TABLE_SIZE; /* ÄÚ²¿SRAMÄÚ´æ³ØMAP */
static MT_TYPE mem2mapbaseMEM2_ALLOC_TABLE_SIZE attribute((at(0XC03E8000 + MEM2_MAX_SIZE))); /* ÍⲿSDRAMÄÚ´æ³ØMAP */
static MT_TYPE mem3mapbaseMEM3_ALLOC_TABLE_SIZE attribute((at(0x30000000 + MEM3_MAX_SIZE))); /* ÄÚ²¿SRAM1+SRAM2ÄÚ´æ³ØMAP */
static MT_TYPE mem4mapbaseMEM4_ALLOC_TABLE_SIZE attribute((at(0x38000000 + MEM4_MAX_SIZE))); /* ÄÚ²¿SRAM4ÄÚ´æ³ØMAP */
static MT_TYPE mem5mapbaseMEM5_ALLOC_TABLE_SIZE attribute((at(0x20000000 + MEM5_MAX_SIZE))); /* ÄÚ²¿DTCMÄÚ´æ³ØMAP */
static MT_TYPE mem6mapbaseMEM6_ALLOC_TABLE_SIZE attribute((at(0x00000000 + MEM6_MAX_SIZE))); /* ÄÚ²¿ITCMÄÚ´æ³ØMAP */
#else /* ʹÓÃAC6±àÒëÆ÷ʱ */
///* ÄÚ´æ³Ø(64×Ö½Ú¶ÔÆë) */
//static __ALIGNED(64) uint8_t mem1baseMEM1_MAX_SIZE; /* ÄÚ²¿SRAMÄÚ´æ³Ø */
//static __ALIGNED(64) uint8_t mem2baseMEM2_MAX_SIZE attribute((section(".bss.ARM.__at_0XC03E8000"))); /* ÍⲿSDRAMÄÚ´æ³Ø */
//static __ALIGNED(64) uint8_t mem3baseMEM3_MAX_SIZE attribute((section(".bss.ARM.__at_0x30000000"))); /* ÄÚ²¿SRAM1+SRAM2ÄÚ´æ³Ø */
//static __ALIGNED(64) uint8_t mem4baseMEM4_MAX_SIZE attribute((section(".bss.ARM.__at_0x38000000"))); /* ÄÚ²¿SRAM4ÄÚ´æ³Ø */
//static __ALIGNED(64) uint8_t mem5baseMEM5_MAX_SIZE attribute((section(".bss.ARM.__at_0x20000000"))); /* ÄÚ²¿DTCMÄÚ´æ³Ø */
//static __ALIGNED(64) uint8_t mem6baseMEM6_MAX_SIZE attribute((section(".bss.ARM.__at_0x00000000"))); /* ÄÚ²¿ITCMÄÚ´æ³Ø */
///* ÄÚ´æ¹ÜÀí±í */
//static MT_TYPE mem1mapbaseMEM1_ALLOC_TABLE_SIZE; /* ÄÚ²¿SRAMÄÚ´æ³ØMAP */
//static MT_TYPE mem2mapbaseMEM2_ALLOC_TABLE_SIZE attribute((section(".bss.ARM.__at_0XC1E30000"))); /* ÍⲿSDRAMÄÚ´æ³ØMAP */
//static MT_TYPE mem3mapbaseMEM3_ALLOC_TABLE_SIZE attribute((section(".bss.ARM.__at_0X3003C000"))); /* ÄÚ²¿SRAM1+SRAM2ÄÚ´æ³ØMAP */
//static MT_TYPE mem4mapbaseMEM4_ALLOC_TABLE_SIZE attribute((section(".bss.ARM.__at_0X3800F000"))); /* ÄÚ²¿SRAM4ÄÚ´æ³ØMAP */
//static MT_TYPE mem5mapbaseMEM5_ALLOC_TABLE_SIZE attribute((section(".bss.ARM.__at_0X2001E000"))); /* ÄÚ²¿DTCMÄÚ´æ³ØMAP */
//static MT_TYPE mem6mapbaseMEM6_ALLOC_TABLE_SIZE attribute((section(".bss.ARM.__at_0X0000F000"))); /* ÄÚ²¿ITCMÄÚ´æ³ØMAP */
/* ÄÚ´æ³Ø(64×Ö½Ú¶ÔÆë) */
static __ALIGNED(64) uint8_t mem1baseMEM1_MAX_SIZE; /* ÄÚ²¿SRAMÄÚ´æ³Ø */
static __ALIGNED(64) uint8_t mem2baseMEM2_MAX_SIZE attribute((section(".bss.SDRAM1"))); /* ÍⲿSDRAMÄÚ´æ³Ø */
/* ÄÚ´æ¹ÜÀí±í */
static MT_TYPE mem1mapbaseMEM1_ALLOC_TABLE_SIZE; /* ÄÚ²¿SRAMÄÚ´æ³ØMAP */
static MT_TYPE mem2mapbaseMEM2_ALLOC_TABLE_SIZE attribute((section(".bss.SDRAM1"))); /* ÍⲿSDRAMÄÚ´æ³ØMAP */
#endif
///* ÄÚ´æ¹ÜÀí²ÎÊý */
//const uint32_t memtblsizeSRAMBANK = {MEM1_ALLOC_TABLE_SIZE, MEM2_ALLOC_TABLE_SIZE, MEM3_ALLOC_TABLE_SIZE,
// MEM4_ALLOC_TABLE_SIZE, MEM5_ALLOC_TABLE_SIZE, MEM6_ALLOC_TABLE_SIZE
// }; /* ÄÚ´æ±í´óС */
//const uint32_t memblksizeSRAMBANK = {MEM1_BLOCK_SIZE, MEM2_BLOCK_SIZE, MEM3_BLOCK_SIZE,
// MEM4_BLOCK_SIZE, MEM5_BLOCK_SIZE, MEM6_BLOCK_SIZE
// }; /* ÄÚ´æ·Ö¿é´óС */
//const uint32_t memsizeSRAMBANK = {MEM1_MAX_SIZE, MEM2_MAX_SIZE, MEM3_MAX_SIZE,
// MEM4_MAX_SIZE, MEM5_MAX_SIZE, MEM6_MAX_SIZE
// }; /* ÄÚ´æ×Ü´óС */
/* ÄÚ´æ¹ÜÀí¿ØÖÆÆ÷ */
//struct _m_mallco_dev mallco_dev =
//{
// my_mem_init, /* ÄÚ´æ³õʼ>>¯ */
// my_mem_perused, /* ÄÚ´æÊ¹ÓÃÂÊ */
// mem1base, mem2base, mem3base, mem4base, mem5base, mem6base, /* ÄÚ´æ³Ø */
// mem1mapbase, mem2mapbase, mem3mapbase, mem4mapbase, mem5mapbase, mem6mapbase, /* ÄÚ´æ¹ÜÀí״̬±í */
// 0, 0, 0, 0, 0, 0, /* ÄÚ´æ¹ÜÀíδ¾ÍÐ÷ */
//};
/* ÄÚ´æ¹ÜÀí²ÎÊý */
const uint32_t memtblsizeSRAMBANK = {MEM1_ALLOC_TABLE_SIZE, MEM2_ALLOC_TABLE_SIZE
}; /* ÄÚ´æ±í´óС */
const uint32_t memblksizeSRAMBANK = {MEM1_BLOCK_SIZE, MEM2_BLOCK_SIZE
}; /* ÄÚ´æ·Ö¿é´óС */
const uint32_t memsizeSRAMBANK = {MEM1_MAX_SIZE, MEM2_MAX_SIZE
}; /* ÄÚ´æ×Ü´óС */
struct _m_mallco_dev mallco_dev =
{
my_mem_init, /* ÄÚ´æ³õʼ>>¯ */
my_mem_perused, /* ÄÚ´æÊ¹ÓÃÂÊ */
{mem1base, mem2base}, /* ÄÚ´æ³Ø */
{mem1mapbase, mem2mapbase}, /* ÄÚ´æ¹ÜÀí״̬±í */
{0, 0} /* ÄÚ´æ¹ÜÀíδ¾ÍÐ÷ */
};
/**
* @brief ¸´ÖÆÄÚ´æ
* @param *des : Ä¿µÄµØÖ·
* @param *src : Ô´µØÖ·
* @param n : ÐèÒª¸´ÖƵÄÄڴ泤¶È(×Ö½ÚΪµ¥Î>>)
* @retval ÎÞ
*/
void my_mem_copy(void *des, void *src, uint32_t n)
{
uint8_t *xdes = des;
uint8_t *xsrc = src;
while (n--) *xdes++ = *xsrc++;
}
/**
* @brief ÉèÖÃÄÚ´æÖµ
* @param *s : ÄÚ´æÊ×µØÖ·
* @param c : ÒªÉèÖõÄÖµ
* @param count : ÐèÒªÉèÖõÄÄÚ´æ´óС(×Ö½ÚΪµ¥Î>>)
* @retval ÎÞ
*/
void my_mem_set(void *s, uint8_t c, uint32_t count)
{
uint8_t *xs = s;
while (count--) *xs++ = c;
}
/**
* @brief ÄÚ´æ¹ÜÀí³õʼ>>¯
* @param memx : ËùÊôÄÚ´æ¿é
* @retval ÎÞ
*/
void my_mem_init(uint8_t memx)
{
uint8_t mttsize = sizeof(MT_TYPE); /* >>ñÈ¡memmapÊý×éµÄÀàÐͳ¤¶È(uint16_t /uint32_t)*/
my_mem_set(mallco_dev.memmapmemx, 0, memtblsizememx * mttsize); /* ÄÚ´æ×´Ì¬±íÊý¾ÝÇåÁã */
// mallco_dev.memrdymemx = 1; /* ÄÚ´æ¹ÜÀí³õʼ>>¯OK */
}
/**
* @brief >>ñÈ¡ÄÚ´æÊ¹ÓÃÂÊ
* @param memx : ËùÊôÄÚ´æ¿é
* @retval ʹÓÃÂÊ(À©´óÁË10±¶,0~1000,´ú±í0.0%~100.0%)
*/
uint16_t my_mem_perused(uint8_t memx)
{
uint32_t used = 0;
uint32_t i;
for (i = 0; i < memtblsizememx; i++)
{
if (mallco_dev.memmapmemxi)
{
used++;
}
}
return (used * 1000) / (memtblsizememx);
}
/**
* @brief ÄÚ´æ·ÖÅä(ÄÚ²¿µ÷ÓÃ)
* @param memx : ËùÊôÄÚ´æ¿é
* @param size : Òª·ÖÅäµÄÄÚ´æ´óС(×Ö½Ú)
* @retval ÄÚ´æÆ<<ÒÆµØÖ·
* @arg 0 ~ 0XFFFFFFFE : ÓÐЧµÄÄÚ´æÆ<<ÒÆµØÖ·
* @arg 0XFFFFFFFF : ÎÞЧµÄÄÚ´æÆ<<ÒÆµØÖ·
*/
static uint32_t my_mem_malloc(uint8_t memx, uint32_t size)
{
signed long offset = 0;
uint32_t nmemb; /* ÐèÒªµÄÄÚ´æ¿éÊý */
uint32_t cmemb = 0; /* Á¬Ðø¿ÕÄÚ´æ¿éÊý */
uint32_t i;
// if (!mallco_dev.memrdymemx)
{
// mallco_dev.init(memx); /* δ³õʼ>>¯,ÏÈÖ´Ðгõʼ>>¯ */
}
if (size == 0)
{
return 0XFFFFFFFF; /* ²>>ÐèÒª·ÖÅä */
}
nmemb = size / memblksizememx; /* >>ñÈ¡ÐèÒª·ÖÅäµÄÁ¬ÐøÄÚ´æ¿éÊý */
if (size % memblksizememx)
{
nmemb++;
}
for (offset = memtblsizememx - 1; offset >= 0; offset--) /* ËÑË÷Õû¸öÄÚ´æ¿ØÖÆÇø */
{
if (!mallco_dev.memmapmemxoffset)
{
cmemb++; /* Á¬Ðø¿ÕÄÚ´æ¿éÊýÔö¼Ó */
}
else
{
cmemb = 0; /* Á¬ÐøÄÚ´æ¿éÇåÁã */
}
if (cmemb == nmemb) /* ÕÒµ½ÁËÁ¬Ðønmemb¸ö¿ÕÄÚ´æ¿é */
{
for (i = 0; i < nmemb; i++) /* ±ê×¢ÄÚ´æ¿é·Ç¿Õ */
{
mallco_dev.memmapmemxoffset + i = nmemb;
}
return (offset * memblksizememx); /* ·µ>>ØÆ<<ÒÆµØÖ· */
}
}
return 0XFFFFFFFF; /* δÕÒµ½·ûºÏ·ÖÅäÌõ¼þµÄÄÚ´æ¿é */
}
/**
* @brief ÊÍ·ÅÄÚ´æ(ÄÚ²¿µ÷ÓÃ)
* @param memx : ËùÊôÄÚ´æ¿é
* @param offset : ÄÚ´æµØÖ·Æ<<ÒÆ
* @retval ÊͷŽá¹û
* @arg 0, Êͷųɹ¦;
* @arg 1, ÊÍ·Åʧ°Ü;
* @arg 2, ³¬ÇøÓòÁË(ʧ°Ü);
*/
static uint8_t my_mem_free(uint8_t memx, uint32_t offset)
{
int i;
// if (!mallco_dev.memrdymemx) /* δ³õʼ>>¯,ÏÈÖ´Ðгõʼ>>¯ */
{
// mallco_dev.init(memx);
// return 1; /* δ³õʼ>>¯ */
}
if (offset < memsizememx) /* Æ<<ÒÆÔÚÄÚ´æ³ØÄÚ. */
{
int index = offset / memblksizememx; /* Æ<<ÒÆËùÔÚÄÚ´æ¿éºÅÂë */
int nmemb = mallco_dev.memmapmemxindex; /* ÄÚ´æ¿éÊýÁ¿ */
for (i = 0; i < nmemb; i++) /* ÄÚ´æ¿éÇåÁã */
{
mallco_dev.memmapmemxindex + i = 0;
}
return 0;
}
else
{
return 2; /* Æ<<ÒÆ³¬ÇøÁË. */
}
}
/**
* @brief ÊÍ·ÅÄÚ´æ(Íⲿµ÷ÓÃ)
* @param memx : ËùÊôÄÚ´æ¿é
* @param ptr : ÄÚ´æÊ×µØÖ·
* @retval ÎÞ
*/
void myfree(uint8_t memx, void *ptr)
{
uint32_t offset;
if (ptr == NULL)
{
return; /* µØÖ·Îª0. */
}
offset = (uint32_t)ptr - (uint32_t)mallco_dev.membasememx;
my_mem_free(memx, offset); /* ÊÍ·ÅÄÚ´æ */
}
/**
* @brief ·ÖÅäÄÚ´æ(Íⲿµ÷ÓÃ)
* @param memx : ËùÊôÄÚ´æ¿é
* @param size : Òª·ÖÅäµÄÄÚ´æ´óС(×Ö½Ú)
* @retval ·ÖÅäµ½µÄÄÚ´æÊ×µØÖ·.
*/
void *mymalloc(uint8_t memx, uint32_t size)
{
uint32_t offset;
offset = my_mem_malloc(memx, size);
if (offset == 0XFFFFFFFF) /* ÉêÇë³ö´í */
{
return NULL; /* ·µ>>Ø¿Õ(0) */
}
else /* ÉêÇëÃ>>ÎÊÌâ, ·µ>>ØÊ×µØÖ· */
{
//
memset((void *)((uint32_t)mallco_dev.membasememx + offset),0 , size);//ruan added
return (void *)((uint32_t)mallco_dev.membasememx + offset);
}
}
/**
* @brief ÖØÐ·ÖÅäÄÚ´æ(Íⲿµ÷ÓÃ)
* @param memx : ËùÊôÄÚ´æ¿é
* @param *ptr : ¾ÉÄÚ´æÊ×µØÖ·
* @param size : Òª·ÖÅäµÄÄÚ´æ´óС(×Ö½Ú)
* @retval зÖÅäµ½µÄÄÚ´æÊ×µØÖ·.
*/
void *myrealloc(uint8_t memx, void *ptr, uint32_t size)
{
uint32_t offset;
offset = my_mem_malloc(memx, size);
if (offset == 0XFFFFFFFF) /* ÉêÇë³ö´í */
{
return NULL; /* ·µ>>Ø¿Õ(0) */
}
else /* ÉêÇëÃ>>ÎÊÌâ, ·µ>>ØÊ×µØÖ· */
{
my_mem_copy((void *)((uint32_t)mallco_dev.membasememx + offset), ptr, size); /* ¿½±´¾ÉÄÚ´æÄÚÈݵ½ÐÂÄÚ´æ */
myfree(memx, ptr); /* ÊͷžÉÄÚ´æ */
return (void *)((uint32_t)mallco_dev.membasememx + offset); /* ·µ>>ØÐÂÄÚ´æÊ×µØÖ· */
}
}