野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8349|回复: 9

[ucos] 求助关于STM32F407在MDK5.14平台运行UCOSIII出现hardfault问题

[复制链接]
发表于 2017-2-3 21:44:38 | 显示全部楼层 |阅读模式
背景如下:项目中用STM32F407作为主控,运行几个任务,然后在调试的时候通过串口打印,会出现时不时的进入hardfault,时间长短不一。在程序进入hardfault之前使用fault reports查看到底是什么错误引起的,基本就是以下几条:1、MM_FAULT-IACCVIOL  2、Bus_Faults-IBUSERR  3、Usage_Faults-INVSTATE  总是这三条在变换,搞不懂什么情况。


现在希望通过MDK平台进入调试模式运行,希望能将问题找出,进入hardfault前是出现了什么问题,网上找了好多关于定位进入hardfault前的那条指令,但是基本上都是基于F1系列的,涉及到的问题在于MDK5.14对F4的调试功能支持较差,无法使用Call+Stack+Locals进行跟踪,因为出现hardfault后进入此界面没有任何参考信息,关于使用memory1查看LR的值,然后通过Disassembly查找地址,也没有找到对应的语句是哪一条,基本上是找不到该地址。在这里想请问下大家平时在使用F4运行UCOSIII时出现hardfault时都是怎么调试的,希望有经验的朋友能指点一二,非常谢谢!
回复

使用道具 举报

发表于 2017-2-4 09:12:03 | 显示全部楼层
F1与F4的调试功能一样的,另外其实一般hardfault都是内存问题,检查一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-4 16:02:34 | 显示全部楼层
flyleaf 发表于 2017-2-4 09:12
F1与F4的调试功能一样的,另外其实一般hardfault都是内存问题,检查一下

谢谢回复,我现在发现出现hardfault的时间长短不一,但是现在不太清楚到底怎么去定位有异常的代码地址。我贴几张图,麻烦指点一下,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-4 16:09:47 | 显示全部楼层
本帖最后由 hunt 于 2017-2-4 16:11 编辑

1.PNG 2.PNG 3.PNG C:\Users\Administrator\Desktop
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-4 16:16:53 | 显示全部楼层
本帖最后由 hunt 于 2017-2-4 16:18 编辑

第一次,不太会发帖,我上面截取了出现问题的截图,按照网上的说法我找到LR返回地址,结果跳到了OSStart 里面的       *p_err           = OS_ERR_FATAL_RETURN; 里面,看网上说一般都是内存溢出或者数组越界,我时刻打印着我各个任务的堆栈使用情况,没发现溢出,但是我运行一段时间后经常是通过RS485读取完照片后再进行几次任务切换就会进入hardfault。

4.PNG
回复 支持 反对

使用道具 举报

发表于 2017-2-4 16:28:48 | 显示全部楼层
hunt 发表于 2017-2-4 16:16
第一次,不太会发帖,我上面截取了出现问题的截图,按照网上的说法我找到LR返回地址,结果跳到了OSStart 里 ...

是不是用了我们的GPS解码程序,GPS解码的程序需要的栈空间比较大,在启动文件里要调大一点的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-4 18:47:39 | 显示全部楼层
flyleaf 发表于 2017-2-4 16:28
是不是用了我们的GPS解码程序,GPS解码的程序需要的栈空间比较大,在启动文件里要调大一点的

是的,我看你们的手册上写着不是应该把堆空间设置大一些吗?也就是heap空间。另外想咨询下,根据上面进入hardfault的界面,能找到具体是哪出错了吗?我找着找着就没有头绪了。 捕获.PNG
回复 支持 反对

使用道具 举报

发表于 2017-2-5 10:14:14 | 显示全部楼层
参考gps例程里改大堆栈就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-5 10:23:40 | 显示全部楼层
flyleaf 发表于 2017-2-5 10:14
参考gps例程里改大堆栈就可以了

感谢您耐心的解答,我调试了好久,现在是整个系统跑半小时左右就会出现进入hardfault的情况,而且还都是上面同一个错误,定位出来是在OSStart里面,问题我UCOSIII都跑起来了,怎么还会在OSStart里面进入hardfault呢,而且我看网上说的,LR的值不为0x0800xxxx之类的基本上都是内存溢出或数组越界,现在我出现hardfault的LR值为0x0800C1F5,可能是数组越界的问题吗?
回复 支持 反对

使用道具 举报

发表于 2018-1-23 21:59:25 | 显示全部楼层
这个问题解决了吗,我现在碰到和你一样的问题了。
现象是一样的。
不过我的是MDK4.20做的工程没有问题,现在要改成MDK5就出这个问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-9 06:07 , Processed in 0.036805 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表