就是管理一个数组。。。
测试如下:
#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%