• 二进制信号量


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

    请添加图片描述

  • 相关阅读:
    git仓库浏览代码插件
    云服务器的热潮:为什么它如此受欢迎?
    Netty 之 NioEventLoop 源码阅读
    彻底理解Linux的crontab
    数据结构:单链表
    八、开发者工具与单元测试
    (九)Java算法:快速排序(详细图解)
    解决kubernetes集群证书过期的问题
    【学习笔记】CF1672G Cross Xor
    VB遍历所有窗体名
  • 原文地址:https://blog.csdn.net/qq_45671732/article/details/126422100