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

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