9045|6

72

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

中断释放互斥信号量有问题 [复制链接]

  本帖最后由 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版本的。




最新回复

看一下   OSMutexPost   的源码就清楚了 1. 中断(ucos 管理的)中不能释放互斥信号; 2. 只有在使用的task中才能释放互斥信号;  详情 回复 发表于 2018-12-20 23:48
点赞 关注
 

回复
举报

951

帖子

1

TA的资源

纯净的硅(中级)

沙发
 
你的中断多长时间执行一次?也就是多长时间释放一次互斥信号量?是不是100ms以上释放一次?

点评

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

回复

72

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 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使能语句而已。
 
 
 

回复

951

帖子

1

TA的资源

纯净的硅(中级)

4
 
如果你的中断程序是定时器更新中断程序的话,你的定时周期是多长时间?(是不是100ms以上产生一次定时器更新中断)而不是中断程序本身的执行时间。

点评

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

回复

72

帖子

0

TA的资源

一粒金砂(中级)

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

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

回复

3

帖子

0

TA的资源

一粒金砂(初级)

6
 
中断中不允许释放mutex
 
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

7
 
看一下   OSMutexPost   的源码就清楚了

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

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表