搜索
bottom↓
回复: 4

求教:UCOSII中信号量的问题??

[复制链接]

出0入0汤圆

发表于 2010-2-28 14:55:46 | 显示全部楼层 |阅读模式
板子是万利199的板子
/*检测按键1*/
static  void  App_TaskKbd (void *p_arg)
{
    INT8U  b1,b2;
INT8U  err;
    (void)p_arg;
  
    while (DEF_TRUE) {
    OSSemPend(InfoSem,0,&err);
        b1 = BSP_PB_GetStatus(BSP_PB_ID_KEY1);
if (b1 == 1) {
App_DispScr_SignOn();/*按键1按下刷新串口*/
}  
OSTimeDlyHMSM(0, 0, 0, 10);  
    }
}
/*检测按键2*/
static  void  App_TaskJoystick (void *p_arg)
{
INT8U  b1,b2;
INT8U  err;
    (void)p_arg;

  
    while (DEF_TRUE) {
    //OSSemPend(InfoSem,0,&err);/*问题出在这(为什么不用申请信号量??申请后KEY2无法刷新??)*/
b2 = BSP_PB_GetStatus(BSP_PB_ID_KEY2);
if (b2 == 2) {
App_DispScr_SignOn();/*按键2按下刷新串口*/
}  
OSSemPost(InfoSem);/*为什么在KEY1中申请的信号量不在key1中释放而在KEY2中释放呢*/
OSTimeDlyHMSM(0, 0, 0, 10);  
    }
}

现在的问题是,在App_TaskJoystick 函数中申请信号量OSSemPend(InfoSem,0,&err)后,按下KEY 2串口不刷新,按KEY 1没事。而在App_TaskJoystick 去掉OSSemPend(InfoSem,0,&err)后按下KEY 2可以正常刷新
想问下错在哪个地方,按下按键操作不是都要先申请信号量吗???还有就是为什么可以在KEY 1中申请信号量然后在KEY 2中释放,而不是在KEY 1中直接释放呢??
请各位大虾不吝指教,小弟刚接触UCOS,邵贝贝的那本书看过后也没找到答案

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-2-28 21:54:09 | 显示全部楼层
通过你描述的内容可以猜出App_TaskKbd比App_TaskJoystick的任务优先级高。如果两个任务都是在等待一个信号量的话,只有高优先级的任务获得执行权。
    你把 //OSSemPend(InfoSem,0,&err);/*问题出在这(为什么不用申请信号量??申请后KEY2无法刷新??)*/ 这个屏蔽了,App_TaskJoystick任务就一直处于运行状态,所以可以完成串口刷新。

出0入0汤圆

 楼主| 发表于 2010-3-1 15:37:35 | 显示全部楼层
回复【1楼】dq031
    通过你描述的内容可以猜出App_TaskKbd比App_TaskJoystick的任务优先级高。如果两个任务都是在等待一个信号量的话,只有高优先级的任务获得执行权。
    你把 //OSSemPend(InfoSem,0,&err);/*问题出在这(为什么不用申请信号量??申请后KEY2无法刷新??)*/ 这个屏蔽了,App_TaskJoystick任务就一直处于运行状态,所以可以完成串口刷新。
-----------------------------------------------------------------------

原来的问题有点错,应该是在App_TaskKbd和App_TaskJoystick中申请信号量后按下按键1、2都无法刷新,但如果只在App_TaskKbd中申请信号量KEY1 和KEY2都可以刷新,为什么?App_TaskKbd确实优先级比App_TaskJoystick高,但是我还有几个问题,想麻烦你再解释一下我的疑问
一:如果我都在App_TaskKbd和App_TaskJoystick中申请信号量后,KEY 1和KEY 2按下都无法刷新,按你的说法高优先级任务获得执行权,那么应该是KEY 1获得执行权可以进行刷新,但是现在按下KEY 1也无反应;
二:而在KEY 1执行完后,通过OSTimeDlyHMSM(0, 0, 0, 10)使当前任务延时进入等待状态,KEY 2如若申请执行权应该可以获得才对,但是现在我在KEY 2中申请执行权后KEY 1 KEY 2按键都无法执行刷新;
三:如果KEY 2不申请执行权,“就一直处于运行状态,所以可以完成串口刷新"?UCOS不是使高优先级任务先运行吗,为什么可以使另一个任务一直在运行??是不是当高优先级需要运行时使高优先级任务先完成,然后再运行剩下的??

问题比较多也比较简单,高手就不要见笑了,请麻烦逐一解答下,看完书后还是有些不懂

出0入0汤圆

发表于 2010-3-1 16:06:16 | 显示全部楼层
在任务中调用信号量,切记:必须成对出现.

     while (DEF_TRUE)
   {  
        OSSemPend(InfoSem,0,&err);  
        b1 = BSP_PB_GetStatus(BSP_PB_ID_KEY1);  
        if (b1 == 1)
        {  
            App_DispScr_SignOn();/*按键1按下刷新串口*/  
         }   
         OSTimeDlyHMSM(0, 0, 0, 10);   
    }  


  在上述任务中没有看到OSSemPost()

出0入0汤圆

 楼主| 发表于 2010-3-1 16:57:10 | 显示全部楼层
回复【3楼】ba_wang_mao
在任务中调用信号量,切记:必须成对出现.
     while (DEF_TRUE)  
   {   
        OSSemPend(InfoSem,0,&err);   
        b1 = BSP_PB_GetStatus(BSP_PB_ID_KEY1);   
        if (b1 == 1)  
        {   
            App_DispScr_SignOn();/*按键1按下刷新串口*/   
         }   
         OSTimeDlyHMSM(0, 0, 0, 10);   
    }   
  在上述任务中没有看到OSSemPost()

-----------------------------------------------------------------------

我在App_TaskKbd 中加入OSSemPost()释放信号后,在App_TaskJoystick再申请信号量时也同样会出现KEY1 和KEY2都无法响应刷新的问题。。。好像两者都没收到信号量,照理说应该是高优先级的App_TaskKbd (KEY1)有反应而App_TaskJoystick无反应,现在是KEY1、KEY2都无反应
我重新开了一贴,是修改后的:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3898154&bbs_page_no=1&search_mode=3&search_text=t200017&bbs_id=9999
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 23:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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