ucos中关于信号量的使用总结
2013-03-19 09:48
176 查看
在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个事件均发生后,这个任务才能运行。
相关文章推荐
- 关于信号量的使用总结
- 关于SAXReader解析XML以及JSONObject和JSONArray的使用总结
- 关于移动端开发宽度高度,字体以及rem宽度使用的总结
- 关于Android中使用SVG特性的探索与总结
- 关于ESP8266 GPIO中断使用的总结
- 关于Rxjava的使用总结
- 关于使用DFS,BFS的一些思考总结
- 关于RDLC报表的一些总结,希望对正在学习使用它的朋友有所帮助
- pthread互斥信号量使用总结
- 【Android进阶】关于PagerAdapter的使用方法的总结
- 关于高速光耦6N137的使用总结
- 关于VS2012下fftw3的安装与使用小总结
- 关于DevExpress的XtraTreeList使用方法总结【转载】
- thinkphp关于session的使用总结
- 关于android客户端使用ksoap2调用wcf(.svc)的总结
- 总结C++中三种关于"new"的使用方法
- 关于BGT24MR12和HMC703配合使用实现天线扫频的原理和一些配置字计算的总结
- 关于EXT使用蒙版和单操作(添加,修改,导入)的一点点总结
- 关于proguard的使用总结
- 在Android中使用adb命令时关于权限方面的一些总结