单片机中内存管理的简单算法实现

本文介绍了在STM32F070单片机上,使用MDK5进行裸机编程时,内存管理的简单算法实现。实验环境中不涉及操作系统,仅涉及内存块索引表的操作,包括内存分配和释放。注意该算法未处理内存池的初始化和清理,可能存在内存‘脏’块问题。在多线程环境下,可能需要更复杂的内存管理策略。

单片机中内存管理的简单算法实现

实验平台:STM32F070+MDK5+裸机,简单测试通过

/***************************mymalloc.h begin*************************************/
#ifndef _MYMALLOC_H_
#define _MYMALLOC_H_
#include "stm32f0xx_hal.h"

#define MEMORY_BLOCK_SIZE			256	/*内存块大小定义*/
#define MEMORY_BLOCK_NUMBER			20	/*内存块总共数量*/
#define MEMORY_POOL_SIZE (MEMORY_BLOCK_SIZE*MEMORY_BLOCK_NUMBER)	/*内存池的大小*/

void *mymalloc(uint32_t Size);	/*申请内存*/
void myfree(void *p_start);		/*释放内存*/
void mymem_init(void);			/*内存池初始化*/
#endif
/***************************mymalloc.h end*************************************/
/***************************mymalloc.c begin*************************************/
#include "mymalloc.h"
/*定义共享内存池*/
__align(MEMORY_BLOCK_SIZE) uint8_t MEMORY_POOL[MEMORY_POOL_SIZE];
/*定义内存管理表*/
uint16_t MEMORY_LIST[MEMORY_BLOCK_NUMBER];

void *mymalloc(uint32_t Size)
{
	uint32_t n_mem_block;	/*需要的内存数*/
	uint32_t c_mem_block = 0;	/*连续的空内存数*/
	int32_t index;
	uint16_t i;
	
	/*先计算需要的内存块数量*/
	if((!Size) || (Size > MEMORY_POOL_SIZE))
		return NULL;	/*申请的内存为零或超过内存池容量了*/
	n_mem_block = Size/MEMORY_BLOCK_SIZE + ((Size%MEMORY_BLOCK_SIZE)?(1):(0));

	/*遍历内存管理表*/
	for(index = MEMORY_BLOCK_NUMBER-1; index >= 0 ; index--)
	{
		if(!MEMORY_LIST[index])
			c_mem_block++;	/*找到非空内存块,+1*/
		else
			c_mem_block = 0;	/*一旦不符合全部清零*/
		
		if(c_mem_block == n_mem_block)	/*找到足够大小的连续空内存块*/
		{
			for(i = 0; i < n_mem_block; i++)	/*使用前将连续空内存块标记为非空*/
			{
				MEMORY_LIST[index+i] = n_mem_block;
			}
			/*返回内存池中的对应地址*/
			return (void *)((uint8_t *)MEMORY_POOL + index*MEMORY_BLOCK_SIZE);
		}
	}
	
	return NULL;	/*没有找到足够的空内存*/
}

void myfree(void *p_start)
{
	uint16_t index;
	int32_t i;
	
	if(p_start == NULL)
		return ;
	
	/*获得在内存索引表的开始下标*/
	index = ((uint32_t)p_start - (uint32_t)MEMORY_POOL)/MEMORY_BLOCK_SIZE;
	
	if(index >= MEMORY_BLOCK_NUMBER)
		return ;
	
	i = MEMORY_LIST[index];	/*获取当前指针申请的内存块个数*/
	
	/*清空内存索引表相关块的索引*/
	while(i > 0)
	{
		MEMORY_LIST[index] = 0;
		index++;
		i--;
	}
}

void mymem_init(void)
{
	uint16_t i;
	/*清空内存索引表*/
	for(i = 0; i < MEMORY_BLOCK_NUMBER; i++)
	{
		MEMORY_LIST[i] = 0;
	}
}
/***************************mymalloc.c end*************************************/

注意:

  1. 本算法中操作的都是内存块索引表,并没有操作内存池,包括初始化和释放内存两个函数。也就是获取的内存可能是“脏”的、被使用过的。可自行在初始化和释放内存函数中清空相关位置的内存池。
  2. 实验环境为无OS环境,在多线程的内存管理中,你可能需要更高明的内存管理算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值