STM32 ------ HardFault_Hander 中断函数

本文详细解析了嵌入式系统中常见的硬故障原因,包括数组越界、局部数组过大、FreeRTOS内存管理不当等问题,并提供了定位和解决这些问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、数组越界(对数组赋值)

正常情况,数组越界会进入 HardFault_Hander 中断函数的无线循环。

避免数组越界的一个方法是:每次使用数组前,检查要放入数据的数据长度是否大于数组长度,大于则进入while(1),方便定位,如果可以打印信息更好。

 2、定义的局部数组过大,超过 IAR 设置的栈大小(未使用FreeRTOS)

单步运行时,刚执行完定义数组的语句不会立马进入 HardFault_Hander 中断函数,一般是再执行几个语句后进入

 

3、使用FreeRTOS,定义的局部数组过大,超过分配给数组所在的 task 的栈空间

单步运行时,刚执行完定义数组的语句不会立马进入 HardFault_Hander 中断函数,一般是再执行几个语句后进入

4、使用FreeRTOS,动态申请内存超过分配给FreeRTOS 可用 heap(总heap为configTOTAL_HEAP_SIZE)

单步运行时,刚执行完动态申请的语句不会立马进入 HardFault_Hander 中断函数,一般是再执行几个语句后进入

printf用的也是FreeRTOS中 heap 资源

5、使用STM32CubeMX生成的stm32f407xx_flash.icf

如果使用IAR自带的stm32f407xE.icf没有问题

 

6、数组越界(读取数组中的值)

比如下面函数,没有注释的那几条语句限制,会出现硬件异常

u8 *my_strstr(u8 *buf, u16 length, char *str)
{
    u8 *p;
    u16 i,j;
    for(i=0,j=0; j<strlen(str);)
    {
        if(str[j] == buf[i])
        {
            i++;
            j++;
            if(i >= length)
            {
                break;
            }
        }else
        {
            i++;
            j = 0;
//            if(i >= length)
//            {
//                break;
//            }
        }
    }
    if(j == strlen(str))
    {
        p = buf+(i-strlen(str));
    }else
    {
        p = NULL;
    }
    return p;
}

 

7、读不能读的地址的数据,和6类似

比如读STM32 unique ID,读的地址写错了,违法读数据 

 

转载于:https://www.cnblogs.com/god-of-death/p/8504757.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值