1.互斥信号量:
互斥互斥,意思就是我用了你就不能用,你用了我就不能用。永远都只有一个人独占这个东
西~!举个例子:比如说打印机。
我任务 1 现在让他打印《静夜思》,那么在我还没打印完之前,别的任务就不能命令打印机
去打印别的东西。否则如果任务 2 让他打印《春晓》,那最后打印出来的会是什么~????
反正肯定不是任务 1 想要的,肯定也不是任务 2 想要的。
上面讲的比较通俗。打印机就是共享资源,谁都可以访问他~!但是同一时间,肯定要保证
只有 1 个任务再操作打印机。那样才能得到大家想要的结果。也就是要独占共享资源的访问
权~!
ucos2 中通过互斥信号量来解决这个问题。简单说就是任务 1 开始访问打印机的时候,先去
查询这个互斥信号量是否有效,有效,说明没人在访问打印机,这时任务 1 就把这个互斥信
号量置无效,然后开始操作打印机。这样,每个任务再操作打印机前都要去查询这个互斥信
号量时候有效。无效就等,等到有效才可以访问,或者等到不耐烦了(术语叫等待超时)就
不等了~!任务一直到用完了打印机后才把信号量置有效,这时其他任务才有可能去访问,
操作打印机。
这里又有一个问题:再任务 1 操作打印机器件,可能有多个任务申请打印机的所有权。那么
再任务 1 结束后,我应该给谁用呢~~??也许我们马上就反应过来了~废话~!!当然是排队
了~~谁先到的谁用啊~~~。没错,这是一种机制,谁最先等待共享资源,就给谁用。但是~!
再 ucos 里面 2.52 版本还不支持这种方式。他用的另外一种方法!如果你和你 BOSS 都再等
着用打印机,你先到的,这个时候任务 1 结束了对打印机的操作。你说你敢先用么~???
(除非你第二天不想干了~~)你肯定先让老板先用,这就是 ucos 的实现方式,基于优先级,
任务 1 结束对打印机的操作后,ucos 再等待队列中看那个等待任务优先级最高,就先给他
用~!即使他是最晚才等待的~!!(这就是 BOSS 的威力~
!)
关于事件等待列表,有兴趣的可以去看看事件控制块 ECB 的内容,不在本文讨论。当然,
ucos 中的互斥信号量还有许多要素,比如说他的继承优先级之类的。本文旨在说明它是干
嘛用的,至于其他请参考相关书籍。
下面的图解释了互斥信号量的基本用法:(简单的两个任务,没有包含多任务等待的情况)