Ó²ººÇ¶ÈëʽÂÛ̳

 ÕÒ»ØÃÜÂë
 Á¢¼´×¢²á
²é¿´: 8992|»Ø¸´: 30
ÊÕÆð×ó²à

ÂÛ̳Ê×·¢£¬ÄÚ´æ¹ÜÀíËã·¨£¬Ö§³Ömalloc,realloc,align_alloc£¬ÅäÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨£¨v1.2)

  [¸´ÖÆÁ´½Ó]

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
·¢±íÓÚ 2021-9-3 11:12:56 | ÏÔʾȫ²¿Â¥²ã |ÔĶÁģʽ
±¾Ìû×îºóÓÉ WZH ÓÚ 2021-9-3 11:15 ±à¼­

ǰÎÄ£ºÂÛ̳Ê×·¢£¬ÄÚ´æ¹ÜÀíËã·¨£¬Ö§³Ömalloc,realloc,align_alloc£¬ÅäÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨http://armbbs.cn/forum.php?mod=v ... 08321&fromuid=24016
(³ö´¦: Ó²ººÇ¶ÈëʽÂÛ̳)
±¾´ÎËã·¨½øÐÐÁ˲¿·Ö¸üУ¬Ö÷ÒªÌí¼ÓÄÚ´æ³ØÊ½µÄ³õʼ»¯Óë·ÖÅä·½·¨£¬ÓëÓ²ºº¸çÔÚH7½Ì³ÌÖеÄÄÚ´æ¹ÜÀí·½·¨Ê¹Ó÷½Ê½ÍêȫһÖ£¬ÁíÍâ´úÂëÊǸù¾ÝC99±ê×¼±àдµÄ£¬Òò´Ë±àÒëʱÐèÒª¹´Ñ¡C99Ñ¡Ïî¡£
mem_manage.h
  1. /********************************************************************************
  2. * @File name: mem_manage.h
  3. * @Author: wzh
  4. * @Version: 1.2
  5. * @Date: 2021-9-3
  6. * @Description: ÄÚ´æ¹ÜÀíËã·¨£¬´øÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨£¬Ö§³Ömalloc¡¢align_alloc¡¢
  7. *                                realloc¡¢freeµÈ³£¼ûµÄÄÚ´æ¹ÜÀíº¯Êý£¬Ö§³Ö¶à¿éÄÚ´æºÏ²¢¹ÜÀí
  8. *¸üмǼ£º
  9. *                v1.0 2021-8-13  Ìí¼ÓMem_Manage_Heap_Init¡¢Mem_Manage_Malloc¡¢Mem_Manage_Realloc
  10.                                                 Mem_Manage_Aligned_Allocº¯Êý
  11.                 v1.1 2021-8-14        Ìí¼ÓMem_Manage_Get_Stateº¯Êý
  12.                 v1.2 2021-9-3        ¸ü¸ÄMem_Root½á¹¹Ìå³ÉÔ±£»¸ü¸ÄMem_State½á¹¹Ìå³ÉÔ±£»
  13.                                                 Ìí¼Óö¾ÙÀàÐÍMem_Err_Type£»½«º¯ÊýMem_Manage_Heap_InitÖØÃüÃûΪ
  14.                                                 Mem_Manage_Init£»ÐÞ¸ÄMem_Manage_Initº¯ÊýÉùÃ÷£»Ìí¼Óº¯ÊýMem_Manage_Get_Total_Size¡¢
  15.                                                 Mem_Manage_Get_Remain_Size¡¢Mem_Manage_Get_Errflag¡¢Mem_Manage_Pool_Init¡¢
  16.                                                 Mem_Manage_Pool_Malloc¡¢Mem_Manage_Pool_Realloc¡¢Mem_Manage_Pool_Aligned_Alloc¡¢
  17.                                                 Mem_Manage_Pool_Free¡¢Mem_Manage_Pool_Get_State¡¢Mem_Manage_Pool_Get_Total_Size¡¢
  18.                                                 Mem_Manage_Pool_Get_Remain_Size¡¢Mem_Manage_Pool_Get_Errflag£»
  19. * @Todo        ¾ßÌåʹÓ÷½·¨ÈçÏÂ
  20. *                 1¡¢Ê¹ÓÃMem_Manage_Init(Mem_Root* pRoot, const Mem_Region* pRigon)³õʼ»¯
  21. *                        ÄÚ´æÇø£¬pRootΪ¾ä±ú£¬pRigonÃèÊöÁËÄÚ´æÇø¸öÊýÒÔ¼°ÄÚ¸öÄÚ´æÇøÆðʼµØÖ·ºÍ´óС
  22. *                        pRigonµÄ¸ñʽÈçÏÂ
  23. *                        const Mem_Region pRigon[]=
  24. *                        {
  25. *                                (void*)(0x20000000),512*1024,
  26. *                                (void*)(0x80000000),256*1024,
  27. *                                ....
  28. *                                NULL,0
  29. *                        }
  30. *                        ×¢ÒâµØÖ·±ØÐèÓɵ͵½¸ßÅÅÁУ¬Í¬Ê±Ê¹ÓÃNULL£¬0±êʶ½á⣬ÄÚ´æÇøÈÝÁ¿²»ÒªÌ«Ð¡£¬ÖÁÉÙ´óÓÚ64¸ö×Ö½Ú
  31. *                 2¡¢Ê¹ÓÃMem_Manage_Malloc¡¢Mem_Manage_Realloc¡¢Mem_Manage_Aligned_Alloc½øÐÐÄÚ´æ
  32. *                        ·ÖÅ䣬ÆäÖÐMem_Manage_Malloc¡¢Mem_Manage_ReallocĬÈϾùΪ8×Ö½Ú¶ÔÆë£¬¿ÉÐÞ¸Ä
  33. *                        .cÎļþÖеĺ궨ÒåÐ޸ģ¬Mem_Manage_Aligned_Alloc¿ÉÒÔÖ¸¶¨µØÖ·¶ÔÆë£¬µ«¶ÔÆëµÄ²ÎÊý
  34. *                        ÓÐÏÞÖÆ£¬align_sizeÐèҪΪ2µÄÕûÊý´ÎÃÝ£¬·ñÔò»áÖ±½Ó·µ»ØNULL¡£
  35. *                 3¡¢ÄÚ´æÊ¹ÓÃÍê±ÏºóʹÓÃMem_Manage_Free½øÐÐÄÚ´æÊÍ·Å
  36. *                 4¡¢¿Éͨ¹ýMem_Manage_Get_State²é¿´¿ÕÏÐÄÚ´æ×´Ì¬£¬Í¨¹ýMem_Manage_Get_Total_Size»ñÈ¡×ÜÄڴ棬
  37. *                        Í¨¹ýMem_Manage_Get_Remain_Size»ñȡʣÓàÄÚ´æ               
  38. *                 5¡¢Ëã·¨¹ÜÀíµÄµ¥¸öÄÚ´æÉÏÏÞΪ2GB£¨32λ»ú£©
  39. ********************************************************************************/
  40. #ifndef MEM_MANAGE_H_
  41. #define MEM_MANAGE_H_

  42. #include <stddef.h>
  43. #include <stdbool.h>

  44. #ifdef __cplusplus
  45. extern "C" {
  46. #endif

  47. typedef enum {
  48.         MEM_NO_ERR=0X1234,                //ÎÞ´íÎó
  49.         MEM_NO_INIT=0,                        //ÄÚ´æÇøÎ´³õʼ»¯
  50.         MEM_OVER_WRITE=1                //ÄÚ´æÇø½ÚµãÐÅϢλÖÃÊý¾ÝËð»µ
  51. }Mem_Err_Type;

  52. typedef struct Mem_Region {
  53.         void*        addr;//ÄÚ´æÇøÆðʼµØÖ·
  54.         size_t        mem_size;//ÄÚ´æ´óС
  55. }Mem_Region;

  56. typedef struct Mem_Node {
  57.         struct Mem_Node* next_node;
  58.         size_t mem_size;
  59. }Mem_Node;

  60. typedef struct Mem_Root {
  61.         Mem_Node* pStart;
  62.         Mem_Node* pEnd;
  63.         size_t total_size;                //×ÜÄÚ´æ
  64.         size_t remain_size;                //Ê£ÓàÄÚ´æ
  65.         Mem_Err_Type err_flag;        //´íÎó±ê¼Ç
  66. }Mem_Root;

  67. typedef struct Mem_State {
  68.         size_t free_node_num;        //¿ÕÏнڵã¸öÊý
  69.         size_t max_node_size;        //×î´ó½ÚµãÄÚ´æ
  70.         size_t min_node_size;        //×îС½ÚµãÄÚ´æ
  71. }Mem_State;


  72. bool Mem_Manage_Init(Mem_Root* pRoot, const Mem_Region* pRigon);
  73. void* Mem_Manage_Malloc(Mem_Root* pRoot, size_t want_size);
  74. void* Mem_Manage_Realloc(Mem_Root* pRoot, void* src_addr, size_t want_size);
  75. void* Mem_Manage_Aligned_Alloc(Mem_Root* pRoot, size_t align_size, size_t want_size);
  76. void Mem_Manage_Free(Mem_Root* pRoot, void* addr);
  77. void Mem_Manage_Get_State(Mem_Root* pRoot, Mem_State* pState);
  78. size_t Mem_Manage_Get_Total_Size(const Mem_Root* pRoot);
  79. size_t Mem_Manage_Get_Remain_Size(const Mem_Root* pRoot);
  80. Mem_Err_Type Mem_Manage_Get_Errflag(const Mem_Root* pRoot);

  81. bool Mem_Manage_Pool_Init(void* mem_addr,size_t mem_size);
  82. void* Mem_Manage_Pool_Malloc(void* mem_addr,size_t want_size);
  83. void* Mem_Manage_Pool_Realloc(void* mem_addr,void* src_addr,size_t want_size);
  84. void* Mem_Manage_Pool_Aligned_Alloc(void* mem_addr,size_t align_byte,size_t want_size);
  85. void Mem_Manage_Pool_Free(void* mem_addr,void* free_addr);
  86. void Mem_Manage_Pool_Get_State(void* mem_addr,Mem_State* pState);
  87. size_t Mem_Manage_Pool_Get_Total_Size(const void* mem_addr);
  88. size_t Mem_Manage_Pool_Get_Remain_Size(const void* mem_addr);
  89. Mem_Err_Type Mem_Manage_Pool_Get_Errflag(const void* mem_addr);

  90. #ifdef __cplusplus
  91. }
  92. #endif

  93. #endif

