stallone 发表于 2013-6-16 15:55:28

ucos-ii的信号量问题OSSemPend(Fun_Semp,0,&err);

OSSemPend(Fun_Semp,0,&err);函数运行时并不处于等待状态。
当信号量初始化为0时,Fun_Semp=OSSemCreate(0); 理论上两个程序都应该处于等待状态,但在电脑上运行时发现两个程序一直在运行,没有处于等待状态。


/*编写一个应用程序,其中有一个函数Fun()和两个用户任务:MyTask和YouTask。应用程序中的两个任务都可以
调用此函数,但不能同时调用*/

#include "INCLUDES.h"

#defineTASK_STK_SIZE      512       /* 任务堆栈长度*/            
char *s1="MyTask";
char *s2="YouTask";
INT8U err;
INT8U y=0;
OS_EVENT *Fun_Semp;    //声明信号量

OS_STK      StartTaskStk;   //定义任务堆栈区
OS_STK      MyTaskStk;
OS_STK      YouTaskStk;

voidFun(INT8U x,INT8U y);
voidStartTask(void *data);
voidMyTask(void *data);                  /* 声明任务      */
voidYouTask(void *data);

/*
*********************************************************************************************************
*                                                MAIN主函数
*********************************************************************************************************
*/
voidmain (void)
{
        Fun_Semp=OSSemCreate(0);                               //定义信号量
    OSInit();                                              /* 初始化uC/OS-II */
    PC_DOSSaveReturn();                                    /* 保存DOS环境   */
    PC_VectSet(uCOS, OSCtxSw);                           /* 安装uC/OS-II的中断 */
    OSTaskCreate(StartTask,(void *)0, &StartTaskStk, 0); //创建起始函数
    OSStart();                                             /* 启动多任务管理   */
}

voidStartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3      /* Allocate storage for CPU status register */
    OS_CPU_SRcpu_sr;
#endif
    INT16S      key;             /*用于退出的建*/
pdata = pdata;                                       /* Prevent compiler warning               */
    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);                           /* 安装时钟中断向量*/
    PC_SetTickRate(OS_TICKS_PER_SEC);                      /* 设置时钟频率 */
    OS_EXIT_CRITICAL();
    OSStatInit();                                          /* 初始化统计任务   */

    OSTaskCreate(MyTask,(void *)0, &MyTaskStk, 1); //创建任务函数
        OSTaskCreate(YouTask,(void *)0, &YouTaskStk, 2); //创建任务函数
        for (;;)
    {
            //如果恩下ESC键,则退出UC/OS-II
      if (PC_GetKey(&key) == TRUE)
         {                     /* See if key has been pressed            */
            if (key == 0x1B)
            {                           /* Yes, see if it's the ESCAPE key          */
                PC_DOSReturn();                            /* Return to DOS                            */
            }
      }
      OSTimeDlyHMSM(0,0,3,0);                         /* 等待3S*/
    }
}

voidMyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3      /* Allocate storage for CPU status register */
    OS_CPU_SRcpu_sr;
#endif
   
    pdata = pdata;                                       /* Prevent compiler warning               */
    for (;;)
    {       
            OSSemPend(Fun_Semp,0,&err);      //请求信号量
                PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
                Fun(7,y);
//                OSSemPost(Fun_Semp);    //发送信号量
      OSTimeDlyHMSM(0,0,1,0);                         /* 等待1S*/
    }
}

voidYouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3      //Allocate storage for CPU status register
    OS_CPU_SRcpu_sr;
#endif

        pdata=pdata;
        for (;;)
        {
                OSSemPend(Fun_Semp,0,&err);    //请求信号量
                PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
                Fun(7,y);   //调用FUN函数
//                OSSemPost(Fun_Semp);

      OSTimeDlyHMSM(0,0,2,0);    //等2s            
    }       
}

void Fun(INT8U x,INT8U y)
{
        PC_DispStr(x,y,"Calling FUN()",DISP_BGND_BLACK+DISP_FGND_WHITE);
}

Eric2013 发表于 2013-6-16 16:59:24

OSInit();                                              /* 初始化uC/OS-II */
Fun_Semp=OSSemCreate(0);            //定义信号

系统还没有初始化,不能创建

YFM 发表于 2013-6-16 17:26:17

判断 Fun_Semp是不是0.

stallone 发表于 2013-6-16 18:19:07

Eric2013 发表于 2013-6-16 16:59 static/image/common/back.gif
OSInit();                                              /* 初始化uC/OS-II */
Fun_Semp=OSSemCreate(0); ...

多谢多谢!就是这个问题!
页: [1]
查看完整版本: ucos-ii的信号量问题OSSemPend(Fun_Semp,0,&err);