FreeRTOS(十一)----信号量

目录

二值信号量

计数信号量


  • 二值信号量

    队列的状态不为空即为满,只有两个状态,就称为二值,这非常合适地表达了某个外部事件的状态,就是到达和未到,所以可以直接进行映射,二值信号量为满代表事件到达,二值信号量为空代表事件未到

        二值信号量操作API:

API功能
xSemaphoreCreateBinary()创建二值信号量
xSemaphoreGive()任务状态下给出信号量
xSemaphoreTake()任务状态下得到信号量
xSemaphoreTakeFromISR()中断状态下给出信号量
xSemaphoreTakeFromISR()中断状态下得到信号量
vSemaphoreDelete()删除信号量

 

    有了二值信号量,就可以使得中断和任务同步,并且把事件工作量转移到任务上,一般的使用过程是:创建二值信号量,某个任务与某个事件挂钩,事件的执行工作在任务的任务函数中,任务阻塞获得二值信号量(take操作),事件到达触发中断后,ISR中给出二值信号量(give操作),这样任务就会被解除阻塞,然后执行,执行完毕后再次阻塞等待二值信号量

 

  • 计数信号量

    FreeRTOS是多任务并发执行,任务阻塞态的解除其实需要一段时间,并不是二值信号量一旦给出,任务就能马上获得,所以如果事件发生比较频繁,在这段时间内有多个相同的事件到达,那么中断就会发生多次,但是二值信号量只能记录一个状态,于是后来的中断就会覆盖前面的中断,发生了中断丢失,即使多个中断到达了,但是任务依然只看见一个

 

    如果某个中断比较频繁,为了能够记录多个同样中断的到达,需要使用计数信号量,可以认为是一个数组,数组内的每一个元素都是二值信号量,计数信号量能够记录多个状态,这样即使任务没有马上获得信号量,后来的中断也不会覆盖前面的中断,中断就不会丢失

计数信号量的API:

API功能
xSemaphoreCreateCounting()创建计数信号量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值