¸´ÖÆ´úÂë

mem_manage.h
  1. /********************************************************************************
  2. * @File name: mem_manage.c
  3. * @Author: wzh
  4. * @Version: 1.2
  5. * @Date: 2021-9-3
  6. * @Description: ÄÚ´æ¹ÜÀíËã·¨£¬´øÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨£¬Ö§³Ömalloc¡¢align_alloc¡¢
  7. *                                realloc¡¢freeµÈ³£¼ûµÄÄÚ´æ¹ÜÀíº¯Êý£¬Ö§³Ö¶à¿éÄÚ´æºÏ²¢¹ÜÀí
  8. *¸üмǼ£º
  9. *                v1.0 2021-8-13  Ìí¼ÓMem_Manage_Heap_Init¡¢Mem_Manage_Malloc¡¢Mem_Manage_Realloc
  10.                                                 Mem_Manage_Aligned_Allocº¯Êý
  11.                 v1.1 2021-8-14        Ìí¼ÓMem_Manage_Get_Stateº¯Êý
  12.                 v1.2 2021-9-3        ¸ü¸ÄMem_Root½á¹¹Ìå³ÉÔ±£»¸ü¸ÄMem_State½á¹¹Ìå³ÉÔ±£»
  13.                                                 Ìí¼Óö¾ÙÀàÐÍMem_Err_Type£»½«º¯ÊýMem_Manage_Heap_InitÖØÃüÃûΪ
  14.                                                 Mem_Manage_Init£»ÐÞ¸ÄMem_Manage_Initº¯ÊýÉùÃ÷£»Ìí¼Óº¯ÊýMem_Manage_Get_Total_Size¡¢
  15.                                                 Mem_Manage_Get_Remain_Size¡¢Mem_Manage_Get_Errflag¡¢Mem_Manage_Pool_Init¡¢
  16.                                                 Mem_Manage_Pool_Malloc¡¢Mem_Manage_Pool_Realloc¡¢Mem_Manage_Pool_Aligned_Alloc¡¢
  17.                                                 Mem_Manage_Pool_Free¡¢Mem_Manage_Pool_Get_State¡¢Mem_Manage_Pool_Get_Total_Size¡¢
  18.                                                 Mem_Manage_Pool_Get_Remain_Size¡¢Mem_Manage_Pool_Get_Errflag£»
  19. ********************************************************************************/
  20. #include <stdint.h>
  21. #include <string.h>
  22. #include "mem_manage.h"

  23. #define MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT                8
  24. #define MEM_MANAGE_BITS_PER_BYTE                                8
  25. #define MEM_MANAGE_MEM_STRUCT_SIZE                                Mem_Manage_Align_Up(sizeof(Mem_Node),MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
  26. #define MEM_MANAGE_MINUM_MEM_SIZE                                (MEM_MANAGE_MEM_STRUCT_SIZE<<1)
  27. #define MEM_MANAGE_ALLOCA_LABAL                                        ((size_t)(1<<(sizeof(size_t)*MEM_MANAGE_BITS_PER_BYTE-1)))
  28. #define MEM_MANAGE_MINUM_NODE_SIZE                                (MEM_MANAGE_MEM_STRUCT_SIZE+MEM_MANAGE_MINUM_MEM_SIZE)
  29. #define MEM_MANAGE_MEM_ROOT_SIZE                                Mem_Manage_Align_Up(sizeof(Mem_Root),MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)

  30. static __inline size_t Mem_Manage_Align_Down(size_t data, size_t align_byte) {
  31.         return data&~(align_byte - 1);
  32. }

  33. static __inline size_t Mem_Manage_Align_Up(size_t data, size_t align_byte) {
  34.         return (data + align_byte - 1)&~(align_byte - 1);
  35. }

  36. static __inline Mem_Node* Mem_Manage_Addr_To_Mem(const void* addr) {
  37.         return (Mem_Node*)((const uint8_t*)addr - MEM_MANAGE_MEM_STRUCT_SIZE);
  38. }

  39. static __inline void* Mem_Manage_Mem_To_Addr(const Mem_Node* mem_node) {
  40.         return (void*)((const uint8_t*)mem_node + MEM_MANAGE_MEM_STRUCT_SIZE);
  41. }

  42. //½«ÄÚ´æ½Úµã²åÈë¿ÕÏÐÁбíÖÐ
  43. static __inline void Mem_Insert_Node_To_FreeList(Mem_Root* pRoot, Mem_Node* pNode) {
  44.         Mem_Node* pPriv_Node;
  45.         Mem_Node* pNext_Node;
  46.         //ѰÕÒµØÖ·ÓëpNodeÏà½üµÄ½Úµã
  47.         for (pPriv_Node = pRoot->pStart; pPriv_Node->next_node < pNode; pPriv_Node = pPriv_Node->next_node);
  48.         pNext_Node = pPriv_Node->next_node;
  49.         pRoot->remain_size += pNode->mem_size;
  50.         //³¢ÊÔpNodeÓëǰһ¸ö¿é½øÐкϲ¢
  51.         if ((uint8_t*)Mem_Manage_Mem_To_Addr(pPriv_Node) + pPriv_Node->mem_size == (uint8_t*)pNode) {
  52.                 if (pPriv_Node != pRoot->pStart) {//²»ÊÇStart¿éµÄ»°¿ÉÒԺϲ¢
  53.                         pPriv_Node->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNode->mem_size;
  54.                         pRoot->remain_size += MEM_MANAGE_MEM_STRUCT_SIZE;
  55.                         pNode = pPriv_Node;
  56.                 }
  57.                 else {//ºóÃæÈç¹ûÊÇStart¿é²»½øÐкϲ¢£¬ÒÔÃâÀË·ÑÄÚ´æ
  58.                         pRoot->pStart->next_node = pNode;
  59.                 }
  60.         }
  61.         else {//²»Äܺϲ¢Ê±Ö±½Ó²åÈëµ½¿ÕÏе¥Á´±íÖÐ
  62.                 pPriv_Node->next_node = pNode;
  63.         }
  64.         //³¢ÊÔºóÃæÒ»¸ö¿éÓëpNode½øÐкϲ¢
  65.         if ((uint8_t*)Mem_Manage_Mem_To_Addr(pNode) + pNode->mem_size == (uint8_t*)pNext_Node) {
  66.                 if (pNext_Node != pRoot->pEnd) {//²»ÊÇend¿éµÄ»°¿ÉÒÔ½øÐпéºÏ²¢
  67.                         pNode->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNext_Node->mem_size;
  68.                         pRoot->remain_size += MEM_MANAGE_MEM_STRUCT_SIZE;
  69.                         pNode->next_node = pNext_Node->next_node;
  70.                 }
  71.                 else {//ºóÃæÈç¹ûÊÇend¿é²»½øÐкϲ¢£¬ÒÔÃâÀË·ÑÄÚ´æ
  72.                         pNode->next_node = pRoot->pEnd;
  73.                 }
  74.         }
  75.         else {//²»Äܺϲ¢Ê±Ö±½Ó²åÈëµ½¿ÕÏе¥Á´±íÖÐ
  76.                 pNode->next_node = pNext_Node;
  77.         }
  78. }

  79. static __inline void Mem_Settle(Mem_Root* pRoot){
  80.         Mem_Node* pNode=pRoot->pStart->next_node;
  81.         while(pNode->next_node!=pRoot->pEnd){
  82.                 if((uint8_t*)Mem_Manage_Mem_To_Addr(pNode)+pNode->mem_size==(uint8_t*)pNode->next_node){
  83.                         pNode->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE+pNode->next_node->mem_size;
  84.                         pRoot->remain_size += MEM_MANAGE_MEM_STRUCT_SIZE;
  85.                         pNode->next_node=pNode->next_node->next_node;
  86.                 }
  87.                 else
  88.                         pNode=pNode->next_node;
  89.         }
  90. }

  91. //»ñÈ¡¹ÜÀíÄÚ´æµÄ״̬
  92. //pRoot:¾ä±úÖ¸Õë
  93. //pState:״̬ÐÅÏ¢½á¹¹ÌåÖ¸Õë
  94. //return:ÎÞ·µ»ØÖµ
  95. void Mem_Manage_Get_State(Mem_Root* pRoot,Mem_State* pState) {
  96.         
  97.         if(pRoot->err_flag!=MEM_NO_ERR){
  98.                 pState->free_node_num=0;
  99.                 pState->max_node_size=0;
  100.                 pState->min_node_size=0;
  101.                 return;
  102.         }
  103.         
  104.         if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
  105.                 pRoot->err_flag=MEM_NO_INIT;
  106.                 pState->free_node_num=0;
  107.                 pState->max_node_size=0;
  108.                 pState->min_node_size=0;
  109.                 return;
  110.         }
  111.         pState->max_node_size = pRoot->pStart->next_node->mem_size;
  112.         pState->min_node_size = pRoot->pStart->next_node->mem_size;
  113.         pState->free_node_num = 0;
  114.         for (Mem_Node* pNode = pRoot->pStart->next_node; pNode->next_node != NULL; pNode = pNode->next_node) {
  115.                 pState->free_node_num ++;
  116.                 if (pNode->mem_size > pState->max_node_size)
  117.                         pState->max_node_size = pNode->mem_size;
  118.                 if (pNode->mem_size < pState->min_node_size)
  119.                         pState->min_node_size = pNode->mem_size;
  120.         }
  121. }

  122. //ÓëC¿âº¯Êýaligned_alloc×÷ÓÃÒ»ÖÂ
  123. //pRoot:¾ä±úÖ¸Õë
  124. //align_size:ÆÚÍû·ÖÅäµÄÄڴ漸×Ö½Ú¶ÔÆë£¨8¡¢16¡¢32...)
  125. //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
  126. //return:        NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
  127. //                        ÆäËûÖµ ·ÖÅä³É¹¦
  128. void* Mem_Manage_Aligned_Alloc(Mem_Root* pRoot,size_t align_size, size_t want_size) {
  129.         void* pReturn = NULL;
  130.         Mem_Node* pPriv_Node,*pNow_Node;

  131.         if(pRoot->err_flag!=MEM_NO_ERR){
  132.                 return NULL;
  133.         }
  134.         
  135.         if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
  136.                 pRoot->err_flag=MEM_NO_INIT;
  137.                 return NULL;
  138.         }
  139.         
  140.         if (want_size == 0) {
  141.                 return NULL;
  142.         }

  143.         if ((want_size&MEM_MANAGE_ALLOCA_LABAL) != 0) {//ÄÚ´æ¹ý´ó
  144.                 return NULL;
  145.         }

  146.         if (align_size&(align_size - 1)) {//ÄÚ´æ¶ÔÆëÊäÈë·Ç·¨Öµ
  147.                 return NULL;
  148.         }
  149.         
  150.         if (want_size < MEM_MANAGE_MINUM_MEM_SIZE)
  151.                 want_size = MEM_MANAGE_MINUM_MEM_SIZE;
  152.         if (align_size < MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
  153.                 align_size = MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT;
  154.         //È·±£·ÖÅäµÄµ¥Ôª¶¼ÊÇMEM_MANAGE_ALIGNMENT_BYTE_DEFAULTµÄÕûÊý±¶
  155.         want_size = Mem_Manage_Align_Up(want_size, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);

  156.         pPriv_Node = pRoot->pStart;
  157.         pNow_Node = pRoot->pStart->next_node;
  158.         
  159.         while (pNow_Node->next_node != NULL) {
  160.                 if (pNow_Node->mem_size >= want_size+ MEM_MANAGE_MEM_STRUCT_SIZE) {
  161.                         size_t use_align_size;
  162.                         size_t new_size;
  163.                         pReturn = (void*)Mem_Manage_Align_Up((size_t)Mem_Manage_Mem_To_Addr(pNow_Node), align_size);//¼ÆËã³ö¶ÔÆëµÄµØÖ·
  164.                         use_align_size = (uint8_t*)pReturn-(uint8_t*)Mem_Manage_Mem_To_Addr(pNow_Node);//¼ÆËã¶ÔÆëËùÏûºÄµÄÄÚ´æ
  165.                         if (use_align_size != 0) {//ÄÚ´æ²»¶ÔÆë
  166.                                 if (use_align_size < MEM_MANAGE_MINUM_NODE_SIZE) {//²»¶ÔÆëµÄÖµ¹ýС
  167.                                         pReturn = (void*)Mem_Manage_Align_Up(\
  168.                                                 (size_t)Mem_Manage_Mem_To_Addr(pNow_Node)+ MEM_MANAGE_MINUM_NODE_SIZE, align_size);
  169.                                         use_align_size = (uint8_t*)pReturn - (uint8_t*)Mem_Manage_Mem_To_Addr(pNow_Node);
  170.                                 }
  171.                                 if (use_align_size <= pNow_Node->mem_size) {
  172.                                         new_size = pNow_Node->mem_size - use_align_size;//¼ÆËãÈ¥³ý¶ÔÆëÏûºÄµÄÄÚ´æÊ£ÏµÄÄÚ´æ´óС
  173.                                         if (new_size >= want_size) {//Âú×ãÌõ¼þ£¬¿ÉÒÔ½øÐзÖÅä
  174.                                                 Mem_Node* pNew_Node = Mem_Manage_Addr_To_Mem(pReturn);
  175.                                                 pNow_Node->mem_size -= new_size + MEM_MANAGE_MEM_STRUCT_SIZE;//·ÖÁѽڵã
  176.                                                 pRoot->remain_size -= new_size + MEM_MANAGE_MEM_STRUCT_SIZE;
  177.                                                 pNew_Node->mem_size = new_size;//нڵ㱾À´Ò²²»ÔÚ¿ÕÏÐÁ´±íÖУ¬²»ÓôӿÕÏÐÁ´±íÖÐÅųö
  178.                                                 pNew_Node->next_node = (Mem_Node*)MEM_NO_ERR;
  179.                                                 pNow_Node = pNew_Node;
  180.                                                 break;
  181.                                         }
  182.                                 }
  183.                         }
  184.                         else {//ÄÚ´æÖ±½Ó¾ÍÊÇ¶ÔÆëµÄ
  185.                                 pPriv_Node->next_node = pNow_Node->next_node;//Åųö¿ÕÏÐÁ´±í
  186.                                 pNow_Node->next_node = (Mem_Node*)MEM_NO_ERR;
  187.                                 pRoot->remain_size -= pNow_Node->mem_size;
  188.                                 break;
  189.                         }
  190.                 }
  191.                 pPriv_Node = pNow_Node;
  192.                 pNow_Node = pNow_Node->next_node;
  193.         }

  194.         if (pNow_Node->next_node == NULL){//·ÖÅäʧ°Ü
  195.                 if(pNow_Node!=pRoot->pEnd){
  196.                         pRoot->err_flag=MEM_OVER_WRITE;
  197.                 }
  198.                 return NULL;
  199.         }
  200.         pNow_Node->next_node = NULL;
  201.         if (pNow_Node->mem_size >= MEM_MANAGE_MINUM_NODE_SIZE + want_size) {//½ÚµãÄڴ滹Óи»Óà
  202.                 Mem_Node* pNew_Node =(Mem_Node*)((uint8_t*)Mem_Manage_Mem_To_Addr(pNow_Node) + want_size);//¼ÆËã½«ÒªÒÆÈë¿ÕÏÐÁ´±íµÄ½ÚµãµØÖ·
  203.                 pNew_Node->mem_size = pNow_Node->mem_size - want_size - MEM_MANAGE_MEM_STRUCT_SIZE;
  204.                 pNew_Node->next_node = NULL;
  205.                 pNow_Node->mem_size = want_size;
  206.                 Mem_Insert_Node_To_FreeList(pRoot, pNew_Node);
  207.         }
  208.         pNow_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//±ê¼ÇÄÚ´æÒÑ·ÖÅä
  209.         return pReturn;
  210. }

  211. //ÓëC¿âº¯Êýmalloc×÷ÓÃÏàͬ
  212. //pRoot:¾ä±úÖ¸Õë
  213. //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
  214. //return:        NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
  215. //                        ÆäËûÖµ ·ÖÅä³É¹¦
  216. void* Mem_Manage_Malloc(Mem_Root* pRoot, size_t want_size) {
  217.         return Mem_Manage_Aligned_Alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
  218. }

  219. //ÓëC¿âº¯Êýrealloc×÷ÓÃÏàͬ
  220. //pRoot:¾ä±úÖ¸Õë
  221. //src_addr:Ô´µØÖ·Ö¸Õë
  222. //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
  223. //return:        NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß¾ä±ú´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
  224. //                        ÆäËûÖµ ·ÖÅä³É¹¦
  225. void* Mem_Manage_Realloc(Mem_Root* pRoot, void* src_addr, size_t want_size) {
  226.         void* pReturn = NULL;
  227.         Mem_Node* pNext_Node,*pPriv_Node;
  228.         Mem_Node* pSrc_Node;
  229.         
  230.         if(pRoot->err_flag!=MEM_NO_ERR){
  231.                 return NULL;
  232.         }
  233.         
  234.         if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
  235.                 pRoot->err_flag=MEM_NO_INIT;
  236.                 return NULL;
  237.         }
  238.         
  239.         if (src_addr == NULL) {
  240.                 return Mem_Manage_Aligned_Alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
  241.         }
  242.         if (want_size == 0) {
  243.                 Mem_Manage_Free(pRoot, src_addr);
  244.                 return NULL;
  245.         }

  246.         if ((want_size&MEM_MANAGE_ALLOCA_LABAL) != 0){
  247.                 return NULL;
  248.         }

  249.         pSrc_Node = Mem_Manage_Addr_To_Mem(src_addr);

  250.         if ((pSrc_Node->mem_size&MEM_MANAGE_ALLOCA_LABAL) == 0) {//Ô´µØÖ·Î´±»·ÖÅ䣬µ÷ÓôíÎó
  251.                 pRoot->err_flag=MEM_OVER_WRITE;
  252.                 return NULL;
  253.         }

  254.         pSrc_Node->mem_size &= ~MEM_MANAGE_ALLOCA_LABAL;//Çå³ý·ÖÅä±ê¼Ç
  255.         if (pSrc_Node->mem_size >= want_size) {//¿éÔ¤ÁôµØÖ·×ã¹»´ó
  256.                 pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
  257.                 pReturn = src_addr;
  258.                 return pReturn;
  259.         }
  260.         //¿ªÊ¼ÔÚ¿ÕÏÐÁбíÖÐѰÕÒÓë±¾¿éÏà½üµÄ¿é
  261.         for (pPriv_Node = pRoot->pStart; pPriv_Node->next_node <pSrc_Node; pPriv_Node = pPriv_Node->next_node);
  262.         pNext_Node = pPriv_Node->next_node;

  263.         if (pNext_Node != pRoot->pEnd && \
  264.                 ((uint8_t*)src_addr + pSrc_Node->mem_size == (uint8_t*)pNext_Node) && \
  265.                 (pSrc_Node->mem_size + pNext_Node->mem_size + MEM_MANAGE_MEM_STRUCT_SIZE >= want_size)) {
  266.                 //Âú×ãÏÂÒ»½Úµã·Çend£¬ÄÚ´æÁ¬Ðø£¬ÄÚ´æÊ£Óà×ã¹»
  267.                 pReturn = src_addr;
  268.                 pPriv_Node->next_node = pNext_Node->next_node;//Åųö¿ÕÏÐÁбí
  269.                 pRoot->remain_size -= pNext_Node->mem_size;
  270.                 pSrc_Node->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNext_Node->mem_size;
  271.                 want_size = Mem_Manage_Align_Up(want_size, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  272.                 if (pSrc_Node->mem_size >= MEM_MANAGE_MINUM_NODE_SIZE+ want_size) {//È¥³ý·ÖÅäµÄÊ£Óà¿Õ¼ä×ã¹»¿ª±Ùпé
  273.                         Mem_Node* pNew_Node = (Mem_Node*)((uint8_t*)Mem_Manage_Mem_To_Addr(pSrc_Node) + want_size);
  274.                         pNew_Node->next_node = NULL;
  275.                         pNew_Node->mem_size = pSrc_Node->mem_size - want_size - MEM_MANAGE_MEM_STRUCT_SIZE;
  276.                         pSrc_Node->mem_size = want_size;
  277.                         Mem_Insert_Node_To_FreeList(pRoot, pNew_Node);
  278.                 }
  279.                 pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
  280.         }
  281.         else {
  282.                 pReturn = Mem_Manage_Aligned_Alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
  283.                 if (pReturn == NULL){
  284.                         pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
  285.                         return NULL;
  286.                 }
  287.                 memcpy(pReturn, src_addr, pSrc_Node->mem_size);
  288.                 pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
  289.                 Mem_Manage_Free(pRoot, src_addr);
  290.         }
  291.         return pReturn;
  292. }

  293. //ÓëC¿âº¯Êýfree×÷ÓÃÒ»ÖÂ
  294. //pRoot:¾ä±úÖ¸Õë
  295. //addr:ÊÍ·ÅÄÚ´æµÄÊ×µØÖ·
  296. //return:ÎÞ·µ»ØÖµ
  297. void Mem_Manage_Free(Mem_Root* pRoot,void* addr) {
  298.         Mem_Node* pFree_Node;
  299.         
  300.         if(pRoot->err_flag!=MEM_NO_ERR){
  301.                 return;
  302.         }
  303.         
  304.         if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
  305.                 pRoot->err_flag=MEM_NO_INIT;
  306.                 return;
  307.         }
  308.         
  309.         if (addr == NULL) {
  310.                 return;
  311.         }
  312.         pFree_Node = Mem_Manage_Addr_To_Mem(addr);

  313.         if ((pFree_Node->mem_size&MEM_MANAGE_ALLOCA_LABAL) == 0) {//ÊÍ·Å´íÎó£¬Ã»Óбê¼Ç
  314.                 pRoot->err_flag=MEM_OVER_WRITE;
  315.                 return;
  316.         }

  317.         if (pFree_Node->next_node != NULL) {//ÊÍ·Å´íÎó
  318.                 pRoot->err_flag=MEM_OVER_WRITE;
  319.                 return;
  320.         }
  321.         pFree_Node->mem_size &= ~MEM_MANAGE_ALLOCA_LABAL;//Çå³ý·ÖÅä±ê¼Ç
  322.         Mem_Insert_Node_To_FreeList(pRoot, pFree_Node);//²åÈëµ½¿ÕÏÐÁ´±íÖÐ
  323. }

  324. //»ñÈ¡¾ä±ú¹ÜÀíµÄÄÚ´æÇø×ÜÈÝÁ¿
  325. //pRoot:¾ä±úÖ¸Õë
  326. //return:ÄÚ´æÇø×ÜÈÝÁ¿£¨µ¥Î»£ºbyte£©
  327. size_t Mem_Manage_Get_Total_Size(const Mem_Root* pRoot){
  328.         return pRoot->total_size;
  329. }

  330. //»ñÈ¡¾ä±ú¹ÜÀíµÄÄÚ´æÇøÊ£ÓàÈÝÁ¿
  331. //pRoot:¾ä±úÖ¸Õë
  332. //return:ÄÚ´æÇøÊ£ÓàÈÝÁ¿£¨µ¥Î»£ºbyte£©
  333. size_t Mem_Manage_Get_Remain_Size(const Mem_Root* pRoot){
  334.         return pRoot->remain_size;
  335. }

  336. //»ñÈ¡¾ä±ú¹ÜÀíµÄÄÚ´æÇø´íÎó±ê¼Ç
  337. //pRoot:¾ä±úÖ¸Õë
  338. //return:´íÎó±ê¼Ç
  339. Mem_Err_Type Mem_Manage_Get_Errflag(const Mem_Root* pRoot){
  340.         return pRoot->err_flag;
  341. }

  342. //ÄÚ´æ¹ÜÀí¾ä±ú³õʼ»¯
  343. //pRoot:¾ä±úÖ¸Õë
  344. //pRigon:ÄÚ´æÇø½á¹¹ÌåÖ¸Õë
  345. //return:        true ³õʼ»¯³É¹¦;
  346. //                        false ³õʼ»¯Ê§°Ü
  347. bool Mem_Manage_Init(Mem_Root* pRoot,const Mem_Region* pRegion) {
  348.         Mem_Node* align_addr;
  349.         size_t align_size;
  350.         Mem_Node* pPriv_node=NULL;

  351.         pRoot->total_size = 0;
  352.         pRoot->pEnd = NULL;
  353.         pRoot->pStart = NULL;
  354.         pRoot->err_flag = MEM_NO_INIT;
  355.         pRoot->remain_size = 0;
  356.         for (; pRegion->addr != NULL; pRegion++) {
  357.                 align_addr = (Mem_Node*)Mem_Manage_Align_Up((size_t)pRegion->addr, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);//¼ÆËãÄÚ´æ¿é¶ÔÆëºóµÄµØÖ·
  358.                 if ((uint8_t*)align_addr > pRegion->mem_size+ (uint8_t*)pRegion->addr)//¶ÔÆëÏûºÄµÄÄڴ泬¹ýÄÚ´æÇø
  359.                         continue;
  360.                 align_size = pRegion->mem_size - ((uint8_t*)align_addr - (uint8_t*)pRegion->addr);//¼ÆËã¶ÔÆëºóʣϵÄÄÚ´æ´óС
  361.                 if (align_size < MEM_MANAGE_MINUM_MEM_SIZE+ MEM_MANAGE_MEM_STRUCT_SIZE)//¶ÔÆëʣϵÄÄÚ´æÌ«Ð¡
  362.                         continue;
  363.                 align_size -= MEM_MANAGE_MEM_STRUCT_SIZE;//Çó³ýÈ¥µô±íÍ·ºóÄÚ´æ¿éµÄ´óС
  364.                 align_addr->mem_size = align_size;
  365.                 align_addr->next_node = NULL;
  366.                 if (pRoot->pStart == NULL) {//Èç¹ûÊdzõʼ»¯
  367.                         pRoot->pStart = align_addr;//½«µ±Ç°ÄÚ´æ¿éµØÖ·¼ÇΪstart
  368.                         if (align_size >= MEM_MANAGE_MINUM_MEM_SIZE+ MEM_MANAGE_MEM_STRUCT_SIZE) {//ÈôʣϵĿé×ã¹»´ó
  369.                                 align_size -= MEM_MANAGE_MEM_STRUCT_SIZE;//È¥µôÏÂÒ»¸ö¿éµÄ±íͷʣϵÄÄÚ´æ´óС
  370.                                 align_addr = (Mem_Node*)((uint8_t*)pRoot->pStart + MEM_MANAGE_MEM_STRUCT_SIZE);//ÏÂÒ»¸ö¿éµÄ±íÍ·µØÖ·
  371.                                 align_addr->mem_size = align_size;
  372.                                 align_addr->next_node = NULL;
  373.                                 pRoot->pStart->mem_size = 0;
  374.                                 pRoot->pStart->next_node = align_addr;
  375.                                 pRoot->total_size = align_addr->mem_size;
  376.                         }
  377.                         else {//ÄÚ´æÌ«Ð¡ÁË£¬½«µ±Ç°ÄÚ´æ¿éµØÖ·¼ÇΪstart
  378.                                 pRoot->total_size = 0;
  379.                                 pRoot->pStart->mem_size = 0;
  380.                         }
  381.                 }
  382.                 else {
  383.                         if (pPriv_node == NULL) {
  384.                                 pRoot->err_flag = MEM_NO_INIT;
  385.                                 return false;
  386.                         }
  387.                         pPriv_node->next_node = align_addr;//¸üÐÂÉÏÒ»½ÚµãµÄnext_node
  388.                         pRoot->total_size += align_size;
  389.                 }
  390.                 pPriv_node = align_addr;
  391.         }
  392.         if (pPriv_node == NULL) {
  393.                 pRoot->err_flag = MEM_NO_INIT;
  394.                 return false;
  395.         }
  396.         //´Ëʱ£¬pPriv_nodeΪ×îºóÒ»¸ö¿é£¬½ÓÏÂÀ´ÔÚ¿éβ·ÅÖñíβend
  397.         //Çó³ö·ÅÖÃend¿éµÄµØÖ·,end¿é½öÊÇ·½±ã±éÀúʹÓã¬Òò´Ë¾¡Á¿Ð¡£¬·ÖÅäΪMEM_MANAGE_MEM_STRUCT_SIZE
  398.         align_addr = (Mem_Node*)Mem_Manage_Align_Down(\
  399.                 (size_t)Mem_Manage_Mem_To_Addr(pPriv_node) + pPriv_node->mem_size - MEM_MANAGE_MEM_STRUCT_SIZE, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  400.         align_size = (uint8_t*)align_addr-(uint8_t*)Mem_Manage_Mem_To_Addr(pPriv_node);//Çó³ö·ÖÅä³öend¿éºó£¬Ç°Ò»¸ö¿éÊ£Óà´óС
  401.         if (align_size >= MEM_MANAGE_MINUM_MEM_SIZE) {//ÈôʣϵĿé×ã¹»´ó
  402.                 pRoot->total_size -= pPriv_node->mem_size - align_size;//È¥µô·ÖÅäend¿éÏûºÄµÄÄÚ´æ
  403.                 pRoot->pEnd = align_addr;                        //¸üбíβµÄµØÖ·
  404.                 pPriv_node->next_node = align_addr;
  405.                 pPriv_node->mem_size = align_size;
  406.                 align_addr->next_node = NULL;
  407.                 align_addr->mem_size = 0;//end¿é²»²ÎÓëÄÚ´æ·ÖÅ䣬Òò´ËÖ±½ÓΪ0¾Í¿ÉÒÔ
  408.         }
  409.         else {//×îºóÒ»¸ö¿é̫СÁË£¬Ö±½Ó×÷Ϊend¿é
  410.                 pRoot->pEnd = pPriv_node;
  411.                 pRoot->total_size -= pPriv_node->mem_size;
  412.         }
  413.         if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
  414.                 pRoot->err_flag=MEM_NO_INIT;
  415.                 return false;
  416.         }
  417.         Mem_Settle(pRoot);
  418.         pRoot->err_flag=MEM_NO_ERR;
  419.         pRoot->remain_size=pRoot->total_size;
  420.         return true;
  421. }

  422. //ÄÚ´æ³Ø³õʼ»¯
  423. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  424. //mem_size:ÄÚ´æ³Ø´óС
  425. //return:        true ³õʼ»¯³É¹¦;
  426. //                        false ³õʼ»¯Ê§°Ü
  427. bool Mem_Manage_Pool_Init(void* mem_addr,size_t mem_size){
  428.         void* paddr=(uint8_t*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)+MEM_MANAGE_MEM_ROOT_SIZE;
  429.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  430.         size_t align_size=(uint8_t*)paddr-(uint8_t*)mem_addr;
  431.         Mem_Region buf_region[]={
  432.                 0,0,
  433.                 NULL,0
  434.         };
  435.         if(mem_size<align_size)
  436.                 return 0;
  437.         mem_size-=align_size;
  438.         if(mem_size<2*MEM_MANAGE_MEM_STRUCT_SIZE+MEM_MANAGE_MINUM_NODE_SIZE)
  439.                 return 0;
  440.         buf_region[0].addr=paddr;
  441.         buf_region[0].mem_size=mem_size;
  442.         return Mem_Manage_Init(root_addr,buf_region);
  443. }

  444. //ÓëC¿âº¯Êýmalloc×÷ÓÃÏàͬ
  445. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  446. //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
  447. //return:        NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
  448. //                        ÆäËûÖµ ·ÖÅä³É¹¦
  449. void* Mem_Manage_Pool_Malloc(void* mem_addr,size_t want_size){
  450.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  451.         return Mem_Manage_Malloc(root_addr,want_size);
  452. }

  453. //ÓëC¿âº¯Êýrealloc×÷ÓÃÏàͬ
  454. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  455. //src_addr:Ô´µØÖ·Ö¸Õë
  456. //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
  457. //return:        NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
  458. //                        ÆäËûÖµ ·ÖÅä³É¹¦
  459. void* Mem_Manage_Pool_Realloc(void* mem_addr,void* src_addr,size_t want_size){
  460.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  461.         return Mem_Manage_Realloc(root_addr,src_addr,want_size);
  462. }

  463. //ÓëC¿âº¯Êýaligned_alloc×÷ÓÃÒ»ÖÂ
  464. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  465. //align_size:ÆÚÍû·ÖÅäµÄÄڴ漸×Ö½Ú¶ÔÆë£¨8¡¢16¡¢32...)
  466. //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
  467. //return:        NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß¾ä±ú´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
  468. //                        ÆäËûÖµ ·ÖÅä³É¹¦
  469. void* Mem_Manage_Pool_Aligned_Alloc(void* mem_addr,size_t align_byte,size_t want_size){
  470.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  471.         return Mem_Manage_Aligned_Alloc(root_addr,align_byte,want_size);
  472. }

  473. //ÓëC¿âº¯Êýfree×÷ÓÃÒ»ÖÂ
  474. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  475. //free_addr:ÊÍ·ÅÄÚ´æµÄÊ×µØÖ·
  476. //return:ÎÞ·µ»ØÖµ
  477. void Mem_Manage_Pool_Free(void* mem_addr,void* free_addr){
  478.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  479.         Mem_Manage_Free(root_addr,free_addr);
  480. }

  481. //»ñÈ¡ÄÚ´æ³ØµÄ״̬
  482. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  483. //pState:״̬ÐÅÏ¢½á¹¹ÌåÖ¸Õë
  484. //return:ÎÞ·µ»ØÖµ
  485. void Mem_Manage_Pool_Get_State(void* mem_addr,Mem_State* pState){
  486.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  487.         Mem_Manage_Get_State(root_addr,pState);
  488. }

  489. //»ñÈ¡ÄÚ´æ³Ø×ÜÈÝÁ¿
  490. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  491. //return:ÄÚ´æÇø×ÜÈÝÁ¿£¨µ¥Î»£ºbyte£©
  492. size_t Mem_Manage_Pool_Get_Total_Size(const void* mem_addr){
  493.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  494.         return Mem_Manage_Get_Total_Size(root_addr);
  495. }

  496. //»ñÈ¡ÄÚ´æ³ØÊ£ÓàÈÝÁ¿
  497. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  498. //return:ÄÚ´æÇøÊ£ÓàÈÝÁ¿£¨µ¥Î»£ºbyte£©
  499. size_t Mem_Manage_Pool_Get_Remain_Size(const void* mem_addr){
  500.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  501.         return Mem_Manage_Get_Remain_Size(root_addr);
  502. }

  503. //»ñÈ¡ÄÚ´æ³Ø´íÎó±ê¼Ç
  504. //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
  505. //return:´íÎó±ê¼Ç
  506. Mem_Err_Type Mem_Manage_Pool_Get_Errflag(const void* mem_addr){
  507.         Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
  508.         return Mem_Manage_Get_Errflag(root_addr);
  509. }


