C语言 Freertos的递归锁详解

yizhihongxing

C语言 Freertos的递归锁详解

什么是递归锁

递归锁是一种特殊的互斥锁,允许同一个线程在获得锁之后,可以多次加锁,直到释放所有锁。一般的互斥锁不允许同一个线程重复加锁,否则会导致死锁。

Freertos的递归锁

Freertos是一款基于RTOS(Real-Time Operating System)的实时操作系统,在多线程的环境下,用递归锁实现同步非常方便。

在Freertos中,递归锁使用信号量的方式实现,也就是说,递归锁其实就是一个mutex(互斥锁),允许同一个线程在获得mutex之后,可以多次加锁,直到释放所有锁。

当SemaphoreHandle_t对象作为递归互斥体使用时,必须使用xSemaphoreCreateRecursiveMutex()或xSemaphoreCreateRecursiveMutexStatic( )使其创建。 xSemaphoreCreateRecursiveMutex()创建一个动态递归互斥体,而xSemaphoreCreateRecursiveMutexStatic()创建一个静态递归互斥体。

在使用递归锁时,可以使用以下API:

xSemaphoreCreateRecursiveMutex()
xSemaphoreCreateRecursiveMutexStatic()
xSemaphoreTakeRecursive()
xSemaphoreGiveRecursive()

递归锁示例说明

下面通过两个示例,展示递归锁的使用方法。

示例1:检测当前是否是递归锁持有者

void recusive_task(void *pvParameters)
{
    static SemaphoreHandle_t xRecursiveMutex;
    xRecursiveMutex = xSemaphoreCreateRecursiveMutex();

    xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY);
    if (xSemaphoreGetMutexHolder(xRecursiveMutex) == xTaskGetCurrentTaskHandle())
    {
        printf("Current Task is Recursive Mutex Holder\n");
    }

    xSemaphoreGiveRecursive(xRecursiveMutex);
    vTaskDelete(NULL);
}

在xRecursiveMutex上对xSemaphoreTakeRecursive()调用成功的任务可以调用xSemaphoreGetMutexHolder()API来确定当前是否是递归锁持有者,以上的示例在确认当前占有递归锁后打印一条消息。

示例2:递归锁的嵌套

void recusive_task(void *pvParameters)
{
    static SemaphoreHandle_t xRecursiveMutex;
    xRecursiveMutex = xSemaphoreCreateRecursiveMutex();

    xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY);
    printf("Acquire Recursive Mutex\n");

    xSemaphoreTakeRecursive(xRecursiveMutex, portMAX_DELAY);
    printf("Acquire Recursive Mutex again\n");

    xSemaphoreGiveRecursive(xRecursiveMutex);
    printf("Recursive Mutex release once.\n");

    xSemaphoreGiveRecursive(xRecursiveMutex);
    printf("Recursive Mutex release once.\n");

    vTaskDelete(NULL);
}

在xRecursiveMutex上对xSemaphoreTakeRecursive()调用成功后,可以多次对xRecursiveMutex使用xSemaphoreTakeRecursive() API加锁,最终,必须对xRecursiveMutex使用等效次数的xSemaphoreGiveRecursive() API解锁,以上的示例展示了如何嵌套使用递归锁。

总结

