搜索
bottom↓
回复: 1

重开一贴:UCOS中关于信号量的问题!!!

[复制链接]

出0入0汤圆

发表于 2010-3-1 16:11:37 | 显示全部楼层 |阅读模式
原来的问题有些错误,现在重开一贴。板子是万利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按下刷新串口*/  
}   
OSSemPost(InfoSem);
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);/*问题出在这(为什么申请信号量后KEY1和KEY2都无法刷新??)*/  
b2 = BSP_PB_GetStatus(BSP_PB_ID_KEY2);  
if (b2 == 2) {  
App_DispScr_SignOn();/*按键2按下刷新串口*/  
}   
OSSemPost(InfoSem);
OSTimeDlyHMSM(0, 0, 0, 10);   
    }  
}  

App_TaskKbd的优先级高,现在的问题是,在App_TaskJoystick 函数中申请信号量OSSemPend(InfoSem,0,&err)后,按下KEY1和KEY2串口都不刷新;而在App_TaskJoystick 去掉OSSemPend(InfoSem,0,&err)后KEY1和KEY 2可以正常刷新??
一:按书上说高优先级任务获得执行权,那么App_TaskKbd申请信号量后应该是KEY 1获得执行权可以进行刷新,但是现在按下KEY 1也无反应;
二:而在KEY 1执行完后,通过OSTimeDlyHMSM(0, 0, 0, 10)使当前任务App_TaskKbd延时进入等待状态,App_TaskJoystick (KEY 2)如若申请执行权应该可以获得才对,但是现在我在KEY 2中申请执行权后KEY 1 KEY 2按键都无法执行刷新;
三:如果App_TaskJoystick (KEY 2)不申请执行权,该任务是不是就一直处于运行状态,所以可以完成串口刷新?但UCOS不是使高优先级任务先运行吗,为什么可以使另一个任务一直在运行??是不是当高优先级需要运行时使高优先级任务先完成,然后再运行剩下的??

问题有些琐碎,麻烦大家不吝指教解答下,看了书但对信号量的理解还是不是很懂,谢谢了

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

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

出0入0汤圆

发表于 2010-3-2 15:28:09 | 显示全部楼层
在操作系统开始运行前使用下面的语句建立一个信号量。

    RandomSem = OSSemCreate(1);            /* 建立随机数信号量 */

这样,我们就建好了一个叫RandomSem的信号量,可以使用它对共享资源进行管理。假设有两个任务Task1和Task2都需要产生随机数,则必须按照下面的格式进行代码编写。

任务一:

void  Task1(void *pdata)

{

    INT8U  x;

    INT8U err;

    for (;;)

    {

       OSSemPend(RandomSem, 0, &err);/*请求信号量*/

        x = random(80);                  /* 获取80以内的一个随机数*/

       OSSemPost(RandomSem);           /*释放信号量*/

       /* 其他代码 */

    }

}

任务二:

void  Task2(void *pdata)

{

    INT8U  x;

    INT8U err;

    for (;;)

    {

       OSSemPend(RandomSem, 0, &err);/*请求信号量*/

        x = random(20);                  /* 获取20以内的一个随机数*/

       OSSemPost(RandomSem);           /*释放信号量*/

       /* 其他代码 */

    }

}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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

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