【FreeRTOS】信号量和互斥量

二值信号量

同步,创建时为空,任务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)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值