RT-Thread嵌入式系统关于rt_malloc、rt_calloc、re_tree函数说明及动态内存堆的使用

在使用堆内存前,必须要在系统初始化的时候进行堆内存的初始化,函数为
void rt_system_heap_init(void *begin_addr,void *end_addr) 注:这个函数会把begin_addr和end_addr作为堆空间来用。
参数 描述
begin_addr 堆内存的起始地址
end_addr 堆内存的结束地址
从内存堆中申请用户指定大小的内存块

void* rt_malloc(rt_size_t size)
函数注释:rt_malloc函数会从系统堆空间中找到合适大小的内存块,然后把内存的地址作为rt_malloc的返回值返回给用户
参数 描述
size 用户想要申请的内存块大小
返回值:如果申请成功,则返回申请到的内存块的地址,失败则返回NULL。

void* rt_realloc(void *rmem,rt_size_t newsize)
函数注释:为用户重新分配内存块的大小,原来内存块rmem的数据内容保持不变,缩小的情况下,后面的数据被自动截断丢弃。申请成功后,rmem先前申请的内存块系统自动释放。
参数 描述
rmem 用户想要改变该内存块大小的原始地址
newsize 指定改变大小的字节数
返回值:返回重新分配的内存块地址。

void* rt_calloc(rt_size_t count,re_size_t size)
函数注释:为用户申请连续内存地址的多个内存块,并且自动进行内存的初始化为0。
参数 描述
count 内存块数量
size 内存块容量
返回值:返回指向第一个内存块的地址,并且所有被分配的内存块初始化为0.
void re_free(void *ptr)

函数注释:为用户将malloc、realloc、calloc申请的内存释放,每次申请内存用完后必须进行释放,否则会造成内存泄漏。
参数 描述
ptr 指向用户申请的堆地址
返回值:无
小结:malloc和calloc的区别,都是向堆中申请内存,malloc申请的内存可能不是连续的,可能是以链表形式存在于堆中,calloc申请的内存必须的连续的内存块,calloc较malloc不同的是calloc会将申请的堆内存自动初始化为0,初始化效率比malloc手动初始化速度会快,在相同堆空间下,calloc申请的内存有很大可能是没有malloc申请的堆空间大。

void rt_malloc_sethook(void (*hook)(void *ptr,rt_size_t size));
函数注释:设置钩子函数会在内存分配完成后将申请到的内存块和大小传进hook函数中
参数 描述
hook 钩子函数指针,hook函数定义如下:
void hook(void *ptr,rt_size_t size);
函数注释:rt_malloc_sethook钩子函数的函数指针
参数 描述
ptr 分配到的内存块指针
size 分配到的内存块指针大小

void rt_free_sethook(void (*hook)(void *ptr));
函数注释:设置钩子函数会在内存释放完成前进行回调,将用户释放的内存地址块作为参数传递进去(此时内存块没有被释放)
参数 描述
hook 钩子函数指针,函数定义如下:

void hook(void *ptr);
函数描述:rt_free_sethook钩子函数的函数指针
参数 描述
ptr 待释放堆内存块指针

RT-Thread堆内存操作代码示例如下:

struct rt_thread_t thread1;
char thread_stack[512];
void entry_thread()
{
    int i=0,j=0,size=0;
    char *ptr[200];
    
    size = sizeof(ptr)/sizeof(char *);
    for(i=0;i<size;i++)ptr[i]=RT_NULL;
    while(1)
    {
        ptr[j] = rt_malloc(1<<j);
        if(prt[j]!=RT_NULL)
        {
            rt_free(ptr[j]);
            ptr[j] = RT_NULL;
            rt_printf("Application for %dKB memory successfor!",(1<<j));
            j++;
        }
        else
        {
            rt_printf("prt[%d] Application memory failed!",%d);
            return;
        }
    }
}

void thread_init_fun()
{
     re_err_t result;   
     result = rt_thread_init(&thread1,"only one",entry_thread,RT_NULL,thread_stack[0],sizeof(thread_stack),199,10);
    if(result == RT_EOK)
    {
        rt_thread_startup(&thread1);
    }
    return;
}

猜你喜欢

转载自blog.csdn.net/weixin_42560250/article/details/105545793