嵌入式--内存池

嵌入式–内存池

直接上代码,自己体会。嵌入式设备,一般keil提供的堆很小,一般都不使用。使用内存池,自己可以调节内存大小。

头文件 malloc.h

#ifndef __MALLOC_H
#define __MALLOC_H


#include 


#ifndef NULL
#define NULL (0)
#endif


//内存参数设定.
#define MEM_BLOCK_SIZE			32  	  						//内存块大小为32字节
#define MEM_MAX_SIZE			1*1024  						//最大管理内存 
#define MEM_ALLOC_TABLE_SIZE	MEM_MAX_SIZE/MEM_BLOCK_SIZE 	//内存表大小


//内存管理控制器
struct _m_mallco_dev
{
	void (*init)(void);				    //初始化
    uint8_t (*perused)(void);		  	//内存使用率
    uint8_t *membase;					//内存池
    uint16_t *memmap; 					//内存管理状态表
   uint8_t  memrdy; 					//内存管理是否就绪
};

extern struct _m_mallco_dev mallco_dev;	//在mallco.c里面定义

void mymemset(void *s, uint8_t c, uint32_t count);	    //设置内存
void mymemcpy(void *des, void *src, uint32_t n);        //复制内存
void mem_init(void);					                //内存管理初始化函数(外/内部调用)
uint32_t mem_malloc(uint32_t size);		 		        //内存分配(内部调用)
uint8_t mem_free(uint32_t offset);		 		        //内存释放(内部调用)
uint8_t mem_perused(void);					            //得内存使用率(外/内部调用)


//用户调用函数
void myfree(void *ptr);  				//内存释放(外部调用)
void *mymalloc(uint32_t size);				//内存分配(外部调用)
void *myrealloc(void *ptr, uint32_t size);	//重新分配内存(外部调用)


#endif

源文件 malloc.c

#include "malloc.h"

//内存池(4字节对齐)
__align(4) uint8_t membase[MEM_MAX_SIZE];			//SRAM内存池
//内存管理表
uint16_t memmapbase[MEM_ALLOC_TABLE_SIZE];			//SRAM内存池MAP
//内存管理参数
const uint32_t memtblsize=MEM_ALLOC_TABLE_SIZE;		//内存表大小
const uint32_t memblksize=MEM_BLOCK_SIZE;			//内存分块大小
const uint32_t memsize=MEM_MAX_SIZE;			    //内存总大小


//内存管理控制器
struct _m_mallco_dev mallco_dev=
{
    mem_init,			//内存初始化
    mem_perused,		//内存使用率
    membase,			//内存池
    memmapbase,			//内存管理状态表
    0,  				//内存管理未就绪
};

//复制内存
//*des:目的地址
//*src:源地址
//n:需要复制的内存长度(字节为单位)
void mymemcpy(void *des,void *src, uint32_t n)
{
    uint8_t *xdes=des;
    uint8_t *xsrc=src;
    while(n--)*xdes++=*xsrc++;
}

//设置内存
//*s:内存首地址
//c :要设置的值
//count:需要设置的内存大小(字节为单位)
void mymemset(void *s, uint8_t c, uint32_t count)
{
    uint8_t *xs = s;
    while(count--)*xs++=c;
}

//内存管理初始化
void mem_init(void)
{
    //内存状态表数据清零
    mymemset(mallco_dev.memmap, 0,memtblsize*2);
    //内存池所有数据清零
    mymemset(mallco_dev.membase, 0,memsize);	
    //内存管理初始化OK
    mallco_dev.memrdy=1;						
}

//获取内存使用率
//返回值:使用率(0~100)
uint8_t mem_perused(void)
{
    uint32_t used=0;
    uint32_t i;
    for(i=0; i=0; offset--)	
    {
        if(!mallco_dev.memmap[offset])
        {
            //连续空内存块数增加
            cmemb++;	
        }
        else 
        {
            //连续内存块清零
            cmemb=0;							
        }
        //找到了连续nmemb个空内存块
        if(cmemb==nmemb)						
        {
            //标注内存块非空
            for(i=0; i

你可能感兴趣的:(嵌入式从浅到深,嵌入式,内存管理)