UCOS 信号量的初值问题

当 pend请求发出的时候信号量的值减1,当post的时候信号量的值加1,信号量的值0跟1分别是用来同步跟互斥的,什么是同步,什么是互斥呢。。。假设你把信号量的值设为0,有A,B连个任务,当A发出pend请求的时候它发现此事的信号量值为0就把它减1然后挂起等待,等待到什么时候呢?等待任务B执行post操作把信号量的值加1然后唤醒进程A,然后两个进程同步并发执行。。。通俗点解释就是任务A执行到某个地方的时候先停下来睡觉,等待任务B来叫醒它,然后两个任务一起并发运行,也就是几乎同时从那个点开始运行哈。。。
假设信号量的值是1,就是用来互斥的,A,B两个任务只能其中一个任务pend执行成功返回,此时信号量的值是0,另一个在pend请求的时候就必须把自己挂起等待刚刚那个请求成功的任务执行post操作才能唤醒继续执行。。。

 

 

OSSemCreate(cnt)赋初始值cntOSSemPend一次,cnt-- 一次,OSSemPost一次,cnt++一次。

1、OSSemCreate (0);

......

OS_EVENT *Fun_Semp;

......

Fun_Semp = OSSemCreate (0);

......

void  MyTask (void *pdata)
{

.....
    for (;;) 
    {                                           
        OSSemPend(Fun_Semp,0,&err); //请求信号量
   PC_DispStr(0,++y,  s1,  DISP_BGND_BLACK+DISP_FGND_WHITE );
        OSTimeDlyHMSM(0, 0, 1, 0);    //等待1秒
    }
}

......

void  YouTask (void *pdata)
{

......
    for (;;) 
    {           
  PC_DispStr(0,++y,  s2,  DISP_BGND_BLACK+DISP_FGND_WHITE );
  if(YouTaskRun==5)
       OSSemPost(Fun_Semp);  //发送信号量
  YouTaskRun++;            
        OSTimeDlyHMSM(0, 0, 2, 0);    //等待2秒
    }
}

在上例中,MyTask 一直在等待信号量,在信号量没有到来之前无法执行。只有在YouTask 运行了5次,YouTaskRun==5之后,OSSemPost(Fun_Semp);  //发送信号量,MyTask 才得以执行。如果按上例所示,MyTask 只能执行一次,因为YouTask 以后再也不可能使得YouTaskRun==5了。MyTask也就因为无法得到信号量而不能运行。

2、OSSemCreate (1);

.....

OS_EVENT *Fun_Semp;

.....

Fun_Semp = OSSemCreate (1);

.....

void  MyTask (void *pdata)
{

..... 
    for (;;) 
    {                                           
        OSSemPend(Fun_Semp,0,&err); //请求信号量
   PC_DispStr(0,++y,  s1,  DISP_BGND_BLACK+DISP_FGND_WHITE );
   OSSemPost(Fun_Semp);  //发送信号量
        OSTimeDlyHMSM(0, 0, 1, 0);    //等待1秒
    }
}

void  YouTask (void *pdata)
{

    for (;;) 
    {                                           
        OSSemPend(Fun_Semp,0,&err); //请求信号量
   PC_DispStr(0,++y,  s2,  DISP_BGND_BLACK+DISP_FGND_WHITE );

   OSSemPost(Fun_Semp);  //发送信号量            
        OSTimeDlyHMSM(0, 0, 2, 0);    //等待2秒
    }
}

在上例中,MyTask、YouTask 都在 等待信号量,由于MyTask优先级高,首先得到信号量开始执行。此时YouTask 还在等待信号量。MyTask 执行完毕,OSSemPost(Fun_Semp);  //发送信号量。YouTask 得到信号量运行后发送信号量,如此反复

 

posted @ 2016-05-20 15:22  ocean2015  阅读(1378)  评论(0编辑  收藏  举报