C语言 Freertos的递归锁详解

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日

相关文章

  • qq聊天记录文件在哪里

    下面是针对 “qq聊天记录文件在哪里”的攻略: 查找QQ聊天记录文件 QQ聊天记录文件的默认保存位置是在用户目录下的“我的文档”文件夹中的“Tencent Files”文件夹,具体路径为: C:\Users\你的用户名\Documents\Tencent Files 在 Tencent Files 文件夹中,可以找到和 QQ 号码相关的文件夹,每个文件夹中都…

    其他 2023年4月16日
    00
  • Android自定义日历控件实例详解

    下面是关于“Android自定义日历控件实例详解”的完整攻略。 1. 简介 该攻略主要讲解如何使用自定义控件实现日历功能。本攻略将从以下几个方面进行详细说明:- 编写自定义日历控件的思路和基本实现- 日历控件的样式自定义(如字体颜色、背景颜色等)- 日历控件的基本使用 2. 编写自定义日历控件 2.1 实现思路 日历控件的实现思路是:先确定需要显示的月份,并…

    other 2023年6月26日
    00
  • VMware配置虚拟机静态IP地址的方法

    VMware配置虚拟机静态IP地址的方法 在VMware中,配置虚拟机的静态IP地址可以确保虚拟机在网络中保持固定的IP地址,而不是依赖于DHCP服务器分配的动态IP地址。下面是配置虚拟机静态IP地址的完整攻略。 步骤一:打开虚拟机设置 打开VMware虚拟机,并选择要配置静态IP地址的虚拟机。 在VMware菜单栏中,选择“编辑”>“虚拟机设置”。 …

    other 2023年7月30日
    00
  • 字符串查找 cmd find命令

    字符串查找是在电脑中进行文本搜索的一种方法,可以通过使用cmd命令行中的Find命令来进行查找。 Find命令可以用于在文本文件中查找字符串, 本文将详细介绍如何使用该命令来进行字符串查找。 Find命令基本语法 Find命令的基本语法如下: Find "string" filename 其中,- string:要查找的字符串。- fil…

    other 2023年6月26日
    00
  • 浅谈PostgreSQL的客户端认证pg_hba.conf

    Pg_hba.conf文件是PostgreSQL数据库服务器配置中的一份非常关键的文件。它决定了客户端如何才能连接上PostgreSQL服务器,同时也控制了各种用户的访问权限。在本文中,我们将会深入浅出地介绍pg_hba.conf文件的相关知识。 什么是pg_hba.conf pg_hba.conf(Host-based Authentication)是一份…

    other 2023年6月27日
    00
  • ​​​​​​​C语言实现单链表基本操作方法

    下面是C语言实现单链表基本操作方法的完整攻略: 1. 定义单链表结构体 首先,需要定义一个单链表结构体,来描述节点的信息。结构体应该包含两个部分:数据域和指针域。数据域存储节点的值,指针域存储指向下一个节点的指针。 struct ListNode { int val; // 数据域,此处数据类型为 int struct ListNode *next; // …

    other 2023年6月27日
    00
  • wp手机怎样安装应用程序图文教程

    WP手机如何安装应用程序 1. 在微软商店下载安装应用程序 WP手机可以通过微软商店安装应用程序,具体操作步骤如下: 步骤1:打开微软商店 在WP手机桌面上找到“商店”图标,点击打开。 步骤2:搜索应用程序 在商店首页右上方的搜索框中输入应用程序名称或关键词,或者在分类列表中选择相应的应用程序类型进行查找。 步骤3:安装应用程序 点击应用程序图标进入详情页面…

    other 2023年6月25日
    00
  • Hooks封装与使用示例详解

    下面是“Hooks封装与使用示例详解”的完整攻略。 1. Hooks简介 Hooks是React 16.8版本新增的一项特性,用于解决组件之间状态复用等问题。常见的Hooks有useState、useEffect、useContext等。 2. Hooks封装 Hooks的使用需要遵循一定的封装规则,方便组件复用。下面是Hooks封装的示例,以useFetc…

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