t200017 发表于 2010-2-28 14:55:46

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

板子是万利199的板子
/*检测按键1*/
staticvoidApp_TaskKbd (void *p_arg)
{
    INT8Ub1,b2;
INT8Uerr;
    (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*/
staticvoidApp_TaskJoystick (void *p_arg)
{
INT8Ub1,b2;
INT8Uerr;
    (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,邵贝贝的那本书看过后也没找到答案

dq031 发表于 2010-2-28 21:54:09

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

t200017 发表于 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不是使高优先级任务先运行吗,为什么可以使另一个任务一直在运行??是不是当高优先级需要运行时使高优先级任务先完成,然后再运行剩下的??

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

ba_wang_mao 发表于 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()

t200017 发表于 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
页: [1]
查看完整版本: 求教:UCOSII中信号量的问题??