请选择 进入手机版 | 继续访问电脑版
快捷导航
0 74

uC/OS-Ⅱ信号量管理

陈燕 于 2017-12-21 20:56 发表在 [技术分享] [复制链接]
本帖最后由 陈燕 于 2017-12-22 16:33 编辑

如果你看到我的帖子没写完,不要惊讶<_<只是因为不想保存在草稿箱中,因为之前的帖子保存为草稿,后来被覆盖没了,我很是忧伤,所以就先发了,这样一定不会丢!

一、信号量
是一种约定机制
信号量由2部分组成
1)16位的无符号整形信号量的计数值(0~65535)
2)等待该信号量的任务组成的等待任务表。

二、信号量的使用

建立(CREATE)
即INITIALIZE:需要给信号量赋初值,等待信号量的任务列表应置为空。
挂起(PEND)
即等信号(WAIT):如果该信号量有效(信号量值>0),则信号量值减一,任务得以运行。如果信号量值==0,任务进入等待信号量列表。
发信号(POST)
即给信号(SIGNAL):如果没有任务在等待信号量,信号量自增;如果有任务在等待信号,那会有一个任务进入就绪态。
钥匙符号:对共享资源的访问。数字N代表可用资源数。对于二值信号量,该值就是1。
旗帜符号:用于表示某事件的发生。数字N代表事件已经发生的次数。


三、 二值信号量
信号量初始化为1
OSSemPend();//需要使用共享数据的任务调用
OSSemPost(); //处理完数据之后,释放信号量
信号量初始化为1
四、计数式信号量
计数式信号量管理缓冲区阵列
通过申请缓冲区函数BufReq()申请资源
使用完后调用BufRel()释放资源
五、 信号量实现同步
用信号量使任务与中断同步,或者使任务与任务同步(两任务之间没有数据交换)
实现同步机制的信号量初始化为0

1、单向同步
一个任务做I/O操作,等待信号回应;
I/O操作完成后,中断服务程序(或者另一个任务)发出信号;
该任务的得到此信号,继续往下执行
2、双向同步

两个任务要用两个信号量来同步他们的行为,叫双向同步
注意:任务与中断之间不可以使用双向同步

六、信号量通用操作
OSSemCreate(); //建立一个信号量
初始化完毕,返回事件控制块指针
若未得到事件控制块,返回NULL
信号量赋初值cnt:
如果信号量是用来表示一 个或者多个事件的发生,初始值应设为0;
共享资源:初始值应设为1(二值信号量);
允许任务访问n个相同的资源,初始值是n
OSSemPend(); //等待一个信号量(申请资源)
如果当前有资源,此函数可以顺利返回;
如果当前没有,调用此函数后,进程就睡眠在这个函数里,直到获得资源,才能从此函数返回(相当于主动让出CPU控制权,再等待CPU控制权);OSSemPend()允许用户定义一个最长等待时间作为它的参数,这样可以避免该任务无休止地等待下去。
OSSemPost(); //释放一个信号量(释放资源)
OSSemAccept(); //无等待地请求一个信号量
若返回值是0,说明该信号量无效
若返回值大于0,说明该信号量有效,该值也暗示着该信号量当前可用的资源数
注:中断服务子程序要请求信号量时,只能用OSSemAccept()而不能用OSSemPend(),因为中断服务子程序是不允许等待的

OSSemQuery(); // 查询一个信号量的当前状态
七、互斥信号量
三个元素组成:
1个标志,指示mutex是否可以使用(0或1)。
1个优先级,准备一旦高优先级的任务需要这个mutex,赋给占有mutex的任务。
1个等待该mutex的任务列表。

OSMutexCreate(); //建立一个互斥型信号量
OSMutexPend(); //等待一个互斥型信号量
OSMutexPost(); //释放一个互斥型信号量
OSMutexAccept(); //无等待地获取一个互斥型信号量(任务不挂起)
OSMutexQuery(); //获取一个互斥型信号量的当前状态





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-21 20:56

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-4-25 21:50