最近做的一个项目遇到一个很莫名的错误,程序运行到某一部分时便会卡死,分析后,感觉在逻辑上并无错误,但是就是会卡死,而且不是偶然。
后来在网上查找资料怀疑是内存溢出,然后调试发现是两个函数中的的局部变量申请的内存空间太大,所以错误应该是栈溢出了。将这两个变量使用malloc申请堆段空间完美解决。
下面是对STM32的堆栈(Heap&Stack)小结:
- 内存分配空间
- 内核保护区
- 栈段
- 堆段
- 数据区
- 代码区
代码区 :静态区
常量(const)
函数代码逻辑数据区:静态区
全局变量
局部变量+static堆段:动态区,管理者是程序员
malloc申请的空间栈段:动态区,管理每个子函数的空间,管理者是操作系统
局部变量内核保护区
STM32的启动文件中,开始便定义了堆栈的空间大小:
Stack_Size 0x400 => 100 0000 0000 => 1024Byte =>1KByte
Heap_Size 0x200 =>10 0000 0000 =>512Byte