递归锁是一种允许同一线程在获得锁之后,可以多次加锁,直到释放所有锁的锁。在多线程环境下,递归锁可以方便地保护共享资源。在Freertos中,递归锁使用信号量的方式实现,通过xSemaphoreCreateRecursiveMutex()或xSemaphoreCreateRecursiveMutexStatic()创建一个递归互斥体,可以使用xSemaphoreTakeRecursive()和xSemaphoreGiveRecursive() API锁住和释放锁。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 Freertos的递归锁详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • unity场景异步加载(加载界面的实现)

    在Unity中,场景异步加载是一种优化技术,可以在游戏运行时异步加载场景,从而提高游戏的性能和用户体验。同时,加载界面的实现也是场景异步加载的重要成部分。以下是场景异步加载和加载界面实现的完整攻略: 1. 理解场景异步加载 在Unity中,场景异步加载是一种优化技术,可以在游戏运行时异步加载场景,从而提高游戏的性能和用户体验。场景异步加载可以通过以下步骤实现…

    other 2023年5月8日
    00
  • java获取当前日期的四种方法

    Java获取当前日期的四种方法 在Java开发中,获取当前日期是经常使用的操作。那么在Java中,我们有哪些方式可以获取当前日期呢?本文将介绍Java获取当前日期的四种方法。 方法一:使用java.util.Date类 我们可以使用java.util.Date类获取当前日期。这个类主要用来表示日期和时间。我们可以使用无参构造方法来获取当前日期: Date c…

    其他 2023年3月29日
    00
  • java基础的详细了解第五天

    下面是“Java基础的详细了解第五天”的完整攻略。 一、目的 在第五天,我们将学习Java中的常用集合类,包括List、Set、Map等。通过学习使用这些集合类的方法,可以更好地提高Java的编程效率和代码质量。 二、学习内容 在第五天学习Java的基础集合类的相关知识,主要包括: List集合类的使用 Set集合类的使用 Map集合类的使用 集合类的遍历和…

    other 2023年6月27日
    00
  • Python作用域与名字空间源码学习笔记

    Python作用域与名字空间源码学习笔记攻略 介绍 在Python中,作用域和命名空间是非常重要的概念。了解它们的工作原理对于理解Python代码的执行过程至关重要。本攻略将详细讲解Python作用域和命名空间的概念,并提供一些示例来帮助理解。 作用域 作用域是指在程序中访问变量的有效范围。Python中有四种作用域:内置作用域、全局作用域、局部作用域和非局…

    other 2023年8月19日
    00
  • 在idea中使用JaCoCo插件统计单元测试覆盖率的实现

    以下是关于在IDEA中使用JaCoCo插件统计单元测试覆盖率的完整攻略,包含两个示例说明: 1. 安装JaCoCo插件 首先,在IDEA中安装JaCoCo插件。打开IDEA,点击\”File\” -> \”Settings\” -> \”Plugins\”,搜索并安装\”JaCoCo\”插件。 2. 配置JaCoCo插件 在项目的pom.xml文…

    other 2023年10月19日
    00
  • 一文学会Flex布局 – Nicander – 博客园

    一文学会Flex布局 – Nicander – 博客园 什么是Flex布局 Flex布局是指弹性盒模型,是一种用于页面布局的模型。Flex布局可以使用在普通的块级元素上,或者被应用到一个容器元素上。 在容器元素上应用Flex布局,容器的子元素将会改变它们在容器中的排列方式,包括它们的方向,对齐方式以及它们的大小。这种方式可以给我们带来更好的灵活性和响应式设计…

    其他 2023年3月28日
    00
  • 破解浏览器内网页禁用鼠标右键的N个绝招

    下面是破解浏览器内网页禁用鼠标右键的N个绝招的完整攻略: 1. 绕过disableContextMenu属性 有些网站可能会使用JS来禁用你的右键,具体的实现方式是通过设置HTML元素的disableContextMenu属性为true。这种情况下,我们可以通过Chrome开发者工具来方便的取消这个属性的禁用。 示例:在Chrome浏览器中打开一个网页,比如…

    other 2023年6月27日
    00
  • C++容器适配与栈的实现及dequeque和优先级详解

    C++容器适配与栈的实现及deque和优先级详解 容器适配器(Container Adapters)概述 容器适配器是C++标准库中的一类特殊容器,它们是由已有的基本数据结构通过组合和封装,扩展而来的。C++标准库提供了三种常见的容器适配器:栈(stack)、队列(queue)和优先级队列(priority_queue)。本文将重点讲解栈的实现以及deque…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部