hqw 发表于 2018-4-22 10:44:39

是STM32掉进HardFault_Handler

一旦有数据发送给STM32(哪怕只是几个字节),就会掉到这里:
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}

void uart_receive_input(unsigned char value)
{


if((queue_in > queue_out) && ((queue_in - queue_out) >= sizeof(wifi_queue_buf)))
{

}
else if((queue_in < queue_out) && ((queue_out- queue_in) == 0))
{

}
else
{
    if(queue_in >= (unsigned char *)(wifi_queue_buf + sizeof(wifi_queue_buf)))
    {
      queue_in = (unsigned char *)(wifi_queue_buf);
    }

    *queue_in ++ = value;//如果这句屏蔽就不会
}
}

   网上有关HardFault_Handler的述说也是有的,但我还是没弄清楚我这个是如何产生的及怎样解决。多谢大家的指教

feixiang20 发表于 2018-4-23 01:05:44

本帖最后由 feixiang20 于 2018-4-23 01:07 编辑

仅作参考,STM32进入HardFault_Handler处理办法HardFault_Handler出现的情况一般有两种:
一种是:数组越界
一种是:堆栈溢出,程序指针指飞
1.在中断HardFault_Handler中的while()处打上断点,让程序执行到此处停止。
在Registers里面找到R14(LR)的值,我的这里是:0xFFFFFFF9
说明一下:
0xFFFFFFF9对应的是要看MSP寄存器
0xFFFFFFFD对应的是要看PSP寄存器
所以这里需要查找的内存地址是MSP的值:0x20008828
2.进入 HardFault_Handler 可以查看M3,4,0 的内核寄存器看是哪里的问题,把接收buffer改小一点试试
3.参考https://www.stmcu.org.cn/module/forum/thread-612166-1-1.html





springvirus 发表于 2018-4-23 16:24:03

请仔细检查程序,我遇到过接手别人程序,对长度做减1操作,但执行前未做非法值的判断,结果运行当中,会有机率出现对0做减1,导致死机,仿真跟了一段时间才找出这个错误

发表于 2018-4-23 17:00:49

数组溢出导致,楼主好好算一下使用数组是不是超出最大长度了。

hqw 发表于 2018-4-26 15:40:28

大家讲的都有道理,但就是没有人点出问题是在哪里。:lol
*queue_in ++ = value;我已经知道它掉进HardFault_Handler前,就是运行到这里。(换言之,它如果运行到*queue_in ++ = value;就会掉进HardFault_Handler)。但为什会进去,大家能把问题的根源缩小下吗?

vlivli 发表于 2018-4-26 16:13:05

学习下。
页: [1]
查看完整版本: 是STM32掉进HardFault_Handler