¸´ÖÆ´úÂë



ÆÀ·Ö

²ÎÓëÈËÊý 7½ð±Ò +202 ÊÕÆð ÀíÓÉ
¶¬ÑÔ + 20 ºÜ¸øÁ¦!
woodzn + 20 ÉñÂí¶¼ÊǸ¡ÔÆ
yunqi + 20 ºÜ¸øÁ¦!
nikola + 20 ºÜ¸øÁ¦!
SeanX + 2 ÔÞÒ»¸ö!
812126060 + 20
eric2013 + 100 ºÜ¸øÁ¦!

²é¿´È«²¿ÆÀ·Ö

»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

218

Ö÷Ìâ

1106

»ØÌû

1770

»ý·Ö

ÖÁ×ð»áÔ±

More we do, more we can do.

»ý·Ö
1770
·¢±íÓÚ 2021-9-3 15:02:30 | ÏÔʾȫ²¿Â¥²ã
¿´¼ò½éºÜÀ÷º¦£¬Éè¼ÆÔ­ÀíÎĵµÓÐÂ𣿰ݶÁÒ»ÏÂ
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-9-3 17:50:08 | ÏÔʾȫ²¿Â¥²ã
emwin ·¢±íÓÚ 2021-9-3 15:02
¿´¼ò½éºÜÀ÷º¦£¬Éè¼ÆÔ­ÀíÎĵµÓÐÂ𣿰ݶÁÒ»ÏÂ

