搜索
bottom↓
回复: 52

(转载) UCOS2:对于信号量,互斥信号量,事件标志组的个人理解

  [复制链接]

出0入0汤圆

发表于 2011-12-23 16:44:25 | 显示全部楼层 |阅读模式
原文地址http://bbs.21ic.com/icview-233903-1-1.html
不知道坛子里有没有人转载了,先转载再说
-------------------------------------------------------------------------------------------------------------------------------------------
ucos看了也有一周多了,索性源码都能开得懂,并且能去理解。昨天一开始看事件标志组的时候确实不知道怎么回事,后来百度一下,明白了事件标志组的作用以后,再去看书上的讲解和原码就清晰多了,很容易就明白了他的基本运行机理。这也给了我一点启示,学一个东西,看一个东西之前,你最少要知道他干嘛用的,如果连干嘛用的都知道书看的再熟也是枉然。
    ucos中提供了好几个用于同步事件以及共享资源访问的机制,目前我看明白的有信号量,互斥信号量,事件标志组。下面谈谈自己对他们的理解:

1.互斥信号量:
互斥互斥,意思就是我用了你就不能用,你用了我就不能用。永远都只有一个人独占这个东西~!举个例子:比如说打印机。
我任务1现在让他打印《静夜思》,那么在我还没打印完之前,别的任务就不能命令打印机去打印别的东西。否则如果任务2让他打印《春晓》,那最后打印出来的会是什么~????反正肯定不是任务1想要的,肯定也不是任务2想要的。
上面讲的比较通俗。打印机就是共享资源,谁都可以访问他~!但是同一时间,肯定要保证只有1个任务再操作打印机。那样才能得到大家想要的结果。也就是要独占共享资源的访问权~!

ucos2中通过互斥信号量来解决这个问题。简单说就是任务1开始访问打印机的时候,先去查询这个互斥信号量是否有效,有效,说明没人在访问打印机,这时任务1就把这个互斥信号量置无效,然后开始操作打印机。这样,每个任务再操作打印机前都要去查询这个互斥信号量时候有效。无效就等,等到有效才可以访问,或者等到不耐烦了(术语叫等待超时)就不等了~!任务一直到用完了打印机后才把信号量置有效,这时其他任务才有可能去访问,操作打印机。

这里又有一个问题:再任务1操作打印机器件,可能有多个任务申请打印机的所有权。那么再任务1结束后,我应该给谁用呢~~??也许我们马上就反应过来了~废话~!!当然是排队了~~谁先到的谁用啊~~~。没错,这是一种机制,谁最先等待共享资源,就给谁用。但是~!再ucos里面2.52版本还不支持这种方式。他用的另外一种方法!如果你和你BOSS都再等着用打印机,你先到的,这个时候任务1结束了对打印机的操作。你说你敢先用么~???(除非你第二天不想干了~~)你肯定先让老板先用,这就是ucos的实现方式,基于优先级,任务1结束对打印机的操作后,ucos再等待队列中看那个等待任务优先级最高,就先给他用~!即使他是最晚才等待的~!!(这就是BOSS的威力~!)
关于事件等待列表,有兴趣的可以去看看事件控制块ECB的内容,不在本文讨论。当然,ucos中的互斥信号量还有许多要素,比如说他的继承优先级之类的。本文旨在说明它是干嘛用的,至于其他请参考相关书籍。
下面的图解释了互斥信号量的基本用法:(简单的两个任务,没有包含多任务等待的情况)

(原文件名:1.jpg)


2.信号量:
    至于信号量,和互斥信号量是用区别的,简单来说(个人理解,欢迎纠正)就是互斥信号量再同一时刻,任务得到互斥信号量量后是独占共享资源的,在他没有释放信号量之前,任何其他任务都是不能访问共享资源的。而信号量的不同在于。信号量可以设定一个值,允许最多又几个任务同时去访问共享资源。比如我给他设定一个5,那么对多就有5个任务能同时访问共享资源。每个任务获得信号量的时候就把信号量计数器减去1,这样,再第五个任务获取后,计数器是0.当第六个任务要去访问的时候申请信号量就只能等待了,等到之前的任务发一个信号出来,这样第六个任务才能去访问共享资源。

