下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

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.