[嵌入式C编程与固件开发] HardFault_Handler与数组溢出

[复制链接]
 楼主| 发表于 2025-8-8 21:37 | 显示全部楼层 |阅读模式
在程序测试中,经常出现HardFault_Handler硬件错误,很多时候这个错误都出现的莫名其妙。排查起来也有些麻烦。
HardFault(硬件错误)是ARM Cortex-M处理器中的一种异常类型,当系统发生严重错误时触发。
这个错误通常提示程序执行了非法操作,提到非法操作那就多了,
比如:访问了无效的内存地址、执行了未定义的指令、除零操作、堆栈溢出、非法中断返回
常见原因有四五种,例如:
内存访问错误:访问NULL指针、数组越界、访问未初始化的指针、访问已释放的内存
堆栈溢出:递归调用过深、局部变量占用空间过大、堆栈大小配置不足、
中断处理问题:中断服务程序(ISR)执行时间过长、中断优先级配置错误、未清除中断标志
非法操作:除零操作、未对齐的内存访问、执行未定义的指令

在实际代码的测试debug中,真实遇到数组越界的内存访问错误。在通信中数组赋值时为了方便通常使用数组下标递增的方式来进行赋值。如下
void WriteData_to_Flash(void)
{               
                //1000uLǹͷ
                Write_Flash_Buffer[Flash_Count++]=Tip1000uL_RowX_Position1   ;
                Write_Flash_Buffer[Flash_Count++]=Tip1000uL_ColumnY_Position1;
                Write_Flash_Buffer[Flash_Count++]=Tip1000uL_DeepZ_Position1  ;
                Write_Flash_Buffer[Flash_Count++]=Tip1000uL_RowX_Position2   ;
                Write_Flash_Buffer[Flash_Count++]=Tip1000uL_ColumnY_Position2;
                Write_Flash_Buffer[Flash_Count++]=Tip1000uL_DeepZ_Position2  ;
                //200uLǹͷ
                Write_Flash_Buffer[Flash_Count++]=Tip200uL_RowX_Position1                ;
                Write_Flash_Buffer[Flash_Count++]=Tip200uL_ColumnY_Position1;
                Write_Flash_Buffer[Flash_Count++]=Tip200uL_DeepZ_Position1  ;
                Write_Flash_Buffer[Flash_Count++]=Tip200uL_RowX_Position2   ;               
                Write_Flash_Buffer[Flash_Count++]=Tip200uL_ColumnY_Position2;
                Write_Flash_Buffer[Flash_Count++]=Tip200uL_DeepZ_Position2  ;
                //50uLǹͷ
                Write_Flash_Buffer[Flash_Count++]=Tip50uL_RowX_Position1                ;
                Write_Flash_Buffer[Flash_Count++]=Tip50uL_ColumnY_Position1;
                Write_Flash_Buffer[Flash_Count++]=Tip50uL_DeepZ_Position1  ;
                Write_Flash_Buffer[Flash_Count++]=Tip50uL_RowX_Position2   ;
                Write_Flash_Buffer[Flash_Count++]=Tip50uL_ColumnY_Position2;
                Write_Flash_Buffer[Flash_Count++]=Tip50uL_DeepZ_Position2  ;
                //Éî¿×°å
                for(u8 ii=0;ii<6;ii++)
                {
                                Write_Flash_Buffer[Flash_Count++]=DeepWell_RowX_Position[ii];
                }
                for(u8 ii=0;ii<6;ii++)
                {
                                Write_Flash_Buffer[Flash_Count++]=DeepWell_ColumnY_Position[ii];
                }
                for(u8 ii=0;ii<6;ii++)
                {
                                Write_Flash_Buffer[Flash_Count++]=DeepWell_DeepZ_Position[ii];
                }
                for(u8 ii=0;ii<6;ii++)//È¡²úÎï¿×λ
                {
                                Write_Flash_Buffer[Flash_Count++]=DeepWell_ColumnY_Position[ii]-7000;
                }
                //²ÉÑù¹Ü
                Write_Flash_Buffer[Flash_Count++]=SampleTube_X_Position1;
                Write_Flash_Buffer[Flash_Count++]=SampleTube_X_Position1 + 10500;//SampleTube_X_Position2
                Write_Flash_Buffer[Flash_Count++]=SampleTube_Y_Position1;
                Write_Flash_Buffer[Flash_Count++]=SampleTube_Y_Position1;//SampleTube_Y_Position2=SampleTube_Y_Position1
                Write_Flash_Buffer[Flash_Count++]=SampleTube10mL_DeepZ_Position;
                Write_Flash_Buffer[Flash_Count++]=SampleTube5mL_DeepZ_Position;
                //СÊԹܼÜ
                Write_Flash_Buffer[Flash_Count++]=TubeSm_RowX_Position        ;  
                Write_Flash_Buffer[Flash_Count++]=TubeSm_ColumnY_Position;
                for(u8 ii=0;ii<7;ii++)//²»Í¬ÊÔ¹Üz×ø±ê
                {
                                Write_Flash_Buffer[Flash_Count++]=TubeSm_DeepZ_Position[ii];
                }
                //´óÊԹܼÜ
                Write_Flash_Buffer[Flash_Count++]=TubeBig_RowX_Position          ;
                Write_Flash_Buffer[Flash_Count++]=TubeBig_ColumnY_Position ;                       
                Write_Flash_Buffer[Flash_Count++]=TubeBig5mL_DeepZ_Position;
                Write_Flash_Buffer[Flash_Count++]=TubeBigXmL_DeepZ_Position;       
                //΢¿×°å
                Write_Flash_Buffer[Flash_Count++]=MicroPlate_RowX_Position         ;
                Write_Flash_Buffer[Flash_Count++]=MicroPlate_ColumnY_Position;
                Write_Flash_Buffer[Flash_Count++]=MicroPlate_DeepZ_Position  ;
                //ÍËǹͷ
                Write_Flash_Buffer[Flash_Count++]=TIP_Dushbin_X_Position;
                Write_Flash_Buffer[Flash_Count++]=TIP_Dushbin_Y_Position;
                Write_Flash_Buffer[Flash_Count++]=TIP_Dushbin_Z_Position;               
                       
                Write_Flash_Buffer[Flash_Count++]=Flash_Write_Done;
                Flash_Write(Write_Flash_Buffer,Flash_Count);
}

以上代码会触发HardFault_Handler硬件错误,根本原因是因为下标没有清零导致溢出

在函数头部加入Flash_Count = 0;解决该问题。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1785

主题

14817

帖子

29

粉丝
快速回复 返回顶部 返回列表