这一章在干嘛? 内存管理实验:分块管理(malloc/free)、内存池、碎片处理。从此在 MCU 上用 malloc 也能稳定运行。
35.1 内存管理简介
STM32 内存有限(192 KB SRAM),malloc/free 容易碎片化。
三种内存管理方法:
- 静态数组:预先分配固定 buffer,最稳;
- 动态 malloc:C 库自带,可能碎片;
- 内存池:固定大小块池,无碎片,效率高。
正点原子提供 mymalloc / myfree 内存管理:基于分块 + 链表。管理 32 KB SRAM。
原书图 35.1.1:内存池块链表结构
选哪种:RTOS 用系统自带;裸机且分配频繁用内存池;偶尔分配用 malloc。
35.2 硬件设计
本实验纯软件,串口输出调试信息。
35.3 程序设计
35.3.1 API
void mymem_init(uint8_t size); // size 单位 KB
void *mymalloc(uint32_t size); // 字节
void *myrealloc(void *ptr, uint32_t size);
void myfree(void *ptr);
35.3.2 关键代码
mymem_init(32); // 初始化 32 KB 内存池
uint8_t *p = (uint8_t *)mymalloc(1024);
if (p) {
sprintf((char *)p, "Hello, Memory Pool!");
printf("%s\n", p);
myfree(p);
}
原书图 35.3.2.1:mymalloc 流程图
原书图 35.3.2.2:内存碎片示意
35.4 下载验证
申请 256 字节 → 写入 → 释放;多次循环无内存泄漏。
避免内存泄漏:申请完一定释放;不使用裸 malloc,改用 mymalloc 便于监控剩余空间。
🧠 小测验三种内存管理方法?
静态数组、动态 malloc、内存池。
内存池的优势?
无碎片、分配 O(1)、适合嵌入式。
mymalloc 单位?
字节。