OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 2309|回复: 9

程序在OS_Sched进入HardFault_Handler

[复制链接]

  离线 

5

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-5-26
在线时间
14 小时
发表于 2018-1-30 16:00:31 | 显示全部楼层 |阅读模式
10金钱
MCU是STM32F413,移植的ucosII,程序创建了4个任务,有一个和触摸屏通讯任务,串口232通讯方式。在只开启两个任务(另两个屏蔽),一个触摸屏任务,一个只运行LED,这种情况下,在操作触摸屏(实际是有读写,串口中断方式发送和接收),通讯数据量50字节以内,这种情况下,未出现死机(进入HardFault_Handler)。但当把另两个任务开启,(都为CAN通讯),任务之间有信号量的传递以及数据锁。当操作触摸屏时,(读写数据,字节少于50),程序会死掉,按照网上的进入HardFault_Handler解决方法跟踪到是死在OS_Sched,当屏蔽掉写触摸屏的部分代码,程序不会毕现的死掉。偶尔死掉也是在切换页面(读写触摸屏,或者读写其他串口)。在中断中都有调用OSIntEnter();OSIntEnter();(由于外部晶振没有,使用的是内部晶振。)
尝试过更改任务优先级,更改任务延时时间(实际这块也不是很会设置),更改任务的堆栈大小(改到4096)都失败。
此问题困扰几天,不知有没有遇到相似问题的朋友或者是这方面的大神、原子哥不吝赐教,谢谢了!!!

回复

使用道具 举报

  离线 

5

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-5-26
在线时间
14 小时
 楼主| 发表于 2018-1-30 20:02:13 | 显示全部楼层
有哪位可以给个建议或者方向的?
回复

使用道具 举报

  离线 

509

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
132772
金钱
132772
注册时间
2010-12-1
在线时间
1244 小时
发表于 2018-1-31 01:23:45 | 显示全部楼层
帮顶
回复

使用道具 举报

  离线 

5

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-5-26
在线时间
14 小时
 楼主| 发表于 2018-1-31 08:50:21 | 显示全部楼层

原子哥,能不能给点建设性帮助?谢谢!
回复

使用道具 举报

  离线 

74

主题

6644

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
13287
金钱
13287
注册时间
2013-11-13
在线时间
1568 小时
发表于 2018-1-31 09:55:14 | 显示全部楼层
把启动文件.S里面的栈大小改大一点,在把所有的任务的任务堆栈也改大试试,如果还不行就接上STLINK调试,看看是哪一行代码进入的hardfault
回复

使用道具 举报

  离线 

5

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-5-26
在线时间
14 小时
 楼主| 发表于 2018-1-31 11:57:19 | 显示全部楼层
zuozhongkai 发表于 2018-1-31 09:55
把启动文件.S里面的栈大小改大一点,在把所有的任务的任务堆栈也改大试试,如果还不行就接上STLINK调试,看 ...

谢谢,按照你说的,我改了.S文件里栈的大小(4096),任务堆栈(4096),现象依然出现,DEBUG调试,程序死在OS_Sched函数最后跳出那一行。还在持续找问题所在,再次谢谢!
回复

使用道具 举报

  离线 

5

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-5-26
在线时间
14 小时
 楼主| 发表于 2018-1-31 15:03:33 | 显示全部楼层
zuozhongkai 发表于 2018-1-31 09:55
把启动文件.S里面的栈大小改大一点,在把所有的任务的任务堆栈也改大试试,如果还不行就接上STLINK调试,看 ...

你好,针对这个问题,我刚测试的现象。我有两个CAN通讯任务,一个CAN通讯,我的接收是定义的消息队列和内存块,接收到CAN数据都放在内存块里,再调函数去取。把这个任务和触摸屏的任务一起运行(均有数据的发送接收),不会出现死机。而另一个CAN通讯任务,我的接收存储只是定义了一个结构体和一个标志位,发完数据,等待(OSTimeDly(1))CAN数据接收标志置位,再取数据。把这个CAN通讯任务和触摸屏的任务一起运行,当CAN任务只发送不接收(命令帧不需要回复),此时并不会死机,当发CAN命令需要回复时(有CAN中断接收时),就死机,毕现。问题似乎出在这个地方,不知有何指导?多谢多谢!(我继续解决中)
回复

使用道具 举报

  离线 

4

主题

220

帖子

0

精华

高级会员

Rank: 4

积分
761
金钱
761
注册时间
2018-1-29
在线时间
85 小时
发表于 2018-2-6 07:04:04 | 显示全部楼层
OS_Sched函数最后跳出那一行出错,说明恢复之前的线程现场出错啊!很可能是堆栈问题。
回复

使用道具 举报

  离线 

14

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2012-10-11
在线时间
65 小时
发表于 2018-6-28 11:43:08 | 显示全部楼层
楼主,你的问题解决了没,我也碰到OS_Sched进入HardFault_Handler 的问题,能否给点意见?
回复

使用道具 举报

  离线 

14

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
225
金钱
225
注册时间
2012-10-11
在线时间
65 小时
发表于 2018-6-28 11:45:42 | 显示全部楼层
backup2k 发表于 2018-2-6 07:04
OS_Sched函数最后跳出那一行出错,说明恢复之前的线程现场出错啊!很可能是堆栈问题。

堆栈?任务堆栈还是启动文件的堆栈?
回复

使用道具 举报

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

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-20 17:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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