uCOS-II信号量OSSemCreate(0)和OSSemCreate(1)详解

(2014-04-22 18:04:18)

标签:

it

分类: 操作系统

在ucos-II中,为了实现任务之间的同步,用到的同步机制有:信号量,邮箱和消息队列。其中这里我主要说下对信号量的使用经验。信号量在创建时,      调用OSSemCreate(INT16U cnt)函数。cnt为信号量的初始值。对cnt赋予不同的值,所起到的作用不同。如果Semp = OSSemCreate(0), 该信号量表示等待一个事件或者多个事件的发生。

如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。(注:初始化OSSemCreate(1),那么一个任务中有OSSemPend,那么可以执行,执行之后cnt==0,其他任务的OSSemPend无法获得sem,只能等待,除非任务一有OSSemPost,使其cnt++,这样其他任务的Pend可以执行。)同理,如果一个任务要等待n个事件发生后才能执行,则应定义为Semp = OSSemCreate(n)。然后在这n个任务分别运行时调用OSSemPost(Semp),直到这n个事件均发生后,这个任务才能运行。

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 得到信号量运行后发送信号量,如此反复

 

UCOS 信号量的更多相关文章

  1. ucos信号量集源码分析

    在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量 ...

  2. UCOS 信号量的初值问题

    当 pend请求发出的时候信号量的值减1,当post的时候信号量的值加1,信号量的值0跟1分别是用来同步跟互斥的,什么是同步,什么是互斥呢...假设你把信号量的值设为0,有A,B连个任务,当A发出pe ...

  3. 【原创】ucos信号量的操作及原理

    信号量的操作及原理   1.OSSemCreate创建信号量semaphore     在使用信号量之前,要先用OSSemCreate创建一个信号量,并通过返回的合法事件结构体指针使用信号量. OS_ ...

  4. ucos实时操作系统学习笔记——任务间通信(信号量)

    ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代 ...

  5. ucos互斥信号量解决优先级反转问题

    在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. ...

  6. ucos事件邮箱信号量队列详解

    Ucos的事件分为时钟,信号量,互斥性信号量,消息队列,以及消息邮箱 首先说信号量 信号量在ucos中的类型定义为OS_EVENT_TYPE_SEM,在任务控制块ecb中,主要是用到的是信号量计数器O ...

  7. ucos之互斥信号量及优先级反转

    在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...

  8. ucos中信号量 事件标志 消息队列都怎么用

    信号量 事件标志和消息队列分别应用于什么场景(反正我学的时候有点闹不清,现在总结一下): 信号量和事件标志用于任务同步.详细来说,这个功能可以替代以前裸机中你打一个标记的功能,比如使用了一个定时器,5 ...

  9. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. 转:内核空间与用户空间数据交换的方式之一 --ioctl(通过字符设备演示)

    对于linux而言,内核程序和用户程序分别运行在内核空间和用户空间,要实现两者的数据交换,主要有以下几种方式:系统调用,读写系统文件(procfs,sysfs, seq_file,debugfs等), ...

  2. rownum的使用

    Oracle 提供了rownum,rownum是一个隐含的字段,默认从1开始. 取得前5条记录: 采用rownum进行分页查询: 需要使用三层嵌套查询来完成分页查询: 例如查询第三到第四条记录: se ...

  3. MySql 到 SQL Server(MSSQL)

    我用 MySql 2年了,一直都是 asp.net + MySql 开发 为什么不用 MSSQL呢? 原因 : 在我的国家,几乎找不到任何一间托管公司有提供 SQL SERVER 的,有的话也是 20 ...

  4. ural 1126 Magnetic Storms

    http://acm.timus.ru/problem.aspx?space=1&num=1126 #include <cstdio> #include <cstring&g ...

  5. 我想要个pc和手机共有的客户端,就像百度云(iBarn网盘好用)

    https://github.com/zhimengzhe/iBarn iBarn网盘是一个基于PHP开发的先进的云存储系统,提供文件的网络备份,同步和分享服务:支持断点续传,秒传等功能:可选择文件下 ...

  6. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  7. 为兴趣求职:如何学习UI框架,请将你的看法观点写在评论下面

    前言:此篇文章是就我女朋友的求职和前端学习经历而写,希望得到UI前辈的热心指点,不胜感激涕零! 地理坐标: 中国,四川,成都 求职经历: 她之前找过两份工作,第一份是金融销售专员,第二份是汽车保险.她 ...

  8. [LeetCode] 230. Kth Smallest Element in a BST 解题思路

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  9. MD中bitmap源代码分析--SYNC IO和RAID5的补充

    最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式. 1.bitmap刷磁盘是否为 SYNC IO? ...

  10. HTML5 API's (Application Programming Interfaces)

    New HTML5 API's (Application Programming Interfaces) The most interesting new API's are: HTML Geoloc ...