0
点赞
收藏
分享

微信扫一扫

FreeRTOS的互斥量


一、FreeRTOS的互斥量

FreeRTOS中的互斥量是一种特殊的二值信号量,它的本质上也是信号量。互斥量支持对临界资源的独占式处理,并具有以下特性:

  1. 支持互斥量所有权:一个任务可以持有一个互斥量并防止其他任务获取它,只有持有互斥量的任务才能访问临界资源。
  2. 支持递归访问:同一任务可以多次获取互斥量,而不会导致死锁。
  3. 支持防止优先级翻转:当一个低优先级任务持有互斥量时,高优先级任务不能获取该互斥量,从而避免了优先级翻转的问题。

互斥量的使用可以通过FreeRTOS提供的Semaphore API进行操作。例如,创建一个互斥量可以使用函数xSemaphoreCreateMutex(),获取互斥量可以使用函数xSemaphoreTake(),释放互斥量可以使用函数xSemaphoreGive()。

二、下面是一个使用FreeRTOS互斥量的简单例子:

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

// 定义互斥量
SemaphoreHandle_t xMutex;

void task1(void *pvParameters) {
  while(1) {
    // 获取互斥量
    xSemaphoreTake(xMutex, portMAX_DELAY);
    // 访问临界资源
    printf("Task 1: accessing critical resource\n");
    // 释放互斥量
    xSemaphoreGive(xMutex);
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

void task2(void *pvParameters) {
  while(1) {
    // 获取互斥量
    xSemaphoreTake(xMutex, portMAX_DELAY);
    // 访问临界资源
    printf("Task 2: accessing critical resource\n");
    // 释放互斥量
    xSemaphoreGive(xMutex);
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

int main(void) {
  // 创建互斥量
  xMutex = xSemaphoreCreateMutex();

  // 创建任务
  xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
  xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, 2, NULL);

  // 启动调度器
  vTaskStartScheduler();

  return 0;
}

在该示例中,首先创建了一个互斥量xMutex,并在两个任务中使用它来访问临界资源。其中,任务1和任务2都会获取互斥量,访问临界资源,然后释放互斥量。由于互斥量的特性,同一时刻只有一个任务能够获得该互斥量,从而保证了对临界资源的独占式访问。

举报

相关推荐

0 条评论