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

 

posted @   流水灯  阅读(414)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示