原文地址:第五篇:uCOS-II 信号量及其操作作者:武汉安富莱电子有限公司

1.信号量

 使用信号量之前首先要对信号量有一个本质的认识

(1)信号量的含义:信号量是一类事件,使用信号量的最初目的是为了给共享资源

设立一个标志,该标志表示共享资源的占用情况,这样,当一个任务在访问共

享资源之前,就可以对这个标志进行查询,从而在了解资源被占用的情况之后

,再来决定自己的行为。

(2)UCOS-II的信号量里面有一个OSEventCnt,正确的认识这个,是使用信号量的关

键。

OSSemCreate(0)  :这种情况下可以用任务的同步。

OSSemCreate(1)  :这种情况类似于互斥信号量,有一个名字就是二值信号

量,可用于一个资源的使用

OSSemCreate(>1) :这种情况表示有>1个资源可以使用。

(3)OSEventCnt的初始数据代表可用的资源数,1就是一个可用资源,n就是n可用资

源。

(4)OSTimeTick 函数里面有一个需要注意的地方。

    a如果事件中设置了0SxxxPend的延时的话,会进到下面函数的这个地方。

     b如果设置的是一直等到的话,将通过OSXXXPost释放。

     在延迟的时间里面没有就绪的话,任务OSTCBStatPend被设置成超时,并

     清除相应的标志位。

if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
      ptcb->OSTCBStat  &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;       
      ptcb->OSTCBStatPend = OS_STAT_PEND_TO;              
      }

在延迟的时间里面任务收到信息,任务OSTCBStatPend被设置成OK

else

{
         ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
      }
    如果任务没有被挂起的话,任务将加入到就绪列表。
    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {
         OSRdyGrp               |= ptcb->OSTCBBitY;          
         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
     }

(5)下面分两种情况进行详细的讨论 
  A. OSSemCreate(0) 这种情况下用于信号的同步 

  • OSSemPen(xx, 0, xx) 设置为0的话,任务将被一直挂起直到收到OSSem

Post信号。

  • OSSemPen(xx, >0, xx) 设置为>0的话,任务将被挂起相应的时间.

a)如果在规定的时间内收到信号,那么任务将通过OSSemPend将其从等待

列表删除,继续运行。

b)如果延时超时,那么将通过OSSemPend函数本身将其从事件等待列表删除
  B. OSSemCreate(1) 这种情况下用于互斥信号量,但不能防止优先级翻转。

详细实现同上。
  C. OSSemCreate(>1) 这种情况下用多个资源共享

详细实现同上。

OS_EventTaskRemove(OSTCBCur, pevent);

只是把任务从任务就绪列表里面移除,加入到事件等待列表

2.信号量的创建

信号量的初始值的设置有三种作用已经在下面的图中有说明

下面是一个信号量被初始化以后事件列表的情况

3.请求信号量

4.发送信号量

信号量的使用还是很简单的

我现在主要将其用在两个方面

(1)用来触发一个事件的发生。

Semp      =    OSSemCreate(0);         //创建一个信号量

static void AppTaskCom(void *p_arg) //这个任务用来申请一个信号量,在500毫秒里面可以 
{                              //得到信号量的话输出成功,否则失败。
   INT8U err;
   (void)p_arg;
    while(1){
             OSSemPend(Semp, 500, &err);
             if(err == OS_ERR_NONE)
             {
                printf("SUCCESSrn");
             }
             else
             {
                   printf("failedrn");
             }
   }
}

err = OSSemPost(Semp);           //这个函数用来释放一个信号量
               if (err == OS_ERR_NONE) //也就是触发上面的那个函数
               {
                     printf("OSSemPostrn");
               }

(2)用来独占一个资源,这个的使用要小心,防止优先级的反转,所以最好使用这两个资源的任务之间不要有别的优先级,有的话就容易发生优先级的反转情况,这种情况是不允许的。

OSSemPend(Semp, 500, &err);

//在这里添加需要使用的资源

OSSemPost(Semp);

