二值信号量
同步,创建时为空,任务1获取(空)进入阻塞;任务2释放信号量,于是任务1获取信号量得以进入就绪状态
- 资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0 和 1 两种情况的信号量称之为二值信号量
/* 尝试创建一个信号量 */
xSemaphore = xSemaphoreCreateBinary();
下图为两个任务对一个二值信号量得获取、释放(一个任务内有获取、释放);与互斥量作比较
互斥信号量(特殊二值信号量)
优先级继承机制,保护临界资源
/* 创建MuxSem */
MuxSem_Handle = xSemaphoreCreateMutex();
获取和释放函数正常
- 当第二个任务要访问同一二值信号量,将当前任务优先级暂时改为现有任务最大优先级
- 不能用于中断,优先级继承制只能用于任务中
- 在一个任务中进行获取、释放
递归信号量
任务可能会多次获取互斥量的情况下。这样可以避免同一任务多次递归持有而造成死锁的问题
/* 创建递归MuxSem */
MuxSem_Handle = xSemaphoreCreateRecursiveMutex();
/* 尝试获取递归信号量。 如果信号量不可用则等待 10 个 ticks */
xSemaphoreTakeRecursive(MuxSem_Handle,( TickType_t)10);
/* 释放递归信号量,获取了多少次就要释放多少次 */
xSemaphoreGiveRecursive( MuxSem_Handle );
计数信号量
允许多个任务对其进行操作;如100个车位,信号量为100,进一辆车,减一;
- 可以用于资源管理,允许多个任务获取信号量访问共享资源,但会限制任务的最大数目
- 达到可支持的最大数目时,会阻塞其他试图获取该信号量的任务,直到有任务释放了信号量
/* 创建一个计数信号量 , 用于 事件计数 */
xSemaphore = xSemaphoreCreateCounting( 5, 5 );
常用函数
删除
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
释放
xSemaphoreGive( xSemaphore )
// 释放二值信号量,发送接收到新数据标志,供前台程序查询
xSemaphoreGiveFromISR(BinarySem_Handle,&pxHigherPriorityTaskWoken)
获取
// 获取二值信号量 xSemaphore, 没获取到则一直等待
xReturn = xSemaphoreTake(BinarySem_Handle,/* 二值信号量句柄 */
portMAX_DELAY);/* 等待时间 */
xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,
signed BaseType_t *pxHigherPriorityTaskWoken)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)