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

 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

