关于信号量的使用总结
2012-11-13 11:02
197 查看
在ucos-II中,为了实现任务之间的同步,用到的同步机制有:信号量,邮箱和消息队列。其中这里我主要说下对信号量的使用经验。信号量在创建时,调用OSSemCreate(INT16U cnt)函数。cnt为信号量的初始值。对cnt赋予不同的值,所起到的作用不同。如果Semp = OSSemCreate(0), 该信号量表示等待一个事件或者多个事件的发生。 例如:我们现在想实现这样一个功能:当有按键按下时,PWM蜂鸣器响起;无按键时,蜂鸣器不响。这是我们就可以分别建立两个任务,Task1和Task2,在Task1中处理按键的按下与否,一旦按下,则调用OSSemPost(Semp)发送这里信号量。在Task2中调用OSSemPend(Semp,0,&err)请求此信号量,如果信号量可用,则调用蜂鸣器程序蜂鸣,否则无限等待,任务自动进行切换。
如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。同理,如果一个任务要等待n个事件发生后才能执行,则应定义为Semp
= OSSemCreate(n)。然后在这n个任务分别运行时调用OSSemPost(Semp),直到这n个事件均发生后,这个任务才能运行。
如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。同理,如果一个任务要等待n个事件发生后才能执行,则应定义为Semp
= OSSemCreate(n)。然后在这n个任务分别运行时调用OSSemPost(Semp),直到这n个事件均发生后,这个任务才能运行。
相关文章推荐
- ucos中关于信号量的使用总结
- (转帖)总结C++中三种关于"new"的使用方法
- Android中关于WebView的使用总结
- 关于Android中使用SVG特性的探索与总结
- 【iOS开发】关于UIView总结与UIButton使用
- 关于PagerAdapter的使用方法的总结
- thinkphp关于session的使用总结
- 关于virtualbox的一些使用总结
- 关于Java中add使用小总结
- 关于宏#define使用陷阱总结
- Android关于PagerAdapter的使用方法的总结
- 关于Android中TabLayout使用总结
- 关于使用百度地图的总结
- [DevExpress]关于GridControl中SummaryItem使用总结 /12.1版本
- 关于CKEditor与CKFinder配合使用以及一些注意点总结
- 关于Safari浏览器使用的几点总结
- iOS关于rar解压第三方库Unrar4iOS使用总结
- 关于PushKit的使用总结
- 关于QT字库的移植和使用总结(能够任意改变字体和颜色)
- 使用Spring+Ibatis的项目,关于如何使用事务、如何提升性能的几点总结