信号量(Semaphore)

信号量是一种同步机制,通过计数器控制多任务/线程对共享资源的访问。本质是一个非负整数,支持两种原子操作:获取(Take/P)和释放(Give/V),需手动释放(减少)信号量。

使用流程:

①创建信号量(成功后返回信号量句柄)->获取信号量->(若不用则删除信号量)

②单独释放信号量(相当于改变信号量)

1.  创建信号量

类似创建队列,先使用创建信号量句柄再创建信号量

同队列,xSemaphoreCreate必须可以被app_main调用()

SemaphoreHandle_t bin_sem; //创建信号量句柄
bin_sem = xSemaphoreCreateBinary(); //通过之前定义的信号量句柄创建二进制信号量

2.  释放信号量

此处只演示二进制信号量

xSemaphoreGive(bin_sem); //每隔1s释放一个信号量
vTaskDelay(pdMS_TO_TICKS(1000));

3.  获取信号量(使用信号量)

if(pdTRUE == xSemaphoreTake(bin_sem,portMAX_DELAY))
//因为是二进制信号量,所以只有两个状态0/1
ESP_LOGI("bin_sem","You got the SEM_BIN!");