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

 

最新文章

  1. 动态Web API层
  2. ASP.NET 5 使用 TestServer 进行单元测试
  3. html5语义标签
  4. 转:CPU与内存的那些事
  5. webstrom插件:如何设置才能让webstrom能提示bootstrap的语法
  6. android中的ellipsize设置(省略号的问题)
  7. 图片裁切插件jCrop的使用心得(三)
  8. 如何获取jqGrid中选择的行的数据
  9. XJOI网上同步测试DAY14 T1
  10. 磁盘管理三-raid
  11. 制作与使用静态链接库(.lib)文件
  12. [Android] FileInputStream跟踪
  13. poj 2533 Longest Ordered Subsequence(LIS)
  14. problem 202,263、232、21、231
  15. iOS网络编程笔记——Socket编程
  16. [BZOJ1058][ZJOJ2007]报表统计
  17. java使用Jedis远程访问CentOs7linux时出现拒绝连接的错误
  18. 405 Method Not Allowed error with PUT or DELETE Request on IIS Server
  19. Android P的APP适配总结,让你快人一步
  20. SpringBoot Controller接收参数的几种常用方

热门文章

  1. Aho_Corasick自动机(AC自动机)
  2. BZOJ1677: [Usaco2005 Jan]Sumsets 求和
  3. Spark RDD Union
  4. C#中两个时间的比较
  5. [Design Pattern] Flywight Pattern 简单案例
  6. fsck 修复ext3文件系统(用于linux系统时间不对,文件系统信息有错引起的die with exit status等的一些问题)
  7. 百度——LBS.云 v2.0——创建自己的地理云数据
  8. 全球最流行的66款App的共同规律
  9. 字符串格式化 String.format() 案例
  10. C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)