温州网站建设定制,手机网站设计欣赏,做网站如何语音对话,个人网站建设维护什么是信号量#xff1f;
信号量#xff08;Semaphore#xff09;#xff0c;是在多任务环境下使用的一种机制#xff0c;是可以用来保证两个或多个关键代 码段不被并发调用。 信号量这个名字#xff0c;我们可以把它拆分来看#xff0c;信号可以起到通知信号的作用
信号量Semaphore是在多任务环境下使用的一种机制是可以用来保证两个或多个关键代 码段不被并发调用。 信号量这个名字我们可以把它拆分来看信号可以起到通知信号的作用然后我们的量还可以 用来表示资源的数量
当我们的量只有0和1的时候它就可以被称作二值信号量只有两个状 态当我们的那个量没有限制的时候它就可以被称作为计数型信号量。 信号量也是队列的一种。 什么是二值信号量
二值信号量其实就是一个长度为1大小为零的队列只有0和1两种状态通常情况下我们用 它来进行互斥访问或任务同步。
互斥访问比如门钥匙只有获取到钥匙才可以开门
任务同步比如我录完视频你才可以看视频 1. 创建二值信号量
SemaphoreHandle_t xSemaphoreCreateBinary( void )
参数 无
返回值 成功返回对应二值信号量的句柄 失败返回 NULL 。
2. 释放二值信号量
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore )
参数 xSemaphore要释放的信号量句柄
返回值 成功返回 pdPASS 失败返回 errQUEUE_FULL 。
3、获取二值信号量
seType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );
参数 xSemaphore要获取的信号量句柄
xTicksToWait超时时间0 表示不超时
portMAX_DELAY表示卡死等待
返回值 成功返回 pdPASS 失败返回 errQUEUE_FULL 。
实操 实验需求 创建一个二值信号量按下 KEY1 则释放信号量按下 KEY2 获取信号量。
代码
myBinarySemHandle xSemaphoreCreateBinary();void StartTaskGive(void const * argument)
{/* USER CODE BEGIN StartTaskGive *//* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)GPIO_PIN_RESET){osDelay(20);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)GPIO_PIN_RESET){if(xSemaphoreGive( myBinarySemHandle)pdTRUE)printf(二值信号量放入成功\r\n);elseprintf(二值信号量放入失败\r\n);}while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)GPIO_PIN_RESET);}osDelay(10);}/* USER CODE END StartTaskGive */
}/* USER CODE BEGIN Header_StartTaskTake */
/**
* brief Function implementing the taskTake thread.
* param argument: Not used
* retval None
*/
/* USER CODE END Header_StartTaskTake */
void StartTaskTake(void const * argument)
{/* USER CODE BEGIN StartTaskTake *//* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)GPIO_PIN_RESET){osDelay(20);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)GPIO_PIN_RESET){if(xSemaphoreTake(myBinarySemHandle,portMAX_DELAY)pdTRUE)printf(取出二值信号量成功\r\n);elseprintf(取出二值信号量失败\r\n);}while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)GPIO_PIN_RESET);}osDelay(10);}/* USER CODE END StartTaskTake */
}