单片机中内存管理的简单算法实现
实验平台: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*************************************/
注意:
- 本算法中操作的都是内存块索引表,并没有操作内存池,包括初始化和释放内存两个函数。也就是获取的内存可能是“脏”的、被使用过的。可自行在初始化和释放内存函数中清空相关位置的内存池。
- 实验环境为无OS环境,在多线程的内存管理中,你可能需要更高明的内存管理算法。
本文介绍了在STM32F070单片机上,使用MDK5进行裸机编程时,内存管理的简单算法实现。实验环境中不涉及操作系统,仅涉及内存块索引表的操作,包括内存分配和释放。注意该算法未处理内存池的初始化和清理,可能存在内存‘脏’块问题。在多线程环境下,可能需要更复杂的内存管理策略。
682

被折叠的 条评论
为什么被折叠?



