STM32之程序如何防止堆栈溢出

发布者:Jinghua6666最新更新时间:2020-01-11 来源: eefocus关键字:STM32  堆栈溢出 手机看文章 扫描二维码
随时随地手机看文章

近日为某个项目写了个草稿程序,即非正式程序,后来发现老是进入hardfaulthandler,原来是堆栈溢出,后仔细查看发现函数调用纵深太深,最多的时候可保持7个函数在堆栈中调用。


因此有心得如下:


一、函数调用不要纵深太深,即以下模式:


main()

{

   fun1();

}

fun1()

{

  fun2();

}

fun2()

{

   fun3();

}

fun3()

{

  fun4();

}

fun4()

{

  fun5();

}

fun5()

{

  fun6();

}

fun6()

{

   fun7();

}

这样子main函数要调用fun1函数完成某个功能,则要一直调到fun7为止,才能完成。这样导致堆栈中最多时要保存着main和fun1至fun7的所有信息,可能会导致堆栈溢出。

所以最好是不要调用太深。


二、局部变量不要太大太多,如局部数组,超过某个数量需定义为全局数组,因为局部数组同样储存在堆栈中。

关键字:STM32  堆栈溢出 引用地址:STM32之程序如何防止堆栈溢出

上一篇:STM32堆栈溢出的问题
下一篇:STM32串口IAP实验中的地址问题

推荐阅读最新更新时间:2024-11-01 16:19

浅谈STM32控制IO基本配置的讲解
一个简单的工程搭建好之后,进一步就是了解里面的内容,也就是学习进入正轨。打开我之前新建的工程,主要调用的几个函数就是今天学习的内容,接下来我就讲解一下那些内容。 一、初始化始终 这里的“ 时钟 配置”函数在bsp.c文件下面; 使能了GPIOA --- GPIOD时钟,这里更加自己使用的IO进行配置(该工程实际只使用GPIOC)。 二、基本输入输出引脚配置 这里的“基本输入输出引脚配置”函数同样在bsp.c文件下面; 初始化GPIO, 包含 端口 引脚、频率、输出类型。 三、底层初始化 这里的“底层初始化”函数同样在bsp.c文件下面; 以后的底层初始化代码还会增加,这里调用上面的两个函数接口。 四、主函数应用
[单片机]
浅谈<font color='red'>STM32</font>控制IO基本配置的讲解
STM32 GPIO BRR和BSRR寄存器
使用BRR和BSRR寄存器可以方便地快速地实现对端口某些特定位的操作,而不影响其它位的状态。 比如希望快速地对GPIOE的位7进行翻转,则可以: GPIOE- BSRR = 0x80; // 置'1' GPIOE- BRR = 0x80; // 置'0' 如果使用常规'读-改-写'的方法: GPIOE- ODR = GPIOE- ODR | 0x80; // 置'1' GPIOE- ODR = GPIOE- ODR & 0xFF7F; // 置'0' 有人问是否BSRR的高16位是多余的,请看下面这个例子: 假如你想在一个操作中对GPIOE的位
[单片机]
STM32学习笔记-pwm生成-舵机控制
pwm是由定时器产生的 这是一个定时器3控制舵机的例子 不同舵机pwm的频率和占空比不同,用改变定时器初值和预分频值即可.
[单片机]
<font color='red'>STM32</font>学习笔记-pwm生成-舵机控制
STM32芯片如何使用片内参考电压实现模拟看门狗
STM32芯片的ADC模块往往都支持模拟看门狗功能,即可以对单个或多个通道开启模拟转换值的监测。当模拟通道ADC值超出设定的阈值时可以产生模拟看门狗事件并可触发看门狗中断。【注:下面截图或数据都是基于STM32L4系列芯片的,其它STM32系列与其类似。】 结合上图,当选定的ADC通道的转换结果比设置的阈值上限还高或比设定的阈值下限还低时都可以通过硬件触发模拟看门狗事件或中断。 假设现有STM32用户有这样一个应用需求,他希望STM32的供电电压低于一定程度时就提示低压报警,然后软件将进行相关处理。 关于这个应用需求,我们就可以利用片内的一个参考电压和模拟看门狗来实现。 我们知道,STM32芯片内部都内置了一个比
[单片机]
<font color='red'>STM32</font>芯片如何使用片内参考电压实现模拟看门狗
基于STM32的模拟UART串口通信工作原理
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,最后是停止位,停止位是用高
[单片机]
基于<font color='red'>STM32</font>的模拟UART串口通信工作原理
STM32上移植FreeModbus RTU的一点经验总结
这几天因为工作需要,移植了modbus RTU到STM32来,之前也听说过modbus,但是没有深入了解过,还以为会像usb 那样复杂的,经过这几天的折腾,发现真的太简单了。为了防止过段时间又忘记了怎么移植,在这里把移植过程记录下来,也为了方便初次接触modbus的人。 废话少说,首先去下载源码,我下载的是freemodbus-v1.5.0,解压后如图所示: 在demo文件夹中有很多移植好的例子,但是没有STM32的,不要紧,我们参考已有的例子来操作就可以了。在demo文件夹下新建一个文件夹,命名为STM32,将BARE文件夹里的文件全部复制过来。 然后,我们建立一个STM32的工程,我用的是mdk4.72,关于怎么建
[单片机]
在<font color='red'>STM32</font>上移植FreeModbus RTU的一点经验总结
STM32串口中断卡死主循环一直进中断问题分析
在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率115200; 2、主循环卡死; 3、USART1中断及TIM2中断响应函数运行正常;(USART1及TIM2中断优先级均比USART2高) 4、出现现象后,拔掉USART2的接收数据线,现象不能回复正常; 5、出现现象后,拔掉后再插入USART2的接收数据线,现象不能回复正常; 6、并未出现HardFault现象; 基于以上4点,可能原因如下: 1、USART2接收中断标志没有清除; 2、堆栈数据溢出,导致程序异常; 3、USART2中断重入导致异常; 4、USART2中断
[单片机]
<font color='red'>STM32</font>串口中断卡死主循环一直进中断问题分析
STM32学习之ADC
对于STM32,在使用ADC的时候需要配置几个参数。 (1) 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 (2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved