RT-Thread 动态内存管理与静态内存管理

    xiaoxiao2023-11-12  186

    一  静态内存池

    1.静态内存池接口

    创建内存池

    /**

     * @param name :内存池名

     * @param block_count:内存块数量

     * @param block_size:内存块容量

     * @retval 创建内存池对象成功,将返回内存池的句柄;否则返回RT_NULL

    */

    rt_mp_t rt_mp_create(const char* name, rt_size_t block_count, rt_size_t block_size);

    删除内存池

    /**  * @param mp:内存池对象句柄  * @retval  RT_EOK */

    rt_err_t rt_mp_delete(rt_mp_t mp);

    初始化内存池

    /**

     * @param mp:内存池对象句柄

     * @param name :内存池名

     * @param start:内存池的起始位置;

     * @param size:内存池大小;

     * @param block_size:内存块大小

     * @retval 初始化成功返回RT_OK;否则返回-RT_ERROR

    */

    rt_err_t rt_mp_init(rt_mp_t mp, const char* name, void *start, rt_size_t size, rt_size_t block size);

    脱离内存池

    /**  * @param mp:内存池对象句柄  * @retval  RT_EOK */

    rt_err_t rt_mp_detach(rt_mp_t mp);

    分配内存块

    /**  * @param mp:内存池对象句柄

     * @param time:超时时间  * @retval  成功时返回分配的内存块地址,失败时返回RT_NULL */

    void *rt_mp_alloc (rt_mp_t mp, rt_int32_t time);

    释放内存块

    /**  * @param block:内存块指针  * @retval  无 */

    void rt_mp_free (void *block);

    2. 创建内存池方式一

    static rt_uint8_t mempool[4096]; static struct rt_mempool mp; /* 静态内存池对象 */ /* 初始化内存池对象,每个内存块80字节 */ rt_mp_init(&mp, "mp1", &mempool[0], sizeof(mempool), 80);

    3 创建内存池方式二

    /* 定义内存池控制块 */ rt_mp_t mp = RT_NULL; /* 创建一个静态内存池 */ mp = rt_mp_create("test_mp", 20,//内存块数量 80);//内存块大小 if (test_mp != RT_NULL) rt_kprintf(" 静态内存池创建成功!\n\n");

    4 申请与释放内存块

    char *block; /* 申请一个内存块 */ block = rt_mp_alloc(&mp, RT_WAITING_FOREVER); /* 释放这个内存块 */ rt_mp_free(block); block = RT_NULL;

    5 静态内存池知识点

    静态内存池就是将一个大内存分成同等大小的多个内存块静态内存池一次只能申请一个内存块,不能自由定义大小内存池一旦初始化完成,内部的内存块大小将不能再做调整

    二 动态内存池

    1. 动态内存池相关接口

    初始化系统堆空间

    /**  * @brief 在使用堆内存时,必须要在系统初始化的时候进行堆内存的初始化  * @param begin_addr:堆内存区域起始地址

     * @param end_addr:堆内存区域结束地址 */

    void rt_system_heap_init(void* begin_addr, void* end_addr);

    分配内存块

    /**  * @brief 从内存堆上分配用户指定大小的内存块  * @param nbytes:申请的内存大小

     * @retval  返回重新分配的内存块地址 */

    void* rt_malloc(rt_size_t nbytes);

    重分配内存块

    /**  * @brief  在已分配内存块的基础上重新分配内存块的大小(增加或缩小)  * @param rmem:指向已分配的内存块

     * @param newsize:重新分配的内存大小

     * @retval  返回重新分配的内存块地址 */

    void *rt_realloc(void *rmem, rt_size_t newsize);

    分配多内存块

    /**  * @brief 从内存堆中分配连续内存地址的多个内存块,并且所有分配的内存块都被初始化成零  * @param count:内存块数量

     * @param size:内存块容量  * @retval 返回的指针指向第一个内存块的地址 */

    void *rt_calloc(rt_size_t count, rt_size_t size);

    释放内存块

    /**  * @param ptr:待释放的内存块指针 */

    void rt_free (void *ptr);

    设置分配钩子函数

    /**  * @brief 设置的钩子函数会在内存分配完成后进行回调,回调时,会把分配到的内存块地址和大                小做为入口参数传递进去  * @param hook:钩子函数指针 */

    void rt_malloc_sethook(void (*hook)(void *ptr, rt_size_t size));

    设置内存释放钩子函数

    /**  * @brief 设置的钩子函数会在调用内存释放完成前进行回调。回调时,释放的内存块地址会做为                入口参数传递进去(此时内存块并没有被释放)  * @param hook:钩子函数指针 */

    void rt_free_sethook(void (*hook)(void *ptr));

    2 动态内存相关知识点

    使用动态内存,需要打开宏RT_USING_USER_MAIN 与 RT_USING_HEAPrt_system_heap_init在board.c中的rt_hw_board_init函数中已经被调用系统能够使用的栈大小由宏 RT_HEAP_SIZE 进行配置

    3. 使用动态内存

    /* 定义申请内存的指针 */ rt_uint32_t *ptr = RT_NULL; ptr = rt_malloc(64); /* 申请64字节内存 */ /* 释放内存块*/ rt_free(ptr[i]); ptr[i] = RT_NULL;

     

    最新回复(0)