STM32分配堆栈空间不足问题原因及解决方法
扫描二维码
随时随地手机看文章
STM32堆栈空间不足问题
先说结论,以STM32F103RCT6为例,初始的栈空间是1KB,堆空间是512Byte。如果动态内存分配需求过多时,需要手动调节堆空间。在启动文件startup_stm32f103xe.s的开头就可以设置堆栈空间大小。同样,在STM32CubeMX中也可对堆栈大小进行修改,在Project -> Settings选项中可以对Minimum Heap Size大小进行更改。扩大之后即可解决堆栈空间不足的问题。
遇到的问题今天在STM32F103RCT6上,使用malloc()为链表分配内存空间时,忽然遇到一次分配内存过多而死机的问题。查阅官方文档发现此型号的单片机FLASH 256KB,RAM 48KB。我链表的结构体定义如下:
typedefstructLNode{uint8_tdata;structLNode*next;}LNode,*LinkList;1234
uint8_t类型在单片机中定义为unsigned char即1个字节,32位系统一个指针变量为4字节。由于“内存对齐”机制的存在,所以实际上一个节点分配的内存为8字节。并且通过输出语句printf("%d",sizeof(*Head));打印到串口助手显示的也是8,证明的分析的正确性。
经过测试发现,我最多能创建32个节点,因此我只使用了32*8=256 byte的内存空间。与官方文档的48KB的内存空间相差太多。
解决方法查阅网上的博客发现,堆栈大小可以在stm32的启动文件startup_stm32f103xe.s里面设置,开头就有:
Stack_SizeEQU0x400Heap_SizeEQU0x20012
0x00000400 等于1024字节所以等于1K
0x00000200 等于512字节所以等于512 Byte
参考博客:http://blog.csdn.net/xlhcgd/article/details/45769267
由于malloc()分配的动态内存在堆区域,因此调大堆空间Heap_Size为0xC00,即3072字节大小。重新测试,发现可以接收到191个节点,这次使用了191*8=1528 byte大小的内存空间。由此判断,用户可以自由使用的堆空间,大约为堆总空间的一半。超过时系统就会死机。
注:在STM32CubeMX中也可对堆栈大小进行修改,在Project -> Settings选项中可以对Minimum Heap Size大小进行更改。