23-二值信号量和计数信号量

信号量(相当于消息队列的一种特殊用法)

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。

信号量其实是一个非负的整数,获取这个信号量的任务,都会将这个整数减1,当这个整数为0的时候,所有要获取这个信号量的任务都会处于阻塞状态

信号量分为四个

1、二值信号量(一般用于同步功能)

二值信号量既可以用于临界资源访问也可以用于同步功能。

信号量被创建后,是被置为空的,当任务一获取信号量时,会进入阻塞状态。任务二在某种条件下释放了这个信号量,此时信号量就有值了,任务一就会获得信号量,从阻塞状态变为就绪状态。此时如果任务一的优先级高,就会执行任务一,从而达到了任务一和任务二的同步效果。

在中断函数中释放信号量的时候,任务一仍然可以获得信号量,此时就是任务一和中断函数的同步

理解二值信号量可以将其当成只有一个消息的消息队列,著需要关注消息队列中有没有消息即可,并不需要关注消息的内容

二值信号量运作机制

2、计数信号量(常用于事件的计数或者资源的管理)

二进制信号量可以被认为是长度为 1 的队列,而计数信号量则可以被认为长度大于 1的队列,信号量使用者依然不必关心存储在队列中的消息,只需关心队列是否有消息即可。

每当某个事件发生的时候,任务或中断就会释放一个信号量,此时信号量的数值就会加1,当处理事件的时候,任务就会取走一个信号量,此时信号量的数值就会减去=1,信号量的数值就表示还有多少个事件没有被处理

计数信号量运作机制

3、互斥信号量(一般用于保护临界资源)

互斥信号量其实是特殊的二值信号量,由于其特有的优先级继承机制从而使它更适用于简单互锁,也就是保护临界资源。

互斥信号量在创建的时候,信号量时满的。(与二值信号量做对比,二值信号量在创建的时候,是空的)。在某个任务使用信号量后,互斥信号量就会变空,此时其他任务想要获取信号量,就会进入阻塞状态,保证了临界资源。

4、递归信号量

信号量控制块(与消息队列控制块相同,详情看消息队列控制块)

常用信号量API函数(信号量需要先释放才能获取)

xSemaphoreCreateBinary()   创建二值信号量

xSemaphoreCreateCounting()   创建计数信号量

vSemaphoreDelete()  删除函数(这个函数不能用于删除递归信号量)

(互斥信号量的释放不能使用中断函数)

xSemaphoreGive(),信号量释放函数(可用于二值信号量,计数信号量,互斥信号量)

xSemaphoreGiveFromISR() 信号量释放函数(可用于二值信号量,计数信号量)

使用释放函数后,在信号量控制块中的UmessageWaiting值会加一

(互斥信号量的获取不能使用中断函数)

xSemaphoreTake(),信号量获取函数(可用于二值信号量,计数信号量,互斥信号量,不能用于递归信号量的获取)

xSemaphoreTakeFromISR() 信号量获取函数(可用于二值信号量,计数信号量)

使用获取函数后,在信号量控制块中的UmessageWaiting值会减一

  1. 创建二值信号量 xSemaphoreCreateBinary()

实际可以看到创建信号量,其实使用的就是创建消息队列的函数

(1),消息队列的长度,为1

(2)、表示消息队列的消息的大小,这个地方为0,表示无需设置消息大小

(3)、配置消息队列的类型:

创建计数信号量 xSemaphoreCreateCounting()

  1. 信号量删除函数 vSemaphoreDelete()

  1. 信号量释放函数

xSemaphoreGive(),xSemaphoreGiveFromISR()

xSemaphoreGiveFromISR()

5、信号量获取函数

 xSemaphoreTake(),xSemaphoreTakeFromISR()

xSemaphoreTakeFromISR()

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值