首页 > 系统相关 >STM32出现HardFault_Handler故障的原因1. **内存溢出或访问越界** 2. **堆栈溢出**

STM32出现HardFault_Handler故障的原因1. **内存溢出或访问越界** 2. **堆栈溢出**

时间:2024-10-01 13:20:07浏览次数:8  
标签:char HardFault int data STM32 堆栈 buf 溢出

STM32出现HardFault_Handler故障的原因

STM32系统中,HardFault_Handler故障主要有两个方面的原因:

  1. 内存溢出或访问越界
  2. 堆栈溢出

最近我遇到的问题是栈溢出,情况如下:

static char data[10000];

void fun1(unsigned char *buf) {
    int i = 0;
    for (i = 0; i < 5000; i++) {
        data = buf;
    }
}

void fun2(void) {
    unsigned char buf[5000];
    // 其他代码
    fun1(buf); // 执行完毕此函数后出现硬件错误 HardFault_Handler
    printf("data: %s\r\n", buf);
}

int main() {
    // 其他代码
    fun2();
    // 其他代码
    while (1);
}

问题分析

通过断点调试,在进入fun1(buf)函数时发现SP指向了数组data所开辟的空间,同时PC和其他寄存器的值也压入了栈。在循环执行data = buf时,修改了压入栈的数据,导致在退出fun1(buf)时PC指向了错误的位置。

问题一:为什么SP会指向数组data所开辟的空间?
原因是发生了栈溢出。

问题二:是什么导致了堆栈溢出?
我们可以查看相关资料,了解堆栈的概念。

startup_stm32f10x_md.s文件中,可以看到如下定义:

Stack_Size     EQU    0x00000400
Heap_Size      EQU    0x00000200

堆和栈的区别

  1. 栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量等,操作方式类似于数据结构中的栈。
  2. 堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,分配方式类似于数据结构中的链表。
  3. 全局区(静态区)(static):全局变量和静态变量的存储,初始化和未初始化的变量分别存放在不同的区域,程序结束后由系统自动释放。
  4. 文字常量区:存放常量字符串等数据。
  5. 程序代码区:存放函数体的二进制代码。

示例

int a = 0;                    // 全局初始化区
char *p1;                     // 全局未初始化区

int main() {
    int b;                    // 栈
    char s[] = "abc";        // 栈
    char *p3 = "1234567";    // 文字常量区
    static int c = 0;        // 静态初始化区
    p1 = (char *)malloc(10); // 堆区
    strcpy(p1, "123456");    // "123456" 放在常量区
}

堆栈溢出原因分析

明白堆栈的分配原理后,我们可以确认是栈溢出而非堆溢出。导致栈溢出的原因在于unsigned char buf[5000];的定义,buf的开辟占用了较大的栈空间,超出了在startup_stm32f10x_md.s文件中定义的栈大小,从而导致栈溢出。

问题总结

  1. 当函数内部变量占用空间较大时,建议将其定义为全局变量或静态变量,以减少堆栈的占用。
  2. 通过使用指针解决数据复制问题,进一步降低内存占用。

标签:char,HardFault,int,data,STM32,堆栈,buf,溢出
From: https://blog.csdn.net/2401_87496566/article/details/142621409

