相关文章
-
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 内存资源,把几个地址不连续的内存块管理起来