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