工控驿站

 找回密码
 立即注册
工控驿站»工控驿站 » 编程软件»中断释放互斥信号量有问题
查看: 416|回复: 4

[求助帖] 中断释放互斥信号量有问题

[复制链接]

签到天数: 3 天

连续签到: 1 天

[LV.2]偶尔看看I

发表于 2017-6-12 14:57:31 | 显示全部楼层 |阅读模式
各位朋友好:

最近调试代码遇到个问题:

假设Task_A和Task_B两任务的优先级分别为high和low,这两个任务都需要使用互斥信号量mutex,这个互斥信号量在中断服务函数里面释放,代码简略示意如下:

Task_A()
{      
.............
   while(1)
   {
         OSMutexPend ( &mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err );
         .........
         OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err ); //延时100ms   }
   
}

Task_B()
{
   ............
   while(1)
   {
         OSMutexPend ( &mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err );
         .........
         OSTimeDlyHMSM ( 0, 0, 0, 50, OS_OPT_TIME_HMSM_STRICT, &err ); //延时50ms   }
}

void xxxx_IRQHandler()
{
   OS_ERR p_err;
    OSIntEnter();
    ............
    OSIntExit();
    OSMutexPost ( &mutex, OS_OPT_POST_NONE, &p_err );
}

问题是: 在这个中断服务函数释放互斥信号量后,一直都是Task_A运行,Task_B一直得不到运行,如果不加互斥信号量任务A和B都能轮流运行的,所以任务应该是不存在被高优先级剥夺了运行权限的可能的,

后来我把任务A改成这样:
Task_A()
{
   ............
   while(1)
   {
        OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err ); //延时100ms

         OSMutexPend ( &mutex, 0, OS_OPT_PEND_BLOCKING, NULL, &err );
         .........
         OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err ); //延时100ms   }
}

也就是在任务A的死循环开头加了个100ms的延时,这时候又变成了一直是任务B运行,任务A一直拿不到信号量,感觉很不可思议,所以发帖出来请各位朋友帮忙分析下大概是什么原因。

这个代码是基于ucosIII3.05版本的。

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

发表于 2017-6-17 15:40:57 | 显示全部楼层
你的中断多长时间执行一次?也就是多长时间释放一次互斥信号量?是不是100ms以上释放一次?

签到天数: 3 天

连续签到: 1 天

[LV.2]偶尔看看I

 楼主| 发表于 2017-6-17 16:09:01 | 显示全部楼层
dgsjxzdh 发表于 2017-6-17 15:40
你的中断多长时间执行一次?也就是多长时间释放一次互斥信号量?是不是100ms以上释放一次? ...

中断没那么长时间,以下是我的中断处理任务:
   OSIntEnter();

    TIM_DMACmd ( TIM4, TIM_DMA_Update, DISABLE );           // 禁止请求

    DMA_Cmd ( DMA1_Channel4, DISABLE );                     // disable DMA1 channel 4
    DMA_ClearFlag ( DMA1_FLAG_TC4 );

    OSIntExit();
   OSMutexPost ( &mutex, OS_OPT_POST_NONE, &err );

我的思路是:任务A高优先级,先请求到了互斥信号量,然后处理任务,处理完了后进入延时,然后中断里面释放信号量,任务B低优先级请求到了信号量,运行任务,然后和任务A一样的流程,任务A和B的任务运行肯定是要不了多长时间的,就是几个赋值语句与DMA使能语句而已。

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

发表于 2017-6-17 17:01:49 | 显示全部楼层
如果你的中断程序是定时器更新中断程序的话,你的定时周期是多长时间?(是不是100ms以上产生一次定时器更新中断)而不是中断程序本身的执行时间。

签到天数: 3 天

连续签到: 1 天

[LV.2]偶尔看看I

 楼主| 发表于 2017-6-21 14:30:45 | 显示全部楼层
dgsjxzdh 发表于 2017-6-17 17:01
如果你的中断程序是定时器更新中断程序的话,你的定时周期是多长时间?(是不是100ms以上产生一次定时器更 ...

不是定时器更新中断程序,是在任务里面pend到了信号量了,然后处理任务,处理完了就产生了中断,在中断里面post信号量,整个流程大概是10ms以内。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

武汉夜生活 武汉夜生活 武汉桑拿网 武汉桑拿网 武汉桑拿网 武汉夜生活

QQ|小黑屋|手机版|Archiver|工控驿站 ( 鲁ICP备11011731号-4

GMT+8, 2020-4-2 17:55 , Processed in 0.343750 second(s), 20 queries .

Powered by 工控资料窝

© 2013-2015 www.gkwo.net

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