OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 926|回复: 7

程序在OS_Sched进入HardFault_Handler

[复制链接]

  离线 

4

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-5-26
在线时间
12 小时
发表于 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)都失败。
此问题困扰几天,不知有没有遇到相似问题的朋友或者是这方面的大神、原子哥不吝赐教,谢谢了!!!

回复

使用道具 举报

  离线 

4

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-5-26
在线时间
12 小时
 楼主| 发表于 2018-1-30 20:02:13 | 显示全部楼层
回复

使用道具 举报

  离线 

486

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

  离线 

4

主题

13

帖子

0

精华

新手上路

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

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

使用道具 举报

  离线 

55

主题

6090

帖子

5

精华

资深版主

Rank: 8Rank: 8

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

使用道具 举报

  离线 

4

主题

13

帖子

0

精华

新手上路

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

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

使用道具 举报

  离线 

4

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-5-26
在线时间
12 小时
 楼主| 发表于 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中断接收时),就死机,毕现。问题似乎出在这个地方,不知有何指导?多谢多谢!(我继续解决中)
回复

使用道具 举报

  离线 

3

主题

79

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

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

本版积分规则




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

GMT+8, 2018-2-24 00:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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