Skip to content

ESP32-C3 互斥锁

互斥锁

互斥锁是一种用于保护共享资源,防止多个任务同时访问的机制。在ESP32-C3中,互斥锁通常用于保护共享内存区域,确保在多任务环境中只有一个任务可以访问该区域。

ESP32-C3提供了多种互斥锁的实现方式,包括:

  • 临界区:临界区是一种简单的互斥锁,它通过禁用中断来保护共享资源。在临界区内,其他任务无法访问共享资源,直到临界区结束。临界区适用于保护短时间访问的共享资源。
  • 信号量:信号量是一种更通用的互斥锁,它可以用于保护任何类型的共享资源。信号量可以用于保护多个任务访问共享资源的情况。
  • 互斥锁:互斥锁是一种更高级的互斥锁,它可以用于保护任何类型的共享资源。互斥锁可以用于保护多个任务访问共享资源的情况,并且可以设置优先级。 在ESP32-C3中,互斥锁通常用于保护共享内存区域,确保在多任务环境中只有一个任务可以访问该区域。

互斥锁的使用方法

在ESP32-C3中,互斥锁的使用方法如下:

  1. 定义一个互斥锁:
c
SemaphoreHandle_t mutex = xSemaphoreCreateMutex();
  1. 在任务中获取互斥锁:
c
xSemaphoreTake(mutex, portMAX_DELAY);
  1. 在任务中释放互斥锁:
c
xSemaphoreGive(mutex);

互斥锁的例子

c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"

SemaphoreHandle_t mutex;

void task1(void *pvParameters)
{
    while (1)
    {
        xSemaphoreTake(mutex, portMAX_DELAY);
        printf("Task 1 is running\n");
        xSemaphoreGive(mutex);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void task2(void *pvParameters)
{
    while (1)
    {
        xSemaphoreTake(mutex, portMAX_DELAY);
        printf("Task 2 is running\n");
        xSemaphoreGive(mutex);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

void app_main()
{
    mutex = xSemaphoreCreateMutex();
    xTaskCreate(task1, "Task 1", 2048, NULL, 1, NULL);
    xTaskCreate(task2, "Task 2", 2048, NULL, 1, NULL);

}