使用 lm401 模组,基于STM32WLE5 调试时,遇到 malloc 分配内存提示内存不足
现记录解决过程如下
【LoRaWAN_End_Node】基于LoRaWAN模组代码解析
【lm401】解决malloc动态申请内存时内存不足的问题
1.问题描述
lm401 模组驱动墨水屏,具体参考博客:【LM401】STM32WLE5+SPI接口驱动 2.66inch e-paper 墨水屏
墨水屏显示时,需要先申请一大段内存空间,由于模组还使用LoRaWAN功能,因此malloc申请内存时,提示申请失败。
代码重现:查看代码,程序向堆栈malloc申请 296 * 152 / 8 / 1024 = 5.5 kb
大约 5.5 kb 内存空间
t提示内存不够:
2. 问题定位
2.1 MCU 内存信息
STM32WLE5xB 板载信息,如下。 48kb 的RAM 不可能不够用,怎么回事呢?
- FLASH
128Kb - RAM 48Kb
2.2 查看代码运行内存情况
在 STMCube IDE 中查看内存情况,在 Build Analyzer 窗口的 Memory Regions 查看
可以看到还有 4.53kb
的ram 空间,我需要申请5.5kb的空间,肯定是不够用的,问题定位成功。
2.3 应用程序的内存分区
查看 STM32WLE5CBUX_FLASH.ld
文件,可以看到内存分配的文件:
3. 问题解决
解决:更改一下RAM的大小,修改结果如下。
运行代码,不再提示内存不够用了。
4. 关于RAM 与堆栈
注意:
- 栈:系统分配,执行速度快,内存连续,声明变量就自动开辟空间
- 堆:用户申请,执行速度慢,内存不连续,用户申请时,系统通过链表将不连续的内存串在一起使用