ÓÐÎĵµµÄ£¬ÎÒ°ÑËü·¢ÔÚÌû×ӵĻظ´Àï
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-9-3 17:51:44 | ÏÔʾȫ²¿Â¥²ã
±¾Ëã·¨µÄʵÏÖÔ­Àí¼°²âÊÔ¹¤³Ì

ÄÚ´æ¹ÜÀíÉè¼ÆÎĵµ.pdf

249.98 KB, ÏÂÔØ´ÎÊý: 503

»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-9-3 17:53:57 | ÏÔʾȫ²¿Â¥²ã
±¾Ëã·¨µÄʵÏÖÔ­Àí¼°²âÊÔ¹¤³Ì

ÄÚ´æ¹ÜÀíÉè¼ÆÎĵµ.pdf

249.98 KB, ÏÂÔØ´ÎÊý: 154

»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

681

Ö÷Ìâ

3492

»ØÌû

5560

»ý·Ö

ÂÛ̳ԪÀÏ

»ý·Ö
5560
·¢±íÓÚ 2021-9-4 11:49:11 | ÏÔʾȫ²¿Â¥²ã
Ã²ËÆÕâÒ»°æ±¾£¬°ÉÐźÅÁ¿¸øÈ¡ÏûÁË
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

1Íò

Ö÷Ìâ

