LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

ESP-IDF与freeRTOS(六) 计数信号量

ESP-IDF与freeRTOS(六) 计数信号量

计数型信号量

用于记录剩余资源的数量,当没有资源的时候将等待资源产生。

可以看作是一个停车场,计数型信号量记录剩余车位,信号量用完时将不允许再停车,当有车离开时信号量增加,将允许车辆进入。

示例代码:

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

#include "freertos/semphr.h"

// #include "myled.h"

SemaphoreHandle_t semphrHandle;

void carInTask(void *pvParam)
{
    int emptySpace = 0;
    BaseType_t iResult;
    while (1)
    {
        // 获取计数型信号量剩余值,停车场剩余车位
        emptySpace = uxSemaphoreGetCount(semphrHandle);
        printf("\nemptySpace = %d!\n", emptySpace);
        // 取得、消耗信号量,车进入停车场
        iResult = xSemaphoreTake(semphrHandle, 0);

        if (iResult == pdPASS)
        {
            // 成功取得
            printf("One car in\n");
        }
        else
        {
            // 取得失败
            printf("No space\n");
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

void carOutTask(void *pvParam)
{
    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(600));
        // give信号,车开出停车场
        xSemaphoreGive(semphrHandle);
        printf("\nOne car out\n");
    }
}

void app_main(void)
{
    // 创建计数信号量,需要参数最大值和初始值,创建时已经指定剩余为5,不需要开始就give
    semphrHandle = xSemaphoreCreateCounting(5, 5);

    xTaskCreatePinnedToCore(carInTask, "carInTask", 1024 * 5, NULL, 1, NULL, 1);
    xTaskCreatePinnedToCore(carOutTask, "carOutTask", 1024 * 5, NULL, 1, NULL, 1);
}

运行结果:

每100ms进入一辆车,每600ms开出一辆车

...
emptySpace = 5!
One car in

emptySpace = 4!
One car in

emptySpace = 3!
One car in

emptySpace = 2!
One car in

emptySpace = 1!
One car in

emptySpace = 0!
No space

One car out

emptySpace = 1!
One car in

emptySpace = 0!
No space

emptySpace = 0!
No space

emptySpace = 0!
No space

emptySpace = 0!
No space

emptySpace = 0!
No space

One car out

emptySpace = 1!
One car in

emptySpace = 0!
No space

emptySpace = 0!
No space

emptySpace = 0!
No space

emptySpace = 0!
No space

emptySpace = 0!
No space

One car out

emptySpace = 1!
One car in
...
showimg