FreeRTOS的递归互斥锁

news/2024/9/21 21:00:29/

在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/news/1528549.html

相关文章

Python中 BeautifulSoup和Selenium 定位元素和获取元素值的方法

在Python中,BeautifulSoup(bs4)和Selenium都是常用的库,用于解析和操作HTML文档。它们各自有不同的定位元素和获取元素值的方法。以下是详细的介绍。 BeautifulSoup(bs4) 以下是一个全面的概述&#xff0…

基于YOLO算法的网球运动实时分析-击球速度测量-击球次数(附源码)

这个项目通过分析视频中的网球运动员来测量他们的速度、击球速度以及击球次数。该项目使用YOLO(You Only Look Once)算法来检测球员和网球,并利用卷积神经网络(CNNs)来提取球场的关键点。此实战项目非常适合提升您的机…

机器学习VS深度学习

机器学习(Machine Learning, ML)和深度学习(Deep Learning, DL)是人工智能(AI)的两个子领域,它们有许多相似之处,但在技术实现和应用范围上也有显著区别。下面从几个方面对两者进行区…

Linux文件IO(四)-返回错误处理与errno详解

1.前言 在上一文章中,给大家编写了很多的示例代码,大家会发现这些示例代码会有一个共同的特点,那就是当判断函数执行失败后,会调用 return 退出程序,但是对于我们来说,我们并不知道为什么会出错&#xff0…

C++初阶-list用法总结

目录 1.迭代器的分类 2.算法举例 3.push_back/emplace_back 4.insert/erase函数介绍 5.splice函数介绍 5.1用法一:把一个链表里面的数据给另外一个链表 5.2 用法二:调整链表当前的节点数据 6.unique去重函数介绍 1.迭代器的分类 我们的这个迭代器…

富文本编辑器wangEdittor使用入门

一、wangEdittor介绍 富文本编辑器为开源产品wangEditor。wangEditor是一款轻量级Web富文本编辑器,配置方便,使用简单。读者可在其官网和GitHub仓库进行更多了解。主要有以下功能: 1)图文混排 wangEditor可以编辑的内容比较丰富…

通过标签实现有序:优化你的 FastAPI 生成的 TypeScript 客户端

在软件开发的世界里,API 客户端代码的质量直接影响着应用程序的性能和可维护性。随着项目规模的扩大,自动化生成的代码往往变得臃肿且难以管理。但幸运的是,通过一系列的优化策略,我们可以显著提升这些代码的优雅与效能。在本文中…

C++ 字符串中的第一个唯一字符 - 力扣(LeetCode)

点击链接即可查看题目:387. 字符串中的第一个唯一字符 - 力扣(LeetCode) 一、题目 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 示例 1: 输入: s…