这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32编程开发中常见的堆栈溢出

共1条 1/1 1 跳转至

STM32编程开发中常见的堆栈溢出

院士
2024-07-17 17:11:19     打赏

在STM32编程开发中,最头疼的一件事就是程序运行着就进入了hardfault_handler里面了。进入到这个可恶的hardfault_handler里面十之八九是由于堆栈溢出导致的。本次就总结一下STM32编程开发中常见的堆栈溢出吧!

  1. 局部变量过多

    在函数内部定义了过多的局部变量。这个主要是我们在函数内部新开数组临时空间。比如我在某函数进入时,新申请了一个临时变量uint8_t buf[1024];而此时堆栈的空间已经不足1024B了,这里就会导致一次hardfault_handler的触发。

    解决办法:

    对于函数每次都要使用的缓存空间,我们可以将其声明为全局变量,这样在编译阶段即可分配好内存,不再占用堆栈的空间了。

  2. 内存管理不当

    这个主要是使用了malloc()函数和free()函数,而且使用的时候申请和释放又存在不合理的地方。

    解决办法:

    malloc()函数是一个不可重入函数,早些年一直存在嵌入式开发中禁用malloc()函数的声音。我其实是反对禁用的,但这些年的经验看,嵌入式MCU开发中,业务逻辑相对固定,内存的随机分配使用情况非常少。所以,还是能不用就不用malloc()函数吧!

  3. 递归调用

    递归函数,且递归调用的层数不可控时,则基本都会产生堆栈溢出的情况。

    解决办法:

    通过算法的实现,规避掉递归算法。不再使用递归函数。

  4. 函数参数传递过大

    函数参数不要把巨大的结构体按值传递,这样函数调用的时候拷贝变量的成本也高。

    解决办法:

    由按值传递的方式修改为指针传递的方式。简单也实用。

今天就为大家总结到这里吧!如果您在编程过程中,遇到类似的问题,也欢迎把问题回复在帖子后面。当然,更欢迎大家把解决办法一并贴出来。





关键词: STM32     编程     堆栈     溢出    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]