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.