• 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,读的地址写错了,违法读数据 

  • 相关阅读:
    WPF Window对象的生命周期
    MVC 控制器中传递dynamic(对象) 给视图
    MVC 获取路由的 URL 参数值和默认值的集合。
    mvc路由配置.html结尾的伪静态
    javascript 模拟按键点击提交
    微信小程序调用接口返回数据或提交数据
    清理电脑文件夹中的Thumbs.db文件
    asp.net动态增加服务器端控件并提交表单
    c# asp.net 实现分页(pager)功能
    注册时发短信如何防止别人恶意调用短信接口
  • 原文地址:https://www.cnblogs.com/god-of-death/p/8504757.html
Copyright © 2020-2023  润新知