社区导航

 

搜索
查看: 3223|回复: 6

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

[复制链接]

92

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-6-1 16:21 | 显示全部楼层 |阅读模式
本帖最后由 seanwaye 于 2017-6-1 16:33 编辑

各位朋友好:

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

假设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版本的。




此帖出自uCOS/uCGUI论坛


回复

使用道具 举报

999

TA的帖子

1

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

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

点评

中断没那么长时间,以下是我的中断处理任务: OSIntEnter(); TIM_DMACmd ( TIM4, TIM_DMA_Update, DISABLE ); // 禁止请求 DMA_Cmd ( DMA1_Channel4, DISABLE ); /  详情 回复 发表于 2017-6-3 17:21
人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。


回复

使用道具 举报

92

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-6-3 17:21 | 显示全部楼层
本帖最后由 seanwaye 于 2017-6-3 17:26 编辑
huixianfxt 发表于 2017-6-3 16:56
你的中断多长时间执行一次?也就是多长时间释放一次互斥信号量?是不是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使能语句而已。


回复

使用道具 举报

999

TA的帖子

1

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

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

点评

不是定时器更新中断程序,是在任务里面pend到了信号量了,然后处理任务,处理完了就产生了中断,在中断里面post信号量,整个流程大概是10ms以内。  详情 回复 发表于 2017-6-6 19:39
人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。


回复

使用道具 举报

92

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-6-6 19:39 | 显示全部楼层
huixianfxt 发表于 2017-6-5 08:22
如果你的中断程序是定时器更新中断程序的话,你的定时周期是多长时间?(是不是100ms以上产生一次定时器更 ...

不是定时器更新中断程序,是在任务里面pend到了信号量了,然后处理任务,处理完了就产生了中断,在中断里面post信号量,整个流程大概是10ms以内。


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-12-22 09:35 | 显示全部楼层
中断中不允许释放mutex


回复

使用道具 举报

1

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-20 23:48 | 显示全部楼层
看一下   OSMutexPost   的源码就清楚了

1. 中断(ucos 管理的)中不能释放互斥信号;

2. 只有在使用的task中才能释放互斥信号;


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-3-22 05:38 , Processed in 0.233344 second(s), 18 queries , Gzip On, MemCache On.

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