FreeRTOS 二值信号量和计数信号量

本文讲述了在FreeRTOS中使用二值和计数信号量进行任务协调,包括创建、释放和获取操作,以及一个实际的实验示例,展示了它们在任务阻塞与唤醒中的应用。

1、二值信号量和计数信号量

二值信号量

概念

  • 长度为1的队列

  • 无需关心存储内容,只需关注是否为空即可

应用场景

  • 任务与任务,任务与中断的同步

阻塞

  • 任务获取信号量时,若信号量为空,则进入阻塞状态(立即,定时,永久)

  • 任务释放信号量时,若信号量已满,则返回错误

计数信号量

概念

  • 长度大于1的队列

  • 无需关心存储内容,只需关注是否为空即可

应用场景

  • 事件计数:在这个场合中, 每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务会获取信号量(信号量计数值减一)来处理事件。在这种场合中创建的计数型信号量初始计数值为 0

  • 资源管理:在这个场合中,信号量值代表当前资源的可用数量,比如停车场当前剩余的停车位数量。一个任务要想获得资源的使用权,首先必须获取信号量,信号量获取成功以后信号量值就会减一。当信号量值为 0 的时候说明没有资源了。当一个任务使用完资源以后一定要释放信号量,释放信号量以后信号量值会加一。在这个场合中创建的计数型信号量初始值应该是资源的数量,比如停车场一共有 100 个停车位,那么创建信号量的时候信号量值就应该初始化为 100

阻塞

  • 任务获取信号量时,若信号量为空,则进入阻塞状态(立即,定时,永久)

  • 任务释放信号量时,若信号量已满,则返回错误

2、相关API函数

2.1、创建

SemaphoreHandle_t xSemaphoreCreateBinary(void)

  • 创建二值信号量

参数

说明

void

返回值

说明

NULL

创建二值信号量失败

其他值

创建二值信号

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值