地瓜patch 发表于 2025-8-8 21:37

HardFault_Handler与数组溢出

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

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

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

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

页: [1]
查看完整版本: HardFault_Handler与数组溢出