发 帖  
原厂入驻New
ucosii中两个任务等待信号量,由于任务优先级引起的死机怎么解决
21 RS485
分享
大家好,我是一个新人,平时就逛帖子但是不会发帖,最近在项目中遇到一个问题。希望各位大牛能给握指一条明路。
项目中,有了一个rs485和Ble的任务。
代码的框架逻辑是这样的。
uart2中断接受数据  + RS485任务中读取数据&分析数据是否完整 + 解析任务里处理数据帧
uart1中断接受数据  + Ble任务中读取数据&分析数据是否完整 + 解析任务里处理数据帧
处理的方式是:状态机
中断里的状态机:
1> sp_rec_apply
2>sp_rec_filling
3>sp_apply_faiLED
任务读取数据和分析的状态机:
1>sp_wait_rec_done
2>sp_rec_done
在sp_wait_rec_done 这个状态中使用了信号量
OSSemPend(rs485_sft_cntr.sem, 0, &err_rs485);
实现的功能就是,有数据就运行,没数据就休眠。
但是有一个问题:
BLE_REC_TASK_PRIO  7  蓝牙任务的优先级
RS485_REC_TASK_PRIO 8 RS485任务的优先级
在这个优先级的时候一旦蓝牙收数据,就死机,就进hardfault。
BLE_REC_TASK_PRIO  9  蓝牙任务的优先级
RS485_REC_TASK_PRIO 8 RS485任务的优先级
在这个优先级的时候一旦485收数据,就死机,就进hardfault。
谁优先级高谁接受数据就死机。
我查到是由于任务调度的时候发生了些什么,导致这个问题。但是究竟是什么原因且不得而知。
0
2020-5-22 03:40:37   评论 分享淘帖 邀请回答
4个回答
大多数都是内存溢出造成的,你每个任务的堆栈空间设置多大?
2020-5-22 14:37:40 评论

举报

是这样的。我蓝牙的堆栈开了50,RS485堆栈开了50。数据帧解析的任务是128个字节。后来我把蓝牙和RS485的堆栈都改到了60.现在测试不死机了。谢谢
2020-5-22 14:48:52 评论

举报

你好,我能再问你一个问题嘛?我后来测试了下,当蓝牙和485都是 100ms/次发送。还是会进硬件错误。我把堆栈测试了 :
1>堆栈 80  659个数据后死机。 200ms一次
2>堆栈 90  876个数据后死机。 100ms一次
3>堆栈 100 409个数据后死机。 100ms一次
4>堆栈128 230个数据后死机。 100ms一次
好像没什么规律,但是这次还是堆栈引起的嘛?
2020-5-22 15:08:14 评论

举报

每个任务配置128再试试,os貌似有一个函数可以获取每个任务所用的堆栈空间的,找找
2020-5-22 15:22:50 评论

举报

只有小组成员才能发言,加入小组>>

240个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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