相关文章

  • STM32
    元器件STM32F103C8T6面包板:硬件平台STLINK:下载程序与供电0.96寸OLED显示屏(4引脚)LED灯,按键(2引脚)USB转TTL串口:串口通信跳线,杜邦线,飞线蜂鸣器模块电位器:AD转换光敏模块:IO口读取、AD热敏模块对射式红外传感器:配合遮光片可计次,配合编码盘测速反射式红外传感器:循迹车-识别......
  • 垃圾桶溢出识别监测系统
    垃圾桶溢出识别监测系统通过计算机视觉技术,垃圾桶溢出识别监测系统对社区街道垃圾桶里面垃圾溢出满载现象进行自动识别,垃圾桶溢出识别监测系统监测到社区或者街道垃圾桶里面垃圾溢出时,不需人为干预可以立即告警提醒后台值班人员及时清理。垃圾桶溢出识别监测系统通过AI视频分析技......
  • 【嵌入式裸机开发】基于stm32的照相机(OV7670摄像头、STM32、TFTLCD)
    基于STM32的照相机准备工作最终效果一、下位机1、主函数2、OV7670初始化二、上位机1、控制拍照2、接收图片数据准备工作一、硬件及片上资源:1,串口1(波特率:921600,PA9/PA10通过usb转ttl连接电脑,或者其他方法)上传图片数据至上位机2,串口2(波特率:115200,PA2/PA3......
  • STM32F1+HAL库+FreeTOTS学习14——数值信号量
    STM32F1+HAL库+FreeTOTS学习13——数值信号量1.数值信号量2.相关API函数2.1创建计数信号量2.2获取信号量2.3释放信号量2.4删除信号量2.5获取信号量的计数值3.操作实验1.实验内容2.代码实现:运行结果上一期我们学习了二值信号量,这一期学习计数信号量1.......
  • 单片机毕业设计——基于STM32单片机的智能窗帘的控制系统 要怎么设计与实现呢(全程可免
    基于STM32单片机的智能窗帘控制系统整合了多个环境检测功能和远程控制功能,以提高居住舒适度和安全性。以下是根据功能需求分步骤的具体实现方案:一、系统规划与设计需求分析:明确系统需要实现的功能,包括温湿度检测、光照检测、下雨检测、烟雾检测、Wi-Fi通信和APP开发。硬件选......
  • 零基础学STM32(四)-LED灯闪烁实验
    本项目讲解所用工程均使用stm32f103C8T6芯片HAL库版本。原理讲解本节内容我们讲解点亮LED灯闪烁实验,简单来讲就是实现LED电平翻转实现LED灯亮灭的过程。我们点亮LED灯需要给LED输入一个高电平,熄灭LED灯则给LED灯输入一个低电平,将两个电平状态不断重复即可实现LED的闪烁。初......
  • 蓝桥杯—STM32G431RBT6(TIM定时器输入捕获频率和占空比)
    一、什么是输入捕获?对比输出捕获区别?输入捕获是指对输入信号的特定事件进行检测和记录它主要用于测量输入信号的时间间隔、频率等参数。而输出捕获则是对输出信号的特定事件进行控制和监测。两者的主要区别在于作用对象不同,输入捕获关注的是输入信号,而输出捕获关注的是输出信......
  • 蓝桥杯--STM32G431RBT6(TIM定时器的输出频率和占空比,含详细原理介绍和使用方法)
    目录一、前言二、代码实现功能:​编辑按如图配置定义变量编写执行代码 显示在LCD上加入按键效果三、效果展示四、代码开源 一、前言ARR即自动重装载值(AutoReloadRegister)。相当于一个水杯,水杯容量,水满为一个周期,倒掉重新滴水。它是一个用于指定特定数值的参......
  • STM32 f407 多通道ADC采集+DMA传输 基于HAL库和Cubemx配置
    在实际应用中ADC往往是要和DMA一起使用的,DMA将ADC转换值放入预设好的变量中,该过程不占用CPU资源,需要读取ADC输入时再让CPU读取变量即可。下面记录使用cubemx配置多通道ADC采集的具体流程,并编写对ADC采样值进行滤波的程序(选择开发板、开启外部时钟和SW调试接口、ProjectManage......
  • STM32 f407 多通道PWM输出 基于HAL库和Cubemx配置
    STM32PWM的相关理论知识可以参考江科大的视频教程,或者正点和野火的HAL库开发手册,以下是相关链接:[6-4]PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机_哔哩哔哩_bilibili31.TIM—高级定时器—[野火]STM32HAL库开发实战指南——基于野火F4系列开发板文档下面记录一下使......