下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

xSemaphoreCreateRecursiveMutex
[信号量]

semphr. h
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
创建一个递归互斥锁 , 并返回一个互斥锁 句柄。 不能在中断服务程序中使用递归互斥锁。 configSUPPORT_DYNAMIC_ALLOCATION 和 configUSE_RECURSIVE_mutexes 都必须在 FreeRTOSConfig.h 中定义为 1, 才能使用 xSemaphoreCreateRecursiveMutex() 函数(configSUPPORT_DYNAMIC_ALOUTION 也可以不定义,此时将默认定义为 1)。

每个递归互斥锁都需要少量RAM用于保持 递归互斥锁的状态。 如果使用 xSemaphoreCreateRecursiveMutex() 创建互斥锁, 则会从 FreeRTOS堆栈中自动分配所需的RAM。 如果一个递归互斥锁是使用 xSemaphoreCreateRecursiveMutexStatic() 创建的, 那么RAM由应用程序编写者提供,这需要用到一个附加参数, 但允许在编译时静态分配 RAM 。 请参阅静态分配与 动态分配页面了解更多信息。

分别使用 xSemaphoreTakeRecursive()来获取(持有), 和 xSemaphoreGiveRecursive() API函数释放。 不得使用 xSemaphoreTake() 和 xSemaphoreGive()。

xSemaphoreCreateMutex()和 xSemaphoreCreateMutexStatic()用于创建非递归互斥锁。 非递归互斥锁只能被一个任务 获取一次, 如果同一个任务想再次获取则会失败, 因为当任务第一次释放互斥锁时,互斥锁就一直 处于释放状态。

与非递归互斥锁相反,递归互斥锁可以被同一个任务获取很多次, 获取多少次就需要释放多少次, 此时才会返回递归互斥锁。

与非递归互斥锁一样,递归互斥锁采用优先级继承 算法。 如果另一个优先级更高的任务试图获得相同的互斥锁, 则将暂时提高“获取”互斥锁的任务的优先级。 拥有互斥锁的任务 “继承”试图“获取”相同 互斥锁的任务的优先级。 这意味着必须始终“归还”互斥锁,否则 优先级较高的任务将始终无法获得互斥锁,而优先级较低 而优先级较低的任务将永远无法“取消继承”优先级。

返回:
如果成功创建了递归互斥锁,那么将返回 创建的互斥锁的句柄。 如果因为保存互斥锁所需内存不能分配 从而没有 创建递归互斥锁, 则返回 NULL。

用法示例:

 SemaphoreHandle_t xMutex;

 void vATask( void * pvParameters )
 {
    Create a recursive mutex.
    xMutex = xSemaphoreCreateRecursiveMutex();

    if( xMutex != NULL )
    {
        /* The recursive mutex was created successfully and
        can now be used. */
    }
 }
 




Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.