1. 信号量 (Semaphore)
通俗理解:信号量就像停车场的空位计数器。当有车进入时,计数器减1;当有车离开时,计数器加1。如果计数器为0,新车必须等待直到有空位。
#include "FreeRTOS.h"
#include "semphr.h"// 声明一个互斥量句柄
SemaphoreHandle_t xMutex;// 共享资源(就像卫生间)
int sharedResource = 0;// 任务1:访问共享资源
void vTask1(void *pvParameters) {while(1) {// 获取互斥量(拿到卫生间钥匙)if(xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {printf("任务1拿到了互斥量,开始访问共享资源\n");// 访问共享资源(使用卫生间)sharedResource++;printf("任务1: sharedResource = %d\n", sharedResource);vTaskDelay(pdMS_TO_TICKS(1000)); // 模拟使用资源的时间// 释放互斥量(归还卫生间钥匙)xSemaphoreGive(xMutex);printf("任务1释放了互斥量\n");}vTaskDelay(pdMS_TO_TICKS(500)); // 等待一段时间再次尝试}
}// 任务2:也访问相同的共享资源
void vTask2(void *pvParameters) {while(1) {// 获取互斥量(尝试拿到卫生间钥匙)if(xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {printf("任务2拿到了互斥量,开始访问共享资源\n");// 访问共享资源(使用卫生间)sharedResource--;printf("任务2: sharedResource = %d\n", sharedResource);vTaskDelay(pdMS_TO_TICKS(800)); // 模拟使用资源的时间// 释放互斥量(归还卫生间钥匙)xSemaphoreGive(xMutex);printf("任务2释放了互斥量\n");}vTaskDelay(pdMS_TO_TICKS(500)); // 等待一段时间再次尝试}
}void main() {// 创建互斥量xMutex = xSemaphoreCreateMutex();// 创建两个任务xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL);xTaskCreate(vTask2, "Task2", 1000, NULL, 1, NULL);// 启动调度器vTaskStartScheduler();
}