7Íò

»ØÌû

11Íò

»ý·Ö

¹ÜÀíÔ±

Rank: 9Rank: 9Rank: 9

»ý·Ö
115878
QQ
·¢±íÓÚ 2021-9-4 15:51:28 | ÏÔʾȫ²¿Â¥²ã
лл¥Ö÷·ÖÏí¡£
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-9-4 21:41:02 | ÏÔʾȫ²¿Â¥²ã
hpdell ·¢±íÓÚ 2021-9-4 11:49
Ã²ËÆÕâÒ»°æ±¾£¬°ÉÐźÅÁ¿¸øÈ¡ÏûÁË

°ÑÔ­À´µÄ¹³×Óº¯ÊýʲôµÄ¶¼È¡ÏûµôÁË£¬¸Ð¾õʵ¼ÊÒâÒå²»´ó£¬ÕâÒ»°æÖ÷ÒªÔö¼ÓÁËÄÚ´æ³Ø·½Ê½¹ÜÀíÄÚ´æ¿Õ¼äµÄº¯Êý
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-9-11 13:03:13 | ÏÔʾȫ²¿Â¥²ã
eric2013 ·¢±íÓÚ 2021-9-4 15:51
лл¥Ö÷·ÖÏí¡£

»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

3

Ö÷Ìâ

