STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法

调试STM32+ucosII的程序,程序老是进入HardFault_Handler。定位问题方法如下:
进入调试界面,在HardFault_Handler中断处理的while(1)处打断点,等待程序出错。STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第1张图片
然后打开register窗口
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第2张图片
注意红框中的数值,将MSP中的数值在Memory窗口中搜索。在栈中找到程序在进入HardFault_Handler中断处理函数前的入栈地址。
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第3张图片
红框内就是出错程序出的地址,由于程序在进入中断处理函数前要依次将R0、R1、R2、R3、R12和SP寄存器中的值入栈,所以找到栈的地址后依次数到SP处复制里面的值 到计算器中转化为16进制。
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第4张图片
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第5张图片
将计算其中的16进制数复制,然后打开Disassembly窗口,鼠标右键–》
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第6张图片
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第7张图片
点击Go To按键就定位到出错代码的位置了
STM32 进入HardFault_Handler调试定位问题方法 + 定位到ucos的 OSStartHighRdy()的处理方法_第8张图片
OSStartHighRdy();导致既然HardFault_Handler错误,我的问题是因为我有两个任务的堆栈定义的太小导致栈溢出。修改堆栈大小就解决了。这个问题的解决我参考了https://blog.csdn.net/NicholasWuT/article/details/80336850

你可能感兴趣的:(STM32)