局部变量过多
在函数内部定义了过多的局部变量。这个主要是我们在函数内部新开数组临时空间。比如我在某函数进入时,新申请了一个临时变量uint8_t buf[1024];而此时堆栈的空间已经不足1024B了,这里就会导致一次hardfault_handler的触发。
解决办法:
对于函数每次都要使用的缓存空间,我们可以将其声明为全局变量,这样在编译阶段即可分配好内存,不再占用堆栈的空间了。
内存管理不当
这个主要是使用了malloc()函数和free()函数,而且使用的时候申请和释放又存在不合理的地方。
解决办法:
malloc()函数是一个不可重入函数,早些年一直存在嵌入式开发中禁用malloc()函数的声音。我其实是反对禁用的,但这些年的经验看,嵌入式MCU开发中,业务逻辑相对固定,内存的随机分配使用情况非常少。所以,还是能不用就不用malloc()函数吧!
递归调用
递归函数,且递归调用的层数不可控时,则基本都会产生堆栈溢出的情况。
解决办法:
通过算法的实现,规避掉递归算法。不再使用递归函数。
函数参数传递过大
函数参数不要把巨大的结构体按值传递,这样函数调用的时候拷贝变量的成本也高。
解决办法:
由按值传递的方式修改为指针传递的方式。简单也实用。
今天就为大家总结到这里吧!如果您在编程过程中,遇到类似的问题,也欢迎把问题回复在帖子后面。当然,更欢迎大家把解决办法一并贴出来。