第五篇:uCOS-IInbsp;信号量及其…相关推荐

  1. 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

    秒杀多线程第十五篇 关键段,事件,互斥量,信号量的"遗弃"问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回 ...

  2. 《考取HCIA证书看我就够了》第五篇:[HCIA-IoT]物联网技术之感知层技术概览

    系列文章目录 <考取HCIA证书,看我就够了> 1.华为职业认证体系及HCIA介绍 2.[HCIA-IoT]物联网起源与发展 3.[HCIA-IoT]物联网技术之网络层技术概览 4.[HC ...

  3. python实训心得2000_实训总结万能版2000字五篇

    实训总结万能版 2000 字五篇 通过这次实训,我收获了很多,一方面学习到了许多以前没 学过的专业知识与知识的应用,另一方面还提高了自己动手做项 目的能力. 本次实训, 是对我能力的进一步锻炼, 也是 ...

  4. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关 Python之路[第五篇]:面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance ...

  5. 第五篇:Visual Studio 2008 Web开发使用的新特性

    第五篇:Visual Studio 2008 Web开发使用的新特性 本篇翻译自MSDN. .NET Framwork 3.5与Visual Studio 2008 包含很多新特性.AJAX的Web开 ...

  6. OpenCV学习系列教程第五篇:测试和提高代码的效率

    Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:htt ...

  7. 带你少走弯路:五篇文章学完吴恩达机器学习

    本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分,这门课是经典,没有之一.但是有个问题,就是内容较多,有些内容确实有点过时. 如何在最短时间学完这门课程?作为课程的主要翻译者和笔记作者,我推荐 ...

  8. 坚持的力量 第十五篇

    第十五篇        漩涡鸣人 从他身上,我看到了进步和向上的力量,经别人推荐,我发现我渐渐的喜欢上了<火影忍者>. 首先,<火影>中的歌曲很有震撼力和穿透力,产生心灵的共鸣 ...

  9. 【OpenCV入门指南】第五篇轮廓检测 下

    上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有 ...

最新文章

  1. MyBatisPlus介绍入门以及项目集成MyBatisPlus
  2. 9家专利拥有者退出MPEG LA HEVC 华为加入HEVC Advance
  3. Java堆空间– JRockit和IBM VM
  4. PostMan 四种常见的 POST 提交数据方式
  5. 绕过SQL注入限制的方法
  6. java自定义findbugs规则,定制 findbugs规则 - 阿里巴巴一个测试架构师 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  7. springcloud断路器修改熔断时间_SpringCloud(四)Hystrix服务降级,服务熔断
  8. jQuery学习笔记:文档处理
  9. VS2012安装教程
  10. 想要导航提示页最新安卓区_2020年网站页头设计:最佳实践及案例
  11. 文档处理 - 复杂Excel文档
  12. Pyhton语音播放
  13. access函数使用方法
  14. 工业云计算技术在工业自动化系统中的作用
  15. 一、java入门(高琪java300集+java从入门到精通笔记)
  16. 还在搞三层架构?了解下 DDD 分层架构的三种模式吧
  17. ubuntu壁纸目录
  18. 2D制作动画软件:Cartoon Animato 支持win/mac 中文激活版
  19. TPC-H系列---2---TPC-H表结构及表之间的关系
  20. android ormlite框架,Android ORMLite 框架的入门用法

热门文章

  1. 老板喜欢提拔什么样的员工
  2. Pulsar bk报错Unable to allocate memory, exiting bookie
  3. Gremlin 基础知识
  4. 有米科技股份有限公司
  5. python 作物识别_20行Python代码开发植物识别 app
  6. Android获取不到运动步数(踩坑)
  7. 光遇服务器维护要多久,光遇:你玩游戏多久了?半年以上的老玩家,是如何坚持下去的?...
  8. WEB应用防火墙(WAF启明设备)
  9. 公积金总结(一)--公积金概念
  10. 事业单位工资计算机公积金计算,事业单位住房公积金基数怎么算?