互斥信号量可以看成特殊情况下的信号量,他的计数器就是0或者1,只在这两个之间徘徊。
举个例子(不一定恰当,欢迎纠正):
现在有很多串口扩展卡,一张卡能扩展出好几个串口,比如说4个,这个扩展卡就是一个共享资源。现在定义一个信号量semcom,初始给他4,那么可以有4个任务去访问这个资源,他每次就给这4个任务分配不同的串口。每个任务要访问这个扩展卡就要去测试semcom看看他时候有信号。这样,前4个任务申请信号后,信号量计数器就等于0了,这样,在第五个任务要去访问扩展卡的时候,他也去测试这个semcom,发现信号量无效,他只能等了~!等到之前的任务释放一个串口为止,如果不用信号量,那么任务五可能就会去访问扩展卡上的串口1,而串口1之前已经分配给了任务1了,~造成什么后果就自己想想吧~~~~如果用互斥信号量,那么无疑浪费了资源,~~~那你就买个扩展1个串口的卡就行了~~你买个扩展4个的然后你用互斥信号量~~~不是摆明再说你是富二代么~~~
等待信号的任务在有信号以后也是按照等待列表中优先级最高的任务先得到信号处理。有关信号量的具体数据结构参考事件控制块ECB的内容,具体操作参考信号量函数等。在此不做介绍
下面这个图说明了以上的例子:(

(原文件名:2.jpg)


3.事件标志组:
    在理解信号量和互斥信号量的时候都可以类比,因为他们在ucos2里面都通过相同的时间控制块即ECB这个数据结构来实现,理解了一个就很好能看懂另外一个,设置更后面的邮箱和消息队列,也能和信号量之类的类比来学习,他们都有通过ECB来维护。但是事件标志组比较特别,他是ucos2所有这些内核事件里面没有用到ECB的。他有自己的做法。不太合群。什么是事件标志组?
    上面说的信号量,互斥信号量。都是用来同步任务对共享资源的访问,防止冲突而设立的。事件标志组----他是用来同步几个任务,协调几个任务工作而设立的。打个比方你现在要打个电话,打电话这个任务要执行,你必须有手机吧!那你要先执行买手机这个任务,你手机有了,没话费~你也大不了吧~,也就是说打电话这个任务要等买手机这个任务和充话费这个任务都完成了以后你才能去开始打电话这个任务。事件标志组就是用来标志买手机或者充话费这两个任务完成了没有。完成了的话他们会相应的置位事件标志组里面的某些标志位。那么打电话这个任务。发现事件标志组里面买手机对应的位和充话费对应的位都置位了以后就明白,现在可以开始打电话了~!实际中比如你想要读数据,那你肯定要等数据采集更新好了以后你去读才有意义吧~所以数据采集和读取数据这两个任务也可以用事件标志组来实现。当然,事件标志组不一定只用于两个任务之间,通过对头文件的修改,可以让事件标志组达到32位,你可以用事件标志组来协调多个任务的合理运行。达到你预期想达到的目的!事件标志组就是专门干这个活的。
    事件标志组的结构比其他的会复杂一点。没一个事件标志组都维护这自己的一个等待队列的双向链表。每个事件标志组的节点里面都有一个指针和相应的任务控制块TCB一一对应。至于事件标志组的具体实现方法,可以自己去看看源代码。只要
懂得一些浅显的双向链表的知识,大概理解他的运作机制不会很难。
    下面这幅图大概反应出了事件标志组是如何协调任务工作的:


(原文件名:3.jpg)



终于要完了~~总的来说,到目前为止,都还能大概理解ucos的每个模块的实现机理。但是是不是真的懂了自己不敢说。毕竟要等能真的自己动手一直,再ucos2系统上开发出应用那样才能真的算懂了。也知道到那个时候,才有可能能对其有更深的理解。个人认为初看ucos2的时候只要能有一些基本的数据结构基础如线性表,堆栈,队列,单链表,双链表之类的就差不多。在看的过程中慢慢体会作者的思想和学习别人的编程思路才是最重要的。
    以上纯属个人愚见,欢迎和大家一起探讨。本人也乃小小菜一个~~O(∩_∩)O
http://playjian.blog.163.com/


文章PDFourdev_706861D0W6T0.pdf(文件大小:1.15M) (原文件名:互斥信号量,信号量,标志事件.pdf)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-5-14 10:50:16 | 显示全部楼层
谢谢分享,讲的很详细~学习~

出0入0汤圆

发表于 2012-5-14 16:43:21 | 显示全部楼层
LZ讲解这个还花了不少心思,顶你

出0入0汤圆

发表于 2012-5-16 16:32:19 | 显示全部楼层
LZ顶你,讲解很细

出0入0汤圆

发表于 2012-6-5 13:00:27 | 显示全部楼层
写的不错!

出0入0汤圆

发表于 2012-6-6 11:59:47 | 显示全部楼层
比较形象的分析啊

出0入0汤圆

发表于 2012-6-8 13:12:58 | 显示全部楼层
标记一下 学习中

出0入0汤圆

发表于 2012-6-21 11:09:07 | 显示全部楼层
以前也分析过ucos的这些东西,但是就是不知道在实际中怎么使用,听楼主一讲全明白了,多谢!

出0入0汤圆

发表于 2012-6-22 14:46:01 | 显示全部楼层
谢谢  顶一个

出0入0汤圆

发表于 2012-6-30 03:10:45 来自手机 | 显示全部楼层
讲得挺形象的,必顶

出0入0汤圆

发表于 2012-6-30 08:40:19 | 显示全部楼层
对这方面的知识,正欠缺。
学习学习楼主的经验

出0入16汤圆

发表于 2012-7-26 10:25:40 | 显示全部楼层
写的挺不错!特别是比喻,另外在ucos源代码中关于任务创建要是有合理的代码解释就更好了!

出0入0汤圆

发表于 2012-7-27 18:04:04 | 显示全部楼层
很不错,最近在学,刚好对这些有点迷糊

出0入0汤圆

发表于 2012-7-28 11:37:13 | 显示全部楼层
讲的很通俗,看明白了。顶起!

出0入0汤圆

发表于 2012-8-3 14:37:50 | 显示全部楼层
看了UCOS几天怎么都没看明白信号量这些东西。看了这个帖子之后总算有些明白了。

出0入0汤圆

发表于 2012-9-11 11:34:10 | 显示全部楼层
讲的很好啊,支持下

出0入0汤圆

发表于 2012-9-14 13:54:18 | 显示全部楼层
路过学习一下!!!!!!

出0入0汤圆

发表于 2012-9-18 14:57:31 | 显示全部楼层
分析得挺好的,顶LZ

出0入0汤圆

发表于 2012-9-19 16:11:13 | 显示全部楼层
楼主费心了

出0入0汤圆

发表于 2012-9-19 16:50:10 | 显示全部楼层
转的 也不错 和我理解的差不多 不过看了十遍任哲的书

出0入0汤圆

发表于 2013-2-26 01:15:43 来自手机 | 显示全部楼层
哈哈不错 虽然这些东西很简单  但是讲的很生动

出0入0汤圆

发表于 2013-3-5 00:16:51 | 显示全部楼层
正在学习ucos,顶~~~~~

出0入0汤圆

发表于 2013-3-5 10:40:27 | 显示全部楼层
MARK,讲的很生动.

出0入0汤圆

发表于 2013-3-20 22:43:58 | 显示全部楼层
好资料,收藏了

出0入0汤圆

发表于 2013-3-27 07:58:25 | 显示全部楼层
学习中,多谢贡献

出0入0汤圆

发表于 2013-3-27 13:05:28 | 显示全部楼层
好东西,多谢分享

出0入0汤圆

发表于 2013-3-28 17:33:54 | 显示全部楼层
UCOS移植到STM32的过程需不需要深入了解?还是直接学习操作UCOS就好?

出0入0汤圆

发表于 2013-7-18 10:29:15 | 显示全部楼层
楼主用心良苦。。简单,通俗,易于理解使用的就是最好的。。

出0入0汤圆

发表于 2013-7-19 17:13:13 | 显示全部楼层

很不错,学习了,谢谢!

出0入0汤圆

发表于 2013-7-19 22:10:55 | 显示全部楼层
举例非常形象到位,很好

出0入0汤圆

发表于 2013-7-25 13:20:35 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2013-10-1 22:32:01 | 显示全部楼层
形象,易懂,小弟我看了二天的事件标志组,都不明白是怎么回事,这贴的例子太形象了

出0入0汤圆

发表于 2013-10-2 00:23:17 来自手机 | 显示全部楼层
不错奥,请楼主多分享

出0入0汤圆

发表于 2013-10-7 17:45:24 | 显示全部楼层
MARK  看了很长时间的OS一直不入门。谢谢楼主咯 帮助很大!

出0入0汤圆

发表于 2013-10-26 15:34:14 | 显示全部楼层

MARK  看了很长时间的OS一直不入门。谢谢楼主咯 帮助很大

出0入0汤圆

发表于 2013-11-12 18:22:09 | 显示全部楼层
多谢分享。MARK

出0入0汤圆

发表于 2013-12-9 22:36:36 | 显示全部楼层
mark                                    

出0入0汤圆

发表于 2013-12-9 22:37:21 | 显示全部楼层
正好看到事件控制块部分,就找到楼主的帖子了,thanks,nice

出0入0汤圆

发表于 2014-1-8 16:45:14 | 显示全部楼层
感谢分享!!!!!!!!!!!

出0入0汤圆

发表于 2014-2-3 23:03:24 | 显示全部楼层
写的非常好

出0入0汤圆

发表于 2014-2-22 22:01:33 | 显示全部楼层
分析得很到位,一看基本明白!谢谢!下载下来再慢慢细看

出0入0汤圆

发表于 2014-6-10 16:49:19 | 显示全部楼层
路过支持

出0入0汤圆

发表于 2014-6-24 15:05:56 | 显示全部楼层
学习,谢谢!!!

出0入0汤圆

发表于 2014-6-25 09:29:11 | 显示全部楼层
不错,留着理解

出0入0汤圆

发表于 2014-6-30 18:10:32 | 显示全部楼层
谢谢分享,有空再看,虽然可能不会再看了

出0入0汤圆

发表于 2014-7-21 14:41:49 | 显示全部楼层
讲的很详细,学习,谢谢分享

出0入0汤圆

发表于 2014-9-11 09:16:04 | 显示全部楼层
真正讲清楚的目前来看恐怕只要周航慈老先生的那本《基于嵌入式实时操作系统的程序设计技术》。

出0入0汤圆

发表于 2014-9-30 20:31:25 来自手机 | 显示全部楼层
讲得很详细,学习了!

出0入0汤圆

发表于 2014-10-5 13:13:45 | 显示全部楼层
谢谢                                            

出0入0汤圆

发表于 2014-10-17 16:33:48 | 显示全部楼层
mark  非常深入浅出的理解  谢谢楼主

出0入0汤圆

发表于 2014-10-17 19:36:43 来自手机 | 显示全部楼层
我最近也学了ucosiii,支持楼主一下

出0入0汤圆

发表于 2014-10-22 16:18:25 | 显示全部楼层
理解深刻  解释给力

出0入0汤圆

发表于 2015-2-12 16:38:32 | 显示全部楼层
讲的不错,学习了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 13:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表