12

»ØÌû

21

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
21
·¢±íÓÚ 2021-9-20 22:54:53 | ÏÔʾȫ²¿Â¥²ã
ѧϰѧϰ  ÕýºÃÐèÒªÒ»¸öºÃµÄÄÚ´æ¹ÜÀíËã·¨
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-9-28 19:14:07 | ÏÔʾȫ²¿Â¥²ã
812126060 ·¢±íÓÚ 2021-9-20 22:54
ѧϰѧϰ  ÕýºÃÐèÒªÒ»¸öºÃµÄÄÚ´æ¹ÜÀíËã·¨

»¶Ó­½»Á÷
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

2

Ö÷Ìâ

45

»ØÌû

51

»ý·Ö

³õ¼¶»áÔ±

»ý·Ö
51
·¢±íÓÚ 2021-11-9 16:42:23 | ÏÔʾȫ²¿Â¥²ã
À÷º¦£¬Ö®Ç°µÄ1.1Óõ½ÁËÏîÄ¿ÖУ¬Ê¹Óû·¾³Ã»ÓÐÆµ·±µÄÄÚ´æÉêÇëºÍÊÍ·Å£¬ÄÜÖ±½ÓÉý¼¶V1.2Âð
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-11-14 20:27:06 | ÏÔʾȫ²¿Â¥²ã
ÂäÒ¶µòÁã ·¢±íÓÚ 2021-11-9 16:42
À÷º¦£¬Ö®Ç°µÄ1.1Óõ½ÁËÏîÄ¿ÖУ¬Ê¹Óû·¾³Ã»ÓÐÆµ·±µÄÄÚ´æÉêÇëºÍÊÍ·Å£¬ÄÜÖ±½ÓÉý¼¶V1.2Âð

