你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32F103跑ucos部分任务停转死机是什么原因?

[复制链接]
SamXu 提问时间:2017-9-15 14:40 /
各位好,我遇到个关于stm32的问题,我的系统中有11个任务,起始任务优先级60,后面任务优先级依次是10,11,12,13,14,15、、、19;还有一个ms定时器;一个查询式按键,在ms定时器中检测,抛出消息到任务10中处理;
1、运行一段时间后,多个任务停转,从任务12开始低优先级的任务都不能调度到,只有10和11正常运行,定时器中断正常;当按键按键后消息能正常传递到任务优先级为10的任务中处理;
2、后来在定时器里面添加软件看门狗,每个任务pend信号超时1秒钟,每个任务运行一次会喂一次狗,如果出现调度延时超过10秒就抛出消息实现软件复位;
而目前的情况是,在出现任务停转的时候,看门狗能检测到,并且能抛出消息实现软复位,但是复位后,又会马上出现这个现象,只有把电源拔掉以后才会正常运行;
首先确定应该不是堆栈溢出的问题,应为我试过堆栈越界的话会导致所有任务都调度不到,而不是某些低优先级的任务调度不到。
请大家帮忙分析下原因看看。


收藏 1 评论4 发布时间:2017-9-15 14:40

举报

4个回答
飞扬自我 回答时间:2017-9-22 10:11:20
刚刚学习ucosiii 但是没有工程历程学习,现在卡在信息队列这里,我像你这样有多个任务,但是我怎么通过信息进行两个任务的通信呢?不知道是否可以发一下程序学习一下,511760409@qq.com 谢谢,保证只学习,不应用,不流传
SamXu 回答时间:2017-9-25 14:48:02
H0700210417 发表于 2017-9-22 10:11
刚刚学习ucosiii 但是没有工程历程学习,现在卡在信息队列这里,我像你这样有多个任务,但是我怎么通过信息 ...

项目中没有用消息队列,只用了信号量和锁,不过开发板上有个关于消息队列的例程,可以发你看看
SamXu 回答时间:2017-9-27 15:31:36
还有个情况,就是通过硬件复位信号,使单片机复位都不能再次正常运行,只能把电源断掉,重新上电。。。。
SamXu 回答时间:2017-10-19 12:55:43
后来找到可能的原因了,想办法提高了复现率;
貌似是两个任务同时使用一个ADC的不同通道造成的,
当两个任务同时采样时,adc转化很快就完成了,在等待adc转化结束的while里面会一直等待,导致低于这个优先级的任务会一直堵死而高优先级的任务任然能运行;
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
        res = ADC_GetConversionValue(ADC1);
后来在检测前后加上锁,就没有复现这个问题了:
LOCK_ADC();
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
        res = ADC_GetConversionValue(ADC1);
UNLOCK_ADC();

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版