xSemaphoreCreateMutex
[信号量]
semphr. h
SemaphoreHandle_t xSemaphoreCreateMutex( void )
创建互斥锁 ,并返回
一个该互斥锁可以引用的句柄。 中断服务例程中,
不能使用互斥锁。
configSUPPORT_DYNAMIC_ALLOCATION 和
configUSE_MUTEXES 必须同时在 FreeRTOSConfig.h 中设置为 1,
方能确保 xSemaphoreCreateMutex() 可用。(可不定义 configSUPPORT_DYNAMIC_ALOGRATION,
在这种情况下,它将默认为 1。)
每个互斥锁需要少量 RAM ,
以此来保持互斥锁的状态。 如果使用 xSemaphoreCreateMutex () 创建互斥锁
则会从 FreeRTOS 堆中自动分配所需的 RAM。
如果使用 xSemaphoreCreateMutexStatic() 创建互斥锁,
那么应由应用程序编写人员提供 RAM,
但允许在编译时静态分配 RAM
。 请参阅静态分配与
动态分配页面了解更多信息。
使用 xSemaphoreTake () 获取互斥锁,并给出互斥锁
使用 xSemaphoreGive() 。
xSemaphoreTakeRecursive() 和 xSemaphoreGiveRecursive() 仅可用于
使用 xSemaphoreCreateRecursiveMutex () 创建的互斥锁。
互斥锁和二进制信号量极为相似,但
仍有一些细微差异: 互斥锁具有优先级继承机制,
但二进制信号量没有。 因此,二进制信号量是
实现同步的更好选择(任务之间或任务与中断之间),
也是实施简单互斥方面的更好选择。
如果另一个更高优先级的任务尝试获取相同的互斥锁,
则将暂时提高“获取”互斥锁的任务的优先级。 拥有互斥锁的任务
“继承”试图“获取”相同
互斥锁的任务的优先级。 这意味着必须始终“归还”互斥锁,否则
优先级较高的任务将始终无法获得互斥锁,而优先级较低
的始终无法“取消继承”优先级。
用于实现互斥的互斥锁实例,
详见 xSemaphoreTake() 文档页面所示。
一旦获得二进制信号量,则无需要返回
因此,任务同步可以通过一个任务/中断持续释放信号量
而另外一个持续获得信号量来实现。 相关演示请参阅
xSemaphoreGiveFromISR() 文档页面上的示例代码。
请注意,可以使用直接任务通知以更有效的方式
实现相同功能。
对互斥锁和二进制信号量的句柄都分配给
SemaphoreHandle_t 类型的变量,并且可以在任何接受该类型参数的任务级别(与中断
安全相反)API 函数中使用。
-
返回:
-
|
如果已成功创建互斥锁类型信号量,则返回创建的
互斥锁的句柄。 如果
由于
创建递归互斥锁,
则返回 NULL。
|
用法示例:
SemaphoreHandle_t xSemaphore;
void vATask( void * pvParameters )
{
/* Create a mutex type semaphore. */
xSemaphore = xSemaphoreCreateMutex();
if( xSemaphore != NULL )
{
/* The semaphore was created successfully and
can be used. */
}
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.