二叉树准备V2-量身定做malloc

 

就是管理一个数组。。。

测试如下:

#include "gtreemalloc.h"	
#include "stdio.h"   //printf 


//内存池(32字节对齐)
__align(32) struct BiTree Treebase[MEM_MAX_NODE_CONT]__attribute__((at(0x10000800)));	//SRAM内存池




void tmemset(void *s,u8 c,u32 count)  
{  
    u8 *xs = s;  
    while(count--)*xs++=c;  
}	   


void t_mem_init(void)  
{  
	tmemset(&Treebase, 0,MEM_MAX_BANK_SIZE);	 
}  

//获取内存使用率
//返回值:使用率(0~100)
u8 t_mem_perused(void)  
{  
    u32 used=0;  
    u32 i;  
    for(i=0;i<MEM_MAX_NODE_CONT;i++)  
    {  
        if(Treebase[i].id)used++; 
    } 
    printf("[used=%d]\r\n",used);
    return (used*100)/(MEM_MAX_NODE_CONT);  
}  

//内存分配(内部调用)
//传入参数size:要分配的内存大小(字节)
//目前不需要了 我每次都是给1个节点的内存池
struct BiTree * t_malloc(void)  
{  
    u32 i;  
    for(i=0;i<MEM_MAX_NODE_CONT;i++)  
    {  
        if(Treebase[i].id==0)
		{
			Treebase[i].id=i+1;
			return &Treebase[i];
		}		
    } 
    return NULL;
}  

/*
数组struct BiTree Treebase[MEM_MAX_NODE_CONT]
形态如下
id不是从0开始 是从1开始的
因为可以避免遍历的问题
=================
| 1     |  2
| data  |  data
| pl    |  pl
| pr    |  pr
=================
你看
struct BiTree * t_malloc(void)  
{  
    u32 i;  
    for(i=0;i<MEM_MAX_NODE_CONT;i++)  
    {  
        if(Treebase[i].id==0)
		{
			Treebase[i].id=i;
			return &Treebase[i];
		}		
    } 
}
每次都是第一个命中了

所以采用i+1 而t_free不需要
*/
 
void t_free(struct BiTree * node)  
{  
    u32 i;  
    for(i=0;i<MEM_MAX_NODE_CONT;i++)  
    {  
        if(Treebase[i].id==node->id)
		{
			tmemset(&Treebase[i], 0,MEM_NODE_SIZE);	
			return;
		}		
    }  
}  



struct BiTree *NODE1,*NODE2;
void MALLOCTEST(void)
{
    u8 used=0;
    printf("Treebase in %p have %d HEX \r\n \
    NODESIZE %d == MEM_NODE_SIZE =%d  \r\n \
    MEM_MAX_NODE_CONT =%d\r\n \
    ",Treebase,MEM_MAX_BANK_SIZE,sizeof(struct BiTree),MEM_NODE_SIZE,MEM_MAX_NODE_CONT);

	t_mem_init();		
	NODE1=t_malloc();
	NODE2=t_malloc();

	used = t_mem_perused();
	printf("used %d\r\n",used);
	t_free(NODE1);	
	t_free(NODE2);	
	used = t_mem_perused();
	printf("used %d\r\n",used);
}









#ifndef __GTREEMALLOC_H
#define __GTREEMALLOC_H

typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;


typedef uint8_t  		u8;
typedef uint16_t 		u16;
typedef uint32_t  		u32;

 
#ifndef NULL
#define NULL 0
#endif



#define MEM_NODE_SIZE			    16  	  					    //每个节点16 sizeof(struct BiTree)
#define MEM_BLOCK_NUM			    2  						        //约定分配2K内存来做MALLOC功能
#define MEM_MAX_BANK_SIZE			MEM_BLOCK_NUM*1024  			//2K flash->sram
#define MEM_MAX_NODE_CONT			MEM_MAX_BANK_SIZE/MEM_NODE_SIZE //节点数目MAX 

 //每个节点块
struct BiTree {
    uint32_t id;
    uint32_t data;
    struct BiTree *lchild;
    struct BiTree *rchild;
};
 


#endif







Treebase in 10000800 have 2048 HEX 
NODESIZE 16 == MEM_NODE_SIZE =16  
MEM_MAX_NODE_CONT =128 
[used=2]
used 1
[used=0]
used 0

一共可以管理128个叶子  用2个的时候是2*100/128用了1%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值