avatar

松果工作室

欢迎光临

  • 首页
  • freeRTOS
  • ESP
  • 开发手册
  • 快速笔记
  • 个人收藏
  • 工具
Home 二进制信号量(Semaphore)
文章

二进制信号量(Semaphore)

Posted 2023-11-19 Updated 2023-11- 19
By YCP
6~7 min read

二进制信号量和互斥锁所用的底层函数相同,xSemaphoreTake()和 xSemaphoreGive()。但不相似。
互斥锁中这两个函数分别扮演着开锁和关锁的角色。
而在二进制信号量中,却类似于 flag 的用法。具体如下:

使用流程

目的:Task2 等待 Task1 的信号并且执行任务

  • 定义一个二进制信号量
  • Task1:给出(Give)信号
  • Task2:等待信号(Take)的到来,此时任务阻塞。

如果用 Flag 标志位类比:

  • bool Flag = 0
  • Task1:Flag = 1
  • Task2:if(Flag == 1)Flag=0

特殊情况

任务1 每 15 秒释放一次信号量;
任务 2 执行完毕到等待获取信号量需要 16 秒
结果:
任务 2 在完成后,可能需要等待下一个信号量的释放(即 14 秒后)才能再次执行任务。即使有多个信号量被释放,任务 2 也只会在它主动调用 xSemaphoreTake() 时获取到信号量并执行。

代码示例

在代码中,使用了 vTaskDelay来模拟变量的处理花费的时间,而不是作为阻塞作用
因为互斥锁本身是有阻塞作用的

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"

SemaphoreHandle_t xBinarySemaphore;

void vTask1(void *pvParameters) {
    while(1) {
        vTaskDelay(15 / portTICK_PERIOD_MS);
        xSemaphoreGive(xBinarySemaphore);
    }
}

void vTask2(void *pvParameters) {
    while(1) {
        if(xSemaphoreTake(xBinarySemaphore, portMAX_DELAY)) {
            vTaskDelay(16 / portTICK_PERIOD_MS);
        }
    }
}

void app_main() {
    xBinarySemaphore = xSemaphoreCreateBinary();

    xTaskCreate(vTask1, "Task1", 2048, NULL, 2, NULL);
    xTaskCreate(vTask2, "Task2", 2048, NULL, 2, NULL);
}
重学 freeRTOS
freeRTOS
License:  CC BY 4.0
Share

Further Reading

May 9, 2024

freeRTOS 高精度定时任务

vTaskDelayUntil()能精确地在每 50ms 调用这个函数 void TASKF(void *ptr) { TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); while (1) { vTask

Dec 8, 2023

事件组(Event Group)

使用流程 创建事件组句柄 定义事件组标志位 Task1:事件组标志位置 1 Task2:创建等待事件组事件;检测事件组标志位是否置 1 注意事项 待补充,纯属一个 Flag。 代码示例 #include <FreeRTOS.h> #include <task.h> #

Dec 7, 2023

软件定时器(Software Timer)

使用流程 创建定时器句柄 启动定时器 注意事项 启动定时器后,延时一个周期再执行定时器回调,不会立刻执行。因此,当定时器句柄中的 pdTure 改成 pdFalse,这就是个延时任务。 延时任务执行一次之后,如果再次执行xTimerStart,会再次执行一次延时任务。 代码示例 #include "

OLDER

CPP 面向对象大纲

NEWER

消息队列(Queue)

Recently Updated

  • ESP32(八) 简单的webserver
  • ESP32(七) NVS
  • ESP32(四) STA & AP
  • 多级菜单
  • ESP32(五) ESP32 OTA

Trending Tags

WCH Linux Elec freeRTOS STM ESP Flutter Others SwiftUI

Contents

©2025 松果工作室. Some rights reserved.

Using the Halo theme Chirpy