stm32+ucosii|stm32+ucosii hardhandle调试经历

企图在ucosii中加入了一个新任务 uctaskview来监视各任务堆栈出现的问题,却发现程序陷入了HardFault_Handler.
断点跟踪,发现如果单步执行就没问题,一旦用(F5)运行来调试就跳入这个异常了。
百思不得其解,开始调试:
首先打开寄存器窗口查找SP地址:0x2000e5d0stm32+ucosii|stm32+ucosii hardhandle调试经历
文章图片

然后打开内存窗口,查找0x2000e5d0,查看堆栈:
stm32+ucosii|stm32+ucosii hardhandle调试经历
文章图片


根据arm入栈顺序找到LR地址:0x08007229 注意小端模式
根据LR地址找到出错的函数:stm32+ucosii|stm32+ucosii hardhandle调试经历
文章图片

原来此函数是在中断服务中调用,所以就解释了上述为什么单步执行没问题,用F5运行时就会跳出异常了。


下面继续查找出错原因:
跟踪发现在此中断服务中调用了一个未初始化的fifo。如果操作这个fifo时未对fifo的指针进行赋值,则会访问默认地址(0x00000)的情况,而stm32的内存地址开始为0x20000..
所以就会出现 HardFault_Handler 异常了。
至此,问题根本原因找到,解决问题的方案自然也就很多了。


总结一下:出现这种 HardFault_Handler 问题一般有两种,一是堆栈溢出,而是程序设计欠佳,导致对异常地址的访问。遇到这种问题时,根据sp的LR地址,找到出错语句,一步一步调试,最终肯定可以解决问题。


感谢:http://blog.csdn.net/zyboy2000/article/details/7668331 提供的帮助
【stm32+ucosii|stm32+ucosii hardhandle调试经历】

    推荐阅读