[uCOS/uCGUI] 请问大家uC/OS-II中Sem具体应用在什么样的实例?

花开花谢   2012-12-21 11:40 楼主
平时场景或是可用Flag/Mutex搞定,几个任务共用的很少遇到。
闪闪微星

回复评论 (2)

Sem和mutex最大不同之处在于mutex只能是2值的,而Sem一般是多值的,可以支持多个任务获得资源。sem也叫整数型信号量,mutex也叫二值信号量。mutex是sem的一个特例。具体实例:

实例1.    一般在通信的接收方会建立缓冲区,可以是环形缓冲区,比如说这个环形缓冲区有8块,那Sem的初始值应该设置为8。每次收到一块长度的数据就放入到缓冲区中,同时调用OSSemPost给sem加1,而如果从缓冲区里面取出一块长度的数据,将调用OSSemPend,sem减1,当然这些过程中也需要移动各自的块指针。当OSSemPend时发现sem为0,则说明缓冲区中没有数据可用了,当前这个任务就会进入挂起状态,等待有数据放入它会被置为就绪态。这个实例中,针对sem有取数据和放数据这样两个任务。

实例2.    和实例1不同的是,多个共享资源可以被多个任务申请,也可以被多个任务释放,申请资源的任务可以同时是或不是释放资源的任务,而且申请是无序。例如火车站检票口或者是超市付账出口可以有很多,出站的人也有很多,可以从任意一个出,所以也就是无序的。

还有很多使用实例,需要看具体的需求,另外,也有很多情况下可以使用mutex来解决sem可以解决的资源互斥或分配问题。
点赞  2012-12-22 12:38
学习了,呵呵
点赞  2013-1-5 18:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复