在开发STM32程序的时候,如果局部变量较多,应该时刻注意堆和栈的占用情况,今天出现的BUG就是因为没有注意导致的。
看下面的代码
// main.c
void func()
{
double x[1024];
// some code
}
// startup_stm32f407xx.s
Stack_Size EQU 0x800
// 中间省略
Heap_Size EQU 0x800
func
是我在main文件中定义的某个函数,然后在main函数中调用了它,startup_stm32f407xx.s
是stm32初始化文件,用汇编写的,里面可以查询到堆区和栈区的大小。
我们知道局部变量创建在栈区,我们设置的栈区大小为0x800,也就是2048Byte,一个double
类型占用8个字节,函数申请了一个1024个元素的double
数组,这很明显就已经超出了堆栈范围,所以程序运行直接崩溃。
我的解决办法是把占用内存多的变量申请在全局区,这样程序在编译的时候会自动计算需要的空间,这样就不会出错了。
另一种办法是修改堆栈大小,这种方法我还没试过,因为我不清楚堆栈可以设置的上限是多少,如果有知道的大佬还希望能在评论区指教以下。小弟在这先谢谢了。