历史上的今天
今天是:2025年01月11日(星期六)
2020年01月11日 | STM32之程序如何防止堆栈溢出
2020-01-11 来源:eefocus
近日为某个项目写了个草稿程序,即非正式程序,后来发现老是进入hardfaulthandler,原来是堆栈溢出,后仔细查看发现函数调用纵深太深,最多的时候可保持7个函数在堆栈中调用。
因此有心得如下:
一、函数调用不要纵深太深,即以下模式:
main()
{
fun1();
}
fun1()
{
fun2();
}
fun2()
{
fun3();
}
fun3()
{
fun4();
}
fun4()
{
fun5();
}
fun5()
{
fun6();
}
fun6()
{
fun7();
}
这样子main函数要调用fun1函数完成某个功能,则要一直调到fun7为止,才能完成。这样导致堆栈中最多时要保存着main和fun1至fun7的所有信息,可能会导致堆栈溢出。
所以最好是不要调用太深。
二、局部变量不要太大太多,如局部数组,超过某个数量需定义为全局数组,因为局部数组同样储存在堆栈中。
上一篇:STM32堆栈溢出的问题
史海拾趣
|
GPS只能在室外定位,但若需要在室内实现定位功能怎么办呢?利用ZIGBEE技术实现定位就是一种不错的解决方案,同时该技术也可在室外实现定位。 资料下载-- http://www.wxlsoc.com/download/shows.aspx?id=28… 查看全部问答> |
|
求教各位高手,我现在想让skype在wince 5.0 上跑起来 ,我在网上看到说要找到skype for ppc 依赖哪些库文件 ,请问如何察看阿 , 我用vc下depends 和evc下depends 察看的 ,怎么出来的都是windows XP 下的库文件 ...… 查看全部问答> |
|
WINCE 6.0, VS2005 程序是一个任务管理器,几个对话框,主要操作是CTabCtrl加载几个对话框,(对话框由dialog create),在几个dialog中分别做的是1.每隔一段时间获得CPU和内存的状态,画图 2.获得当前运行的进程,显示于列表中 3.获得当前可见的 ...… 查看全部问答> |
|
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity read_write is port( clk : in std_logic ; mcu_oe : in std_logic;   ...… 查看全部问答> |
|
与前面已讲述的电场屏蔽及磁场屏蔽的机理不同,电磁屏 蔽对于电磁波的衰减有三种不同的机理: x 当电磁波在到达屏蔽体表面时,由于空气与金属的交界面上 阻抗的不连续,对入射波产生的反射。这种反射不要求屏蔽 材料必须有一定厚度,只要求交界 ...… 查看全部问答> |
|
介绍一下KEIL C51所支持的C语言和汇编语言混合编程的方法! 51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。在嵌入 ...… 查看全部问答> |




