• 二进制信号量


    二进制信号量能够满足任务间的互斥和同步,需要的系统开销最小,因此也称快速信号量。二进制信号量可以看成一个标志,对应资源是可用还是不可用。
    本小节就来认识二进制信号量的创建等过程。
    首先要添加一个头文件freertos/semphr.h

    #include 
    #include "sdkconfig.h"
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "esp_system.h"
    #include "esp_spi_flash.h"
    #include "freertos/queue.h"
    #include "freertos/timers.h"
    #include "freertos/semphr.h"
    
    int iCount = 0;
    SemaphoreHandle_t semaphoreHandle;
    
    void myTask1(void *pvParam) {
    	while (1) {
    		xSemaphoreTake(semaphoreHandle, portMAX_DELAY);
    		for (int i = 0; i < 10; i++) {
    			iCount++;
    			printf("myTask1 iCount = %d!\n", iCount);
    			vTaskDelay(pdMS_TO_TICKS(1000));
    		}
    		xSemaphoreGive(semaphoreHandle);
    		vTaskDelay(pdMS_TO_TICKS(100));
    	}
    }
    
    void myTask2(void *pvParam) {
    	while (1) {
    		xSemaphoreTake(semaphoreHandle, portMAX_DELAY);
    		for (int i = 0; i < 10; i++) {
    			iCount++;
    			printf("myTask2 iCount = %d!\n", iCount);
    			vTaskDelay(pdMS_TO_TICKS(1000));
    		}
    		xSemaphoreGive(semaphoreHandle);
    		vTaskDelay(pdMS_TO_TICKS(100));
    	}
    }
    
    void app_main(void) {
    	semaphoreHandle = xSemaphoreCreateBinary();
    	xSemaphoreGive(semaphoreHandle);
    	xTaskCreate(myTask1, "myTask1", 1024 * 5, NULL, 1, NULL);
    	xTaskCreate(myTask2, "myTask2", 1024 * 5, NULL, 1, NULL);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    我们在app_main()中调用xSemaphoreCreateBinary()函数,创建一个二进制信号量,创建完后使用xSemaphoreGive()函数释放创建的信号量,使用xTaskCreate()创建任务。
    在myTask1()和myTask2()中先获取信号量,循环打印后释放信号量
    对上述代码中一些函数做简单说明:
    xSemaphoreCreateBinary()函数:

    创建一个二进制信号量,并返回一个句柄

    xSemaphoreGive()函数:

    释放以前使用调用创建的信号量

    xSemaphore:创建的信号量句柄

    xSemaphoreTake()函数:

    获取创建的信号量
    xSemaphore:传入正在使用的信号量
    xTicksToWait:要等待的时间

    请添加图片描述

  • 相关阅读:
    【计算机网络】运输层
    Go语言:一门简洁高效的编程语言
    【PyQt5 实战项目1】武汉大学建筑知识系统--思路分享1(总体概述)
    智能客服能用于哪些场景?
    iOS小技能:iOS15崩溃排查技巧(symbolicatecrash符号化分析问题、导出和隐藏符号)
    Cesium初学者:如何在本地查看示例、文档
    麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统)
    liunx常见指令
    每日一题——
    内存模型与C++ 内存序
  • 原文地址:https://blog.csdn.net/qq_45671732/article/details/126422100