[研电赛技术支持] GD32 单片机 TCMSRAM 内存的使用 ——基于RT-Thread 多内存堆的管理算法( memheap 管

[复制链接]
1354|0
Jiangxiaopi 发表于 2025-9-8 08:52 | 显示全部楼层 |阅读模式
一、GD32 单片机介绍
以 GD32F450ZKT6 为例

8358368be28d2516ef.png


6692468be28ca26af9.png


9467168be28c10c566.png



3775268be28b77647b.png


613068be28b300d1b.png


GD32F450ZKT6 片上 RAM 分为2部分,192K + 64 K = 256 K

二、memheap 管理算法的介绍
memheap 管理算法适用于系统含有多个地址可不连续的内存堆。使用 memheap 内存管理可以简化系统存在多个内存堆时的使用:当系统中存在多个内存堆的时候,用户只需要在系统初始化时将多个所需的 memheap 初始化,并开启 memheap 功能就可以很方便地把多个 memheap(地址可不连续)粘合起来用于系统的 heap 分配。

注:在开启 memheap 之后原来的 heap 功能将被关闭,两者只可以通过打开或关闭 RT_USING_MEMHEAP_AS_HEAP 来选择其一.

9084668be28a858cc2.png


系统默认堆初始化函数—默认使用

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



这个函数会把参数 begin_addr,end_addr 区域的内存空间作为内存堆来使用。

5611868be289fe9f67.png


不连续内存堆初始化函数–用户使用
在使用 memheap 堆内存时,必须要在系统初始化的时候进行堆内存的初始化.

rt_err_t rt_memheap_init(struct rt_memheap  *memheap,
                        const char  *name,
                        void        *start_addr,
                        rt_uint32_t size)



如果有多个不连续的 memheap 可以多次调用该函数将其初始化并加入 memheap_item 链表。

2400668be2890cf6a7.png


三、开发环境
系统:RT-Thread 5.0.0 或者4.1.1
单片机:GD32F450ZKT6

四、系统配置
选择 memheap 管理算法

564868be28894c407.png


6746968be2883219ce.png


五、代码修改
增加宏定义

8711568be287cefed5.png


#ifdef RT_USING_MEMHEAP_AS_HEAP
    #define GD32_SRAM2_SIZE 64*1024
    #define GD32_SRAM2_BEGIN (0x10000000u)
    #define GD32_SRAM2_END (0x10000000 + GD32_SRAM2_SIZE)
#endif





定义 memheap 控制块

1257268be2870838b0.png


#ifdef RT_USING_MEMHEAP_AS_HEAP
    static struct rt_memheap ccm_heap;
#endif


调用 rt_memheap_init 函数初始化

6444468be2865dce23.png


/**
* This function will initial GD32 board.
*/
void rt_hw_board_init()
{
    /* NVIC Configuration */
#define NVIC_VTOR_MASK              0x3FFFFF80
#ifdef  VECT_TAB_RAM
    /* Set the Vector Table base location at 0x10000000 */
    SCB->VTOR  = (0x10000000 & NVIC_VTOR_MASK);
#else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */
    SCB->VTOR  = (0x08000000 & NVIC_VTOR_MASK);
#endif

    SystemClock_Config();

#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#ifdef RT_USING_CONSOLE
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

#ifdef BSP_USING_SDRAM
    rt_system_heap_init((void *)EXT_SDRAM_BEGIN, (void *)EXT_SDRAM_END);
#else
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif

#ifdef RT_USING_MEMHEAP_AS_HEAP
    rt_memheap_init(&ccm_heap, "ccm", (void *)GD32_SRAM2_BEGIN, GD32_SRAM2_SIZE);
#endif

}



六、测试
编译,下载到开发板,测试结果如下:

2387468be28517325a.png


————————————————
版权声明:本文为CSDN博主「嵌入式学习和实践」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46158019/article/details/151149101

您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部