相关文章
-  STM32F407VET6开发板RT-Thread的移植适配 
-  STM32F407VET6开发板RT-Thread MSH 串口的适配 
环境
-  STM32F407VET6 开发板(魔女),http://www.stm32er.com/ 
-  Keil MDK5,版本 5.36 
memheap 内存堆
-  RT-Thread 支持 memheap 内存堆,并且支持多块内存(如SRAM)的管理 
-  如果 SRAM 地址不连续,可能会被分成几个内存块,多个内存块,可以使用 RT-Thread mem heap 进行管理 
STM32F407VET6 SRAM
- 通过查看 STM32F407VET6 的数据手册,SRAM总大小: 192K,分成三个部分

- bsp 默认配置了 128K,也就是 112+16,还有一块 SRAM : 64 KB 的并没有利用起来,本次配置并让其工作起来
配置链接脚本
-  Keil MDK5 的链接脚本: stm32f407\stm32f407-st-discovery\board\linker_scripts\link.sct
-  这里可以增加一个 SRAM2 的内存分区 

- board.c 中增加 SRAM2 的初始化代码
#define HEAP_SRAM2_BEGIN                (0x10000000)
#define HEAP_SRAM2_SIZE                 (64 * 1024)
static struct rt_memheap memheap_sram2;
int system_sram2_init(void)
{
    return rt_memheap_init(&memheap_sram2, "sram2", (void *)HEAP_SRAM2_BEGIN, (rt_size_t)HEAP_SRAM2_SIZE);
}
INIT_BOARD_EXPORT(system_sram2_init);
- 这里利用了 RT-Thread 自动初始化机制
配置使能 memheap
- 通过 RT-Thread ENV 工具: menuconfig,配置使能 memheap 功能,并使用 scons --target=mdk5更新工程


 
更新
-  更新后,编写下载,通过 RT-Thead msh 串口 shell,查看内存 SRAM2 正常的初始化了 
-  【备注】:可以编写内存的申请函数,确认是否会分配使用 SRAM2 的内存 

内存的申请测试:
-  可以大块申请内存,比如一次申请 20KB,如果 默认 128K heap不够了,就会在sram2内存堆中进行申请
-  可以使用 RT-Thread MSH cmd 命令进行测试: 
#define MEM_BLOCK_NUM           100
#define MEM_BLOCK_SIZE          10 * 1024
rt_uint8_t *user_ptr[MEM_BLOCK_NUM] = { 0 };
void mem_alloc_test(void)
{
    for (int i = 0; i < MEM_BLOCK_NUM; i++)
    {
        user_ptr[i] = rt_malloc(MEM_BLOCK_SIZE);
        if (!user_ptr[i])
        {
            rt_kprintf("malloc failed, index = %d\n", i);
            return;
        }
        else
        {
            rt_kprintf("[%d] : 0x%08x\n", i, user_ptr[i]);
        }
    }
}
MSH_CMD_EXPORT(mem_alloc_test, mem_alloc_test);
- 运行 自己创建的 msh cmd 命令: mem_alloc_test,发现内存块 sram2 也参与了内存的申请(rt_malloc),也就是内存分配,如果一个内存块不够,就尝试从其他内存块进行分配

小结
-  本篇记录 RT-Thread 内存块管理: memheap 内存堆的使用 
-  通过配置 memheap,充分利用 MCU 的 SRAM 内存资源,把几个地址不连续的内存块管理起来 



















