自己手动实现malloc

单片机自己手动实现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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值