zoukankan      html  css  js  c++  java
  • 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 得到信号量运行后发送信号量,如此反复

     

  • 相关阅读:
    本博客主题的相关配置(2021年)
    vscode侧边栏隐藏不需要的文件
    虎扑,豆瓣等用css屏蔽广告代码
    代替pandownload的百度网盘下载软件
    网络请求的超时原因
    OkHttp3系列(三)okhttp3-fast-spring-boot-starter
    OkHttp3系列(二)MockWebServer使用
    OkHttp3系列(一)初识OkHttp3
    为什么要使用短链接
    Google Guava之简化异常和错误的传播与检查
  • 原文地址:https://www.cnblogs.com/locean/p/5512227.html
Copyright © 2011-2022 走看看