问题描述:
当程序进入HardFault_Handler(void),此时程序进入死机状态。也就是程序跑飞了。
HardFault_Handler难处理是因为我们不知道程序为何会进入HardFault_Handler中断,也不知道程序在哪里进入了HardFault_Handler中断。所以需要想办法知道程序在哪里,在哪个程序段进入了HardFault_Handler。
首先需要了解HardFault_Handler是一个中断程序,那我们就参考中断的处理过程。
中断处理第一步,入栈,入栈需要保存寄存器的值,而这里面有一个LR寄存器。
既然在进入HardFault_Handler之前已经保存了程序的返回地址,所以我们只要找到这个LR寄存器就解决了第一个问题,程序在哪里进入了HardFault_Handler。查找数据手册,确认LR的地址。
查LR寄存器,确认出问题的程序段
1. 编写出问题的程序
2. 开始调试
找到出问题的函数。
(调试中i<10000改为i<10调试,发现程序进入了HardFault_Handler,但不是在出错的程序段进入的,而是在程序的外循环进入,此时LR不能正确指向出错程序段,因为并非在出错程序段进入HardFault_Handler,此时LR寄存器指向0x0000015b,原因是写10的时候程序没有直接进入HardFault_Handler,而是修改了调用该子函数的函数的压栈数据,导致程序出错,这里面涉及到数组的生长方向以及栈的生长方向,数组的数据覆盖了函数栈的数据导致程序出错了)