数字信号的二值性,信号二值化
墨初 知识笔记 46阅读
目录

什么是信号量
什么是二值信号量

二值信号量相关 API 函数
1. 创建二值信号量
2. 释放二值信号量
3. 获取二值信号量
二值信号量实操
什么是信号量
信号量Semaphore是在多任务环境下使用的一种机制是可以用来保证两个或多个关键代 码段不被并发调用。
信号量这个名字我们可以把它拆分来看信号可以起到通知信号的作用然后我们的量还可以 用来表示资源的数量当我们的量只有0和1的时候它就可以被称作二值信号量只有两个状 态当我们的那个量没有限制的时候它就可以被称作为计数型信号量。
信号量也是队列的一种。
什么是二值信号量二值信号量其实就是一个长度为1大小为零的队列只有0和1两种状态通常情况下我们用 它来进行互斥访问或任务同步。
互斥访问比如门跟钥匙只有获取到钥匙才可以开门
任务同步比如录完视频后才能看视频
二值信号量相关 API 函数 函数 描述xSemaphoreCreateBinary()使用动态方式创建二值信号量xSemaphoreCreateBinaryStatic()使用静态方式创建二值信号量xSemaphoreGive()释放信号量xSemaphoreGiveFromISR()在中断中释放信号量xSemaphoreTake()获取信号量xSemaphoreTakeFromISR()在中断中获取信号量 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 获取信号量。
1.打开CubeMX将FreeRTOS移植到STM32F103C8T6具体看我之前写过的文章
将FreeRTOS移植到STM32F103C8T6
2.然后创建两个任务用来放入和获取信号量
3.创建一个二值信号量然后导出代码
4.进行代码编写
freertos.c
void StartTaskGive(void const * argument){ 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(myBinarySem01Handle) pdTRUE) printf(二值信号量放入成功\r\n);elseprintf(二值信号量放入失败\r\n);}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) GPIO_PIN_RESET);} osDelay(10); }}void StartTaskTake(void const * argument){ 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){ // 0 表示不超时portMAX_DELAY表示卡死等待 if(xSemaphoreTake(myBinarySem01Handle, portMAX_DELAY ) pdTRUE) printf(二值信号量获取成功\r\n);elseprintf(二值信号量获取失败\r\n);}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) GPIO_PIN_RESET);} osDelay(10); }}
5.打开串口调试助手用CubeMX初始化后二值信号量已经先放入成功所以可以直接获得
标签: