xSemaphoreCreateMutexStatic
[信号量]
semphr. h
SemaphoreHandle_t xSemaphoreCreateMutexStatic(
StaticSemaphore_t *pxMutexBuffer );
创建互斥锁 ,并返回
一个该互斥锁可以引用的句柄。 中断服务例程中,
不能使用互斥锁。
configSUPPORT_STATIC_ALLOCATION 和
configUSE_mutexes 必须同时在 FreeRTOSConfig.h 中设置为 1,
xSemaphoreCreateMutexStatic () 才可用。
每个互斥锁需要少量 RAM ,
以此来保持互斥锁的状态。 如果使用 xSemaphoreCreateMutex () 创建互斥锁
则会从 RAM 堆FreeRTOS中自动分配所需的 。
如果使用 xSemaphoreCreateMutexStatic () 创建互斥锁
则 RAM 由应用程序编写器提供,这需要用到一个附加参数,
但允许在编译时静态分配 RAM
。 请参阅静态分配与
动态分配页面了解更多信息。
使用 xSemaphoreTake () 获取互斥锁,并给出互斥锁
使用 xSemaphoreGive() 。
xSemaphoreTakeRecursive() 和 xSemaphoreGiveRecursive() 仅可用于
使用 xSemaphoreCreateResursiveMutex () 创建的互斥体。
互斥锁和二进制信号量极为相似,但
仍有一些细微差异: 互斥锁具有优先级继承机制,
但二进制信号量没有。 因此,二进制信号量是
实现同步的更好选择(任务之间或任务与中断之间),
也是实施简单互斥方面的更好选择。
如果另一个更高优先级的任务尝试获取相同的互斥锁,
则将暂时提高“获取”互斥锁的任务的优先级。 拥有互斥锁的任务
“继承”试图“获取”相同
互斥锁的任务的优先级。 这意味着必须始终“归还”互斥锁,否则
优先级较高的任务将始终无法获得互斥锁,而优先级较低
的始终无法“取消继承”优先级。
用于实现互斥的互斥锁实例,
详见 xSemaphoreTake() 文档页面所示。
一旦获得二进制信号量,则无需要返回
因此,任务同步可以通过一个任务/中断持续释放信号量
而另外一个持续获得信号量来实现。 相关演示请参阅
xSemaphoreGiveFromISR() 文档页面上的示例代码。
请注意,可以使用直接任务通知以更有效的方式
实现相同功能。
对互斥锁和二进制信号量的句柄都分配给
SemaphoreHandle_t 类型的变量,并且可以在任何接受该类型参数的任务级别(与中断
安全相反)API 函数中使用。
-
参数:
-
pxMutexBuffer
|
必须指向 StaticSemaphore_t 类型的变量,
该变量将用于保存互斥锁型信号量的状态。
|
-
返回:
-
|
如果已成功创建互斥锁类型信号量,则返回创建的
互斥锁的句柄。 如果
因为 pxMutexBuffer 是 NULL 而未创建互斥锁,那么返回 NULL。
|
用法示例:
SemaphoreHandle_t xSemaphore = NULL;
StaticSemaphore_t xMutexBuffer;
void vATask( void * pvParameters )
{
/* Create a mutex semaphore without using any dynamic memory
allocation. The mutex's data structures will be saved into
the xMutexBuffer variable. */
xSemaphore = xSemaphoreCreateMutexStatic( &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.