FreerRTOS(二值信号量和计数型信号量)

什么是信号量?

信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代 码段不被并发调用。 信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以 用来表示资源的数量,当我们的量只有0和1的时候,它就可以被称作二值信号量,只有两个状 态,当我们的那个量没有限制的时候,它就可以被称作为计数型信号量。

信号量也是队列的一种。

什么是二值信号量?

二值信号量其实就是一个长度为1,大小为零的队列,只有0和1两种状态,通常情况下,我们用 它来进行互斥访问或任务同步。

互斥访问:比如门钥匙,只有获取到钥匙才可以开门

任务同步:比如别人先写完博文你才可以看博文

1. 创建二值信号量

SemaphoreHandle_t xSemaphoreCreateBinary( void )

参数:

  • 返回值: 成功,返回对应二值信号量的句柄; 失败,返回 NULL 。 

2. 释放二值信号量

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore )

参数:

  • xSemaphore:要释放的信号量句柄
  • 返回值: 成功,返回 pdPASS ; 失败,返回 errQUEUE_FULL 。

3. 获取二值信号量

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait )

参数:

  • xSemaphore:要获取的信号量句柄
  • xTicksToWait:超时时间,0 表示不超时,portMAX_DELAY表示卡死等待;
  • 返回值: 成功,返回 pdPASS ; 失败,返回 errQUEUE_FULL 。

实操

实验需求: 创建一个二值信号量,按下 KEY1 则释放信号量,按下 KEY2 获取信号量。

cubeMX配置

代码实现

 计数型信号量

 什么是计数型信号量?

计数型信号量相当于队列长度大于1 的队列,因此计数型信号量能够容纳多个资源,这在计数型 信号量被创建的时候确定的。

 计数型信号量的释放和获取与二值信号量完全相同 !

SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);

参数:

  • uxMaxCount:可以达到的最大计数值
  • uxInitialCount:创建信号量时分配给信号量的计数值
  • 返回值: 成功,返回对应计数型信号量的句柄; 失败,返回 NULL 。

实操

实验需求 :创建一个计数型信号量,按下 KEY1 则释放信号量,按下 KEY2 获取信号量。 cubeMX配置

将 Config parameters 标签里的 USE_COUNTING_SEMAPHORES 设置为 Enabled 。

 代码实现

 

猜你喜欢

转载自blog.csdn.net/m0_70987863/article/details/131691914