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日

相关文章

  • 显卡oc和不带oc性能差距大吗 显卡oc和不带oc的区别对比

    显卡OC和不带OC性能差距大吗? 显卡OC(超频)是指通过调整显卡的工作频率来提高其性能。一般来说,显卡OC可以带来一定的性能提升,但具体的差距取决于多个因素,包括显卡本身的设计和制造质量,以及超频的程度和稳定性。 显卡OC的优势 性能提升:通过超频,显卡的工作频率可以提高,从而增加图形处理能力和帧率。这意味着在游戏或其他图形密集型任务中,显卡OC可以提供更…

    other 2023年8月6日
    00
  • springboot @PostConstruct无效的解决

    问题描述: 在使用 SpringBoot 框架时,通过 @PostConstruct 注解修饰的方法可能会出现无法执行的情况。 解决过程: 1.确认依赖 首先,我们需要确认在项目中是否引入了正确的依赖。在 pom.xml 文件中,需要引入 spring-boot-starter-web 包,这个包中含有使用到 @PostConstruct 注解的相关类和方法…

    other 2023年6月27日
    00
  • MySql如何将查询的出来的字段进行转换

    MySQL提供了多种函数,可以对查询出来的字段进行转换。下面是一些常用的转换函数及其使用方法: 1. CONCAT() CONCAT() 用于将多个字符串连接成一个字符串。语法: CONCAT(string1, string2, …, stringN) 示例: SELECT CONCAT(‘Hello’, ‘ ‘, ‘World’); 结果为: ‘Hel…

    other 2023年6月25日
    00
  • 魔兽7.0武器战输出手法什么最厉害_武器战7种输出手法详解

    魔兽7.0武器战输出手法什么最厉害 – 武器战7种输出手法详解 简介 在魔兽7.0中,武器战是一个非常强大的职业,但要达到最佳输出需要掌握不同的战斗技巧和输出手法。本文将详细介绍武器战的7种输出手法,并分析它们各自的优缺点。 武器战7种输出手法详解 1. 大杀四方 大杀四方是武器战的经典技能,在击杀多个敌人时非常有效。该技能可以在一个区域内对多个目标造成伤害…

    other 2023年6月27日
    00
  • VisualStudio常用标准控件功能介绍

    Visual Studio 是一个强大的集成开发环境(IDE),它支持多种编程语言,并内置了许多常用的控件以方便用户进行开发。在本文中,我将详细讲解 Visual Studio 中常用的标准控件以及它们的功能。 常用标准控件 Label 控件 Label 控件用于显示纯文本信息,可以设置前景色、背景色、字体大小等属性。以下是一个示例代码: Label lab…

    other 2023年6月27日
    00
  • 数组与类使用PHP的可变变量名需要的注意的问题

    数组与类使用PHP的可变变量名需要的注意的问题 在PHP中,使用可变变量名可以动态地引用变量。这在处理数组和类时非常有用,但也需要注意一些问题。本攻略将详细讲解这些问题,并提供两个示例说明。 1. 使用可变变量名引用数组元素 在处理数组时,可变变量名可以用来引用数组元素。但是,需要注意以下几点: 使用可变变量名引用数组元素时,要确保可变变量名的值是一个字符串…

    other 2023年8月8日
    00
  • 通信网络 2G 3G 4G 和路由器2.4G 5G的区分和关系

    通信网络和路由器是现代网络中的两个重要组成部分。本文将详细讲解2G、3G、4G和路由器2.4G、5G的区分和关系,并提供两个示例说明。 2G、3G、4G的区分和关系 2G、3G、4G是移动通信网络的三个代表性标准,它们之间的区别主要在于数据传输速度和网络覆盖范围。 2G:第二代移动通信技术,主要用于语音通信和短信传输,数据传输速度较慢,网络覆盖范围较小。 3…

    other 2023年5月5日
    00
  • Mysql账号管理与引擎相关功能实现流程

    MySQL是一种关系型数据库管理系统,是很多网站和应用程序后台的首选数据库系统之一。MySQL账号管理和引擎相关功能对确保MySQL数据库的安全性有着至关重要的作用。下面,我将详细讲解MySQL账号管理和引擎相关功能的实现流程。 Mysql账号管理 创建新用户 要创建一个新用户,可以使用以下语句: CREATE USER ‘newuser’@’localho…

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