单片机自己手动实现malloc
前言
单片机开发一般不允许使用外部malloc函数,造成内存碎片化,以及会出现一些未知的错误。但是,开发过程中用到链表的情况下,需要用到malloc函数。因此可以手动写一个基于自己的malloc函数。
代码
下面是malloc实现代码
//动态内存分配
void * tmalloc(uint32_t size_t)
{
static uint32_t array[256] = {0};/*空间不能大于65535*/
uint32_t * head = 0; /* 表头,组成格式为0xcdxxxxac,其中xx代表已经分配了的空间长度 */
uint32_t * nextHead = 0;
uint32_t *ret = 0;
uint32_t status = 0;
uint32_t i = 0;
uint32_t intSize;
if(size_t > sizeof(array) || size_t < 1)
{
return ret;
}
head = array; /*初始化表指针*/
intSize = size_t / 4; /*计算需要多少int型空间*/
if(size_t % 4 != 0)
{
intSize += 1;
}
do
{
if((head + intSize) >= array + (sizeof(array) / 4)) /*内存不足,分配失败*/
{
status = 1;
break;
}
if((head[0] >> 24) == 0xcd) /*内存被使用*/
{
if((head[0] & 0xff) == 0xac)
{
head += ((head[0] >> 8) & 0xffff) + 1;
}
}
else /*内存没有被使用*/
{
nextHead = head + 1;
for(i = 0;i < intSize;i++)
{
if((nextHead[0] >> 24) != 0xcd)
{
nextHead++;
}
else /*找到下一个表头*/
{
head = nextHead;
break;
}
}
if(i == intSize)//找到未被分配的空间
{
break;
}
}
}while(1);
if(status == 0) /*更新表头,返回地址*/
{
head[0] =(0xcd0000ac | (intSize << 8));
ret = head + 1;
}
else
{
ret = 0;
}
return ret;
}
下面为free代码实现
//内存释放
uint32_t tfree(void * ptemp)
{
uint32_t *head = 0;
uint32_t size = 0;
uint32_t i = 0;
head = ( uint32_t *)ptemp;
head -= 1;
if((head[0] >> 24) != 0xcd)
{
return 0;
}
size = (head[0] >> 8) & 0xffff;
for(i = 0;i <= size;i++)
{
head[i] = 0;
}
return 1;
}
代码实现原理
这个原理是声明一个比较大的静态数组,数组大小可以根据自己所需要的项目进行修改。每申请一次内存,需要做一个表头作为标准,表头的大小是32位,其中组成表头的格式为0xcdxxxxac,cd和ac是作为表头的标记,为查找是否被分配空间的时候使用,xxxx代表的是数据的长度,最大长度为63355
。