uCos-ii中对于信号量、互斥信号量、事件标志组的理解

uCos-ii中提供了几种用于同步事件和以及共享资源访问的机制,谈谈对他们的理解

1、互斥信号量

互斥信号量,互斥的意思就是我用了你不能用,你用了我不能用。永远只有一个人独占这个东西,比如打印机。

我任务1 在打印《静夜思》,那么在我还没有打印完之前,别的任务就不能命令打印机去打印别的东西。否则让如果任务2打印《春晓》,那么打印出来的会是什么东西?肯定不会是任务1想要的,也不是任务2想要的。

上面讲的比较通俗易懂。打印机就是共享资源,谁都可以访问它,但是同一时间,只能有一个任务操作打印机,这样才是大家想要的结果。也就是说要独占资源的访问权。

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

这里又有一个问题,再任务1操作打印机期间,可能有多个任务申请打印机的所有权,那么在任务1结束后,打印机的使用权应该给哪个任务呢? 也许我们会马上反应过来,队列啊!谁先到谁用;没错,这是一种机制,谁最先等待共享资源,就给谁用。在ucos-ii 2.52版本中不支持这种方式,而是使用另外一种机制,如果你和你的BOSS都在等待使用打印机,你是先到的,这个时候任务1结束了对打印机的操作,你说你敢用吗?(除非你第二天不想干了) 你肯定让老板先用了,这就是ucos-ii的实现方法,基于优先级的!任务1结束对打印机的操作后,ucos-ii选择等待队列中优先级最高的任务,让优先级最高的任务使用,即使它是最晚等待的。  关于等待列表,有兴趣的可以去看看事件控制块ECB的内容,不在本文讨论,ucos-ii中互斥信号量还有很多因素,比如它的继承优先级之类的。

继承优先级思想:当高优先级的任务因申请某共享资源失败而被阻塞时,把当前拥有该资源的、且优先级较低的任务的优先级提升,提升的高度等于这个高优先级的任务的优先级(PIP)

2、信号量

至于信号量,和互斥信号量是有区别的,简单来说,互斥信号量在同一时刻,任务得到互斥信号量后是独占共享资源的,在它没有释放信号量之前,任何其它任务是不能访问共享资源的。而信号量的不同在于,信号量可以设置一个数值,允许最多有几个任务同时访问共享资源。比如说设置这个数值是5,那么最多可以有5个任务同时访问共享资源;每个任务在获得信号量的时候把信号量计数器减去1,这样在第5个任务获得信号量的时候,计数器是0,当第 6 个任务要去访问信号量的时候,就只能等待了,等到之前的任务发出来一个信号出来的时候,这样第六个任务才能去访问共享资源。

互斥信号量可以看成特殊情况下的信号量,它的计数器就是 0 或者 1 ,只是在这两个值之间徘徊。

等待信号量的任务在有信号以后也是按照等待列表中优先级最高的任务先得到信号处理。

3、事件标志组

在理解信号量和互斥信号量的时候可以类比,因为他们在ucos-ii中都通过相同的事件控制块即ECB这个数据结构来实现,理解了一个就能够很好的看懂另外一个,对于后面的消息邮箱和消息队列,也能喝信号量类比的来学习,它们都通过ECB来维护。但是事件标志组比较特殊,它是ucos-ii这些内核事件里面没有用到ECB的。

上面说的信号量、互斥信号量,都是用来同步任务对共享资源的访问,防止冲突而设立的。事件标志组--它是用来同步几个任务,协同几个任务工作而设立的。打个比方说,你现在要打电话,打电话这个任务要执行,你必须有手机,你首先要执行买手机这个任务,你手机有了,没有花费最终的打电话还是无法执行,也就是说打电话这个任务要等买手机这个任务和充话费这个任务完成以后,你才能够去执行打电话这个任务。时间标志组就是用来标志买手机或者充话费这两个任务完成了没有。完成了的话他们会相应地置位事件标志组里面的某些标志位。 再比如说,你想要读取数据,你你肯定要等到数据采集更新好后,你去读取才有意义,所以数据采集和读取数据这两个任务也可以用 事件标志组来实现。当然事件标志组不一定只用于两个任务之间,通过对头文件件的修改,可以让事件标志组达到32位,你可以用事件标志组来协同多个任务的合理运行,达到你预期达到的目标!事件标志组就是专门为这个而设立的。

每一个时间标志组都维护它自己的一个等待队列的双向链表。每个事件标志组的结点里面都有一个指针和相应的任务控制块ECB一一对应。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值