zoukankan      html  css  js  c++  java
  • 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,读的地址写错了,违法读数据 

  • 相关阅读:
    菜鸡的Java笔记 第十六
    菜鸡的Java笔记 第十五 this 关键字
    php 数组(2)
    菜鸡的Java笔记 第十四 String 类常用方法
    菜鸡的Java笔记 第十三 String 类的两种实例化方法
    菜鸡的Java笔记 第十二
    php 递推 递归
    bzoj2306 [Ctsc2011]幸福路径
    bzoj3712 [PA2014]Fiolki
    bzoj2958 序列染色
  • 原文地址:https://www.cnblogs.com/god-of-death/p/8504757.html
Copyright © 2011-2022 走看看