这两天写的一个STM32上的内存管理函数,实现了malloc和free以及remalloc几个函数.还实现了一个内存使用率查询的函数.
思路如下:
将内存分块管理.
内存池等分为固定大小的内存块.
建立一个内存状态表,对应每个块,有多少个块,状态表就有多少个元素,一一对应.
通过状态表的值判断该块内存是否可用(为0则表示可用,为其他值则表示被占用了,而且占用的内存块数量,就是该值的数字)
初始化的时候,状态表的值全0,代表所有的内存块都未被占用.当需要分配的时候,malloc从内存块的最高地址往下查找,查找到连续的空内存大于等于要分配的内存的时候,结束此次分配,返回地址给要分配的指针,完成一次malloc. free的时候,就比较简单了,只要找到所分配的内存对应在状态表的位置,然后把状态表的值清0,及实现free.
内存使用率则通过查询状态表有多少个非0值,来计算占用率.
代码如下:
malloc.h头文件:
#ifndef __MALLOC_H
#define __MALLOC_H
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK 开发板
//内存管理 代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2011/7/5
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//没有更新信息
//
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
#ifndef NULL
#define NULL 0
#endif
#define MEM_BLOCK_SIZE 32 //内存块大小为32字节
#define MAX_MEM_SIZE 10*1024 //最大管理内存 10K
#define MEM_ALLOC_TABLE_SIZE MAX_MEM_SIZE/MEM_BLOCK_SIZE //内存表大小
//内存管理控制器
struct _m_mallco_dev
{
void (*init)(void); //初始化
u8 (*perused)(void); //内存使用率
u8 membase[MAX_MEM_SIZE]; //内存池