FreeRTOS的递归互斥锁

server/2024/9/23 8:31:23/

在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.ppmy.cn/server/120184.html

相关文章

在MAC中Ollama开放其他电脑访问

ollama安装完毕后默认只能在本地访问,之前我都是安装其他的软件之后可以结合开放其他端口访问,其实是可以新增或修改下电脑的系统配置,就可以打开端口允许除本机IP或localhost访问。 步骤如下: 1、查看端口(默认是&…

安全基础学习-AES128加密算法

前言 AES(Advanced Encryption Standard)是对称加密算法的一个标准,主要用于保护电子数据的安全。AES 支持128、192、和256位密钥长度,其中AES-128是最常用的一种,它使用128位(16字节)的密钥进…

了解云容器实例云容器实例(Cloud Container Instance)

1.什么是云容器实例? 云容器实例(Cloud Container Instance, CCI)服务提供 Serverless Container(无服务器容器)引擎,让您无需创建和管理服务器集群即可直接运行容器。 Serverless是一种架构理念…

YOLO系列,转载,优秀博客

yolo系列的发展史-CSDN博客 YOLO系列算法精讲:从YoloV1至YoloV8的进阶之路 【万字长文】看完这篇yolov4详解,那算是真会了_yolov4代码详解-CSDN博客 CSP Darknet53_cspdarknet53-CSDN博客

jmeter得到的文档数据处理

通过前面jmeter得到的输出文档,这里是txt文档,里面包含了很多条数据,每条数据的结构如下: 【request】 uuid:xxxxxxx timestamp:xxxxxxxx No.x question:xxxxxxx 【response】 code&#…

Qt:实现单例模式

前言 记录一下。 正文 单例模式根据实现方式和应用场景在Qt中可以分为以下几种类型: 1. 懒汉式单例 懒汉式单例在第一次使用时才创建实例,延迟了对象的初始化。懒汉式单例分为线程安全和线程不安全两种实现方式。 线程不安全的懒汉式单例&#xff1…

k8s中的存储

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…

Istio下载及安装

Istio 是一个开源的服务网格,用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档:https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件,或者自动…