xSemaphoreCreateRecursiveMutexStatic
[信号量]
semphr. h
SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic(
StaticSemaphore_t *pxMutexBuffer )
创建一个递归互斥锁 ,
并返回一个互斥锁
句柄。 不能在中断服务程序中使用递归互斥锁。
configUSE_RECURSIVE_MUTEXES 和 configSUPPORT_STATIC_ALLOCATION
都必须在 FreeRTOSConfig.h 中设置为 1,
xSemaphoreCreateRecursiveMutexStatic() 才可用。
每个递归互斥锁都需要少量 RAM
递归互斥锁的状态。 如果使用 xSemaphoreCreateRecursiveMutex() 创建互斥锁,
则会从 FreeRTOS堆栈中自动分配所需的RAM。
如果一个递归互斥锁是使用 xSemaphoreCreateRecursiveMutexStatic() 创建的,
那么RAM由应用程序编写者提供,这需要用到一个附加参数,
但允许在编译时静态分配 RAM
。 请参阅静态分配与
动态分配页面了解更多信息。
分别使用
xSemaphoreTakeRecursive()来获取(持有),
和
xSemaphoreGiveRecursive() API函数释放。
不得使用 xSemaphoreTake() 和 xSemaphoreGive()。
xSemaphoreCreateMutex()和
xSemaphoreCreateMutexStatic()用于创建非递归互斥锁。 非递归互斥锁只能被一个任务
获取一次, 如果同一个任务想再次获取则会失败,
因为当任务第一次释放互斥锁时,互斥锁就一直
处于释放状态。
与非递归互斥锁相反,递归互斥锁可以被同一个任务获取很多次,
获取多少次就需要释放多少次,
此时才会返回递归互斥锁。
与非递归互斥锁一样,递归互斥锁采用优先级继承
算法。 如果另一个优先级更高的任务试图获得相同的互斥锁,
则将暂时提高“获取”互斥锁的任务的优先级。 拥有互斥锁的任务
“继承”试图“获取”相同
互斥锁的任务的优先级。 这意味着必须始终“归还”互斥锁,否则
优先级较高的任务将始终无法获得互斥锁,而优先级较低
的始终无法“取消继承”优先级。
-
参数:
-
pxMutexBuffer
|
必须指向 StaticSemaphore_t 类型的变量,
该变量将用于保存互斥锁型信号量的状态。
|
-
返回:
-
|
如果已成功创建递归互斥锁,则返回创建的
创建的互斥锁的句柄。 如果由于
pxMutexBuffer 为 NULL 而导致 递归互斥锁未创建,则返回 NULL。
|
用法示例:
SemaphoreHandle_t xSemaphore = NULL;
StaticSemaphore_t xMutexBuffer;
void vATask( void * pvParameters )
{
/* Create a recursivemutex semaphore without using any dynamic
memory allocation. The mutex's data structures will be saved into
the xMutexBuffer variable. */
xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
/* The pxMutexBuffer was not NULL, so it is expected that the
handle will not be NULL. */
configASSERT( xSemaphore );
/* Rest of the task code goes here. */
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.