¿ÉÒÔÖ±½ÓÉý¼¶£¬Ô­À´°æ±¾µÄÔÚʹÓ÷½±ãÐÔÉÏÓеãÎÊÌ⣬v1.1ºÍv1.2ÄÚ²¿µÄÄÚ´æ·ÖÅä²ßÂÔ¶¼ÊÇûÎÊÌâµÄ
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

7

Ö÷Ìâ

194

»ØÌû

220

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
220
·¢±íÓÚ 2021-11-15 09:51:03 | ÏÔʾȫ²¿Â¥²ã
Â¥Ö÷ Õâ¸öÄÜÓÃÀ´¹ÜÀíÍⲿspiflashÂï
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2021-11-15 15:11:46 | ÏÔʾȫ²¿Â¥²ã
abcde1224 ·¢±íÓÚ 2021-11-15 09:51
Â¥Ö÷ Õâ¸öÄÜÓÃÀ´¹ÜÀíÍⲿspiflashÂï

Õâ¸ö²»ÊʺϹÜÀíspiflashŶ£¬Ö»ÊʺϹÜÀíramµÄÄڴ棬¹¦ÄÜÓëc¿âº¯ÊýÖеÄmallocÏàËÆ
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

5

Ö÷Ìâ

95

»ØÌû

110

