简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。
SemaphoreHandle_t xSemaphoreCreateBinary()//返回值为SemaphoreHandle_t结构体指针,即创建的信号量,不成功返回NULL
xSemaphoreGive(xSemaphore)
xSemaphoreTake(xSemaphore, //创建的信号量 xBlockTime //等待时间,超时则返回pdFulse );
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, //最大计数值 UBaseType_t uxInitialCount//初始计数值 );//返回值为SemaphoreHandle_t结构体指针,即创建的信号量,不成功返回NULL
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
/** * Copyright (C) 2024-2034 HalfMoon2. * All rights reserved. * * @file Filename without the absolute path * @brief Brief description * @author HalfMoon2 * @date 2025-04-29 * @version v0.1 * * @revision history: * 2025-04-29 - Initial version. */ #include <stdio.h> #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <freertos/semphr.h> #include <esp_log.h> SemaphoreHandle_t semap=NULL; void taskA(void *pvParam) { while(1){ xSemaphoreGive(semap); vTaskDelay(pdMS_TO_TICKS(1000)); } } void taskB(void *pvParam) { BaseType_t num=0; while(1){ if(xSemaphoreTake(semap,pdMS_TO_TICKS(500))==pdPASS){ num++; ESP_LOGI("taskB","num is %d",num); }else{ ESP_LOGI("taskB","Take failed"); } } } void app_main(void) { semap=xSemaphoreCreateBinary(); xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); xTaskCreatePinnedToCore(taskB,"taskB",2048,NULL,3,NULL,1); }
结果解析:taskB任务每500ms获取一次信号量,当获取成功则num变量加一,然而taskA任务每1000ms发出一个信号量,所以taskB每间隔500ms会失败一次。
/** * Copyright (C) 2024-2034 HalfMoon2. * All rights reserved. * * @file Filename without the absolute path * @brief Brief description * @author HalfMoon2 * @date 2025-04-30 * @version v0.1 * * @revision history: * 2025-04-30 - Initial version. */ #include <stdio.h> #include <stdio.h> #include <freertos/FreeRTOS.h> #include <freertos/task.h> #include <freertos/semphr.h> #include <esp_log.h> SemaphoreHandle_t semap=NULL; void taskA(void *pvParam) { while(1){ xSemaphoreGive(semap); vTaskDelay(pdMS_TO_TICKS(1000)); } } void taskB(void *pvParam) { BaseType_t num=0; while(1){ if(xSemaphoreTake(semap,pdMS_TO_TICKS(400))==pdPASS){ num++; ESP_LOGI("taskB","num is %d",num); }else{ ESP_LOGI("taskB","Take failed"); } } } void app_main(void) { semap=xSemaphoreCreateCounting(3,2); xTaskCreatePinnedToCore(taskA,"taskA",2048,NULL,4,NULL,1); xTaskCreatePinnedToCore(taskB,"taskB",2048,NULL,3,NULL,1); }
结果解析:创建计数型信号量时,初始值为2,taskA优先级高些先执行,信号量计数值加1,信号量计数值为3,taskB每400ms获取信号量前三次时成功的,第四次时,由于taskA阻塞时间为1000ms,这个时候其还没发出信号量,信号量计数值为0,所以taskB获取失败。
作者: 二月半, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-1862109.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论