当前位置: 首页 > article >正文

FreeRTOS的递归互斥锁

在FreeRTOS中,递归互斥锁(Recursive Mutex)是一种特殊类型的互斥锁,允许同一个任务多次获取锁而不会导致死锁。配置和使用递归互斥锁的步骤如下:


### 1. 配置FreeRTOS


确保你的FreeRTOS配置文件(通常是`FreeRTOSConfig.h`)中启用了互斥锁功能。通常情况下,这个功能是默认启用的,但你可以检查以下配置项:

#define configUSE_MUTEXES 1


### 2. 创建递归互斥锁


使用`xSemaphoreCreateRecursiveMutex`函数创建一个递归互斥锁。

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

// 创建递归互斥锁
SemaphoreHandle_t xRecursiveMutex;

void createRecursiveMutex() {
    xRecursiveMutex = xSemaphoreCreateRecursiveMutex();
    if (xRecursiveMutex == NULL) {
        // 处理创建失败的情况
    }
}


### 3. 获取递归互斥锁


使用`xSemaphoreTakeRecursive`函数获取递归互斥锁。

void taskFunction() {
    if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {
        // 成功获取锁,执行需要保护的代码
    }
}


### 4. 释放递归互斥锁


使用`xSemaphoreGiveRecursive`函数释放递归互斥锁。

void taskFunction() {
    if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {
        // 成功获取锁,执行需要保护的代码

        // 释放锁
        xSemaphoreGiveRecursive(xRecursiveMutex);
    }
}


### 5. 示例代码


以下是一个完整的示例代码,展示了如何创建和使用递归互斥锁:

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

SemaphoreHandle_t xRecursiveMutex;

void vTask1(void *pvParameters) {
    for (;;) {
        if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {
            // 成功获取锁,执行需要保护的代码
            // 可以多次获取递归锁
            if (xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY) == pdPASS) {
                // 执行需要保护的代码

                // 释放锁
                xSemaphoreGiveRecursive(xRecursiveMutex);
            }
            // 释放锁
            xSemaphoreGiveRecursive(xRecursiveMutex);
        }
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

void createRecursiveMutex() {
    xRecursiveMutex = xSemaphoreCreateRecursiveMutex();
    if (xRecursiveMutex == NULL) {
        // 处理创建失败的情况
    }
}

int main(void) {
    // 初始化硬件和其他必要的设置

    // 创建递归互斥锁
    createRecursiveMutex();

    // 创建任务
    xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // 启动调度器
    vTaskStartScheduler();

    // 如果代码运行到这里,说明调度器启动失败
    for (;;);
}


通过以上步骤,你可以在FreeRTOS中成功配置和使用递归互斥锁。


http://www.kler.cn/a/314490.html

相关文章:

  • MySQL重难点(一)索引
  • 利用滑动窗口解题
  • 实验一:自建Docker注册中心
  • 10款PDF合并工具的使用体验与推荐!!!
  • MySQL:CRUD
  • MySQL_第13章_视图
  • [SDX35+WCN6856]SDX35 + WCN6856 默认增加打包wifi配置hostapd_24g.conf和hostapd_5g.conf操作方法
  • hive分区详细教程
  • 标准c语言(一)
  • 图像处理与OCR识别的实践经验(2)
  • Spring IDEA 2024 安装Lombok插件
  • 基于51单片机的汽车倒车防撞报警器系统
  • 我的AI工具箱Tauri版-VideoDuplication视频素材去重
  • 网关过滤器:Spring Cloud Gateway
  • 使用 Fairseq 进行音频预训练:Train a wav2vec 2.0 base model配置与实现
  • 公私域互通下的新商机探索:链动2+1模式、AI智能名片与S2B2C商城小程序的融合应用
  • USB的口各种区别你都知道吗?
  • html外部链接css怎么引用
  • macOS平台编译libidn2库给iOS及macOS用
  • docker拉取 jdk 8
  • 前端入门:HTML+CSS
  • NoSQL数据库实战派
  • 为什么要关闭SMB V1
  • C++ 一个基本的 MyString 实现和分析实践
  • idea中.git文件夹存在但是没有git功能列表
  • 数据集的选取、标注