下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

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.