mymalloc函数里增加memset来初始化数据 全为0,能解决一些奇怪的问题,

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); /* ·µ>>ØÐÂÄÚ´æÊ×µØÖ· */

}

}

相关推荐
计算机安禾2 小时前
【算法分析与设计】第43篇:空间复杂度类与Savitch定理
java·服务器·网络·数据库·算法
8Qi82 小时前
LeetCode 416:分割等和子集 —— (0-1背包)
java·算法·leetcode·动态规划·背包问题·01背包
智者知已应修善业2 小时前
【51单片机数码管驱动2位显示0-99按键3短按+1长按+10按键4短按-1长按清零,按键不影响数码管显示】2023-8-16
c++·经验分享·笔记·算法·51单片机
rou2 小时前
Stream Response
算法
_Evan_Yao2 小时前
如何高效刷LeetCode?大一版“从零开始”
算法·leetcode·职场和发展
吴可可1233 小时前
Win7 64位是CAD2014+C#开发最佳系统
算法
_日拱一卒3 小时前
LeetCode:78子集
数据结构·算法·leetcode·职场和发展
ulias2123 小时前
深挖进程间通信的奥秘
java·linux·服务器·开发语言·c++·算法
8Qi83 小时前
LeetCode 62 & 63:不同路径 I & II(含障碍物)
java·算法·leetcode·职场和发展·动态规划