»ý·Ö

³õ¼¶»áÔ±

»ý·Ö
110
·¢±íÓÚ 2021-12-5 23:36:37 | ÏÔʾȫ²¿Â¥²ã
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

0

Ö÷Ìâ

34

»ØÌû

34

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
34
·¢±íÓÚ 2021-12-6 16:03:55 | ÏÔʾȫ²¿Â¥²ã
¶àл¥Ö÷·ÖÏí£¬Ïȶ¥ÔÙ¿´£¡
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

1

Ö÷Ìâ

47

»ØÌû

50

»ý·Ö

³õ¼¶»áÔ±

»ý·Ö
50
·¢±íÓÚ 2022-2-16 10:57:59 | ÏÔʾȫ²¿Â¥²ã
mark                  
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

0

Ö÷Ìâ

1

»ØÌû

1

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
1
·¢±íÓÚ 2022-2-16 12:07:29 | ÏÔʾȫ²¿Â¥²ã
×¼±¸ÒÆÖ²µ½ÏîÄ¿Àï
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

1

Ö÷Ìâ

47

»ØÌû

50

»ý·Ö

³õ¼¶»áÔ±

»ý·Ö
50
·¢±íÓÚ 2022-4-18 22:56:26 | ÏÔʾȫ²¿Â¥²ã
mark                  
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

4

Ö÷Ìâ

19

»ØÌû

31

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
31
·¢±íÓÚ 2022-4-29 17:51:36 | ÏÔʾȫ²¿Â¥²ã
#define MEM_MANAGE_ALLOCA_LABAL                                        ((size_t)((size_t)1<<(sizeof(size_t)*MEM_MANAGE_BITS_PER_BYTE-1)))ÕâôдÄܱÜÃâЩ¾¯¸æ£¬Ç¿ÆÈÖ¢£¬¿´²»µÃ¾¯¸æ.....
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

21

Ö÷Ìâ

66

»ØÌû

129

»ý·Ö

³õ¼¶»áÔ±

»ý·Ö
129
·¢±íÓÚ 2022-6-2 15:53:30 | ÏÔʾȫ²¿Â¥²ã
ÄÚ´æ³ØºÍÄÚ´æÓÐÉ¶Çø±ð?
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2022-6-4 20:40:41 | ÏÔʾȫ²¿Â¥²ã
mojinpan ·¢±íÓÚ 2022-6-2 15:53
ÄÚ´æ³ØºÍÄÚ´æÓÐÉ¶Çø±ð?

Ã»É¶Çø±ð£¬ÄÚ´æ³ØÊ¹ÓøüÎÞÄÔÒ»µã
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

6

Ö÷Ìâ

8

»ØÌû

26

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
26
·¢±íÓÚ 2022-6-10 15:36:03 | ÏÔʾȫ²¿Â¥²ã
ʲôÏîÄ¿ÉϲŻáÓõ½°¡£¿Ã»Åöµ½¹ýÓÃÐèÒªÄÚ´æ¹ÜÀíµÄÏîÄ¿
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

0

Ö÷Ìâ

2

»ØÌû

2

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
2
·¢±íÓÚ 2022-7-26 14:53:19 | ÏÔʾȫ²¿Â¥²ã
±¾Ìû×îºóÓÉ SeanX ÓÚ 2022-7-26 15:33 ±à¼­

»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

1

Ö÷Ìâ

22

»ØÌû

25

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
25
·¢±íÓÚ 2023-4-27 13:51:48 | ÏÔʾȫ²¿Â¥²ã

ËùÒÔÔ“·½·¨£¬±ÈRTX5 ¸üÄÜÓÐЧ¹ÜÀíÊdžá?
__WEAK void *osRtxMemoryAlloc (void *mem, uint32_t size, uint32_t type)
߀ÊÇ¿ÉÒÔ»ìºÏÓÃ?
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

15

Ö÷Ìâ

175

»ØÌû

235

»ý·Ö

¸ß¼¶»áÔ±

»ý·Ö
235
 Â¥Ö÷| ·¢±íÓÚ 2023-5-2 19:44:55 | ÏÔʾȫ²¿Â¥²ã
James2jian ·¢±íÓÚ 2023-4-27 13:51
ËùÒÔÔ“·½·¨£¬±ÈRTX5 ¸üÄÜÓÐЧ¹ÜÀíÊdžá?
__WEAK void *osRtxMemoryAlloc (void *mem, uint32_t size, uin ...

²»ÄÜ»ìºÏÓã¬ÎÒÕâ¸öÖ÷ÒªµÄÓÅÊÆÊÇ¿ÉÒÔ½«ÁãÉ¢µÄÄÚ´æºÏ²¢¹ÜÀí
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

681

Ö÷Ìâ

3492

»ØÌû

5560

»ý·Ö

ÂÛ̳ԪÀÏ

»ý·Ö
5560
·¢±íÓÚ 2023-7-14 09:20:50 | ÏÔʾȫ²¿Â¥²ã
WZH ·¢±íÓÚ 2023-5-2 19:44
²»ÄÜ»ìºÏÓã¬ÎÒÕâ¸öÖ÷ÒªµÄÓÅÊÆÊÇ¿ÉÒÔ½«ÁãÉ¢µÄÄÚ´æºÏ²¢¹ÜÀí

¸ãÒ»¸ö ͨÓú¯Êý½øÐк궨Òå¾Í¿ÉÒÔÁË
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

2

Ö÷Ìâ

11

»ØÌû

17

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
17
·¢±íÓÚ 2023-7-19 15:45:58 | ÏÔʾȫ²¿Â¥²ã
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

0

Ö÷Ìâ

2

»ØÌû

2

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
2
·¢±íÓÚ 2023-9-15 18:07:08 | ÏÔʾȫ²¿Â¥²ã
Ôõô¸´ÖÆ´úÂ룿
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

1

Ö÷Ìâ

6

»ØÌû

9

»ý·Ö

ÐÂÊÖÉÏ·

»ý·Ö
9
·¢±íÓÚ 2024-12-20 10:54:35 | ÏÔʾȫ²¿Â¥²ã
ÕâÒ»°æ±¾ÄÜÖ±½ÓÓÃÔÚRTOS¶àÈÎÎñÖÐÂð£¿Ïà±È½Ïǰһ°æ±¾£¬ÎÒ¿´°Ñ»¥³âËøLOCK¡¢UNLOCKÈ¡ÏûÁË
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

ÄúÐèÒªµÇ¼ºó²Å¿ÉÒÔ»ØÌû µÇ¼ | Á¢¼´×¢²á

±¾°æ»ý·Ö¹æÔò

QQ|СºÚÎÝ|Archiver|ÊÖ»ú°æ|Ó²ººÇ¶ÈëʽÂÛ̳

GMT+8, 2025-5-25 01:57 , Processed in 0.813640 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí