vSemaphoreCreateBinary
[信号量]
semphr. h vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
注意:vSemaphoreCreateBinary() 宏保留在源代码中,
以确保后向兼容,但不应在新设计中使用。 新设计中应使用
xSemaphoreCreateBinary() 函数。
此外,在许多情况下,使用
直达任务通知
代替二进制信号量速度更快,更节省内存。
使用现有队列机制创建信号量的宏。队列长度为 1 ,因为这是二进制信号量。数据大小为 0 ,因为实际上我们并不会存储任何数据,只想知道队列为空还是满。
二进制信号量和互斥锁非常相似,但有一些小差异: 互斥锁包含优先继承机制,
而二进制信号量不包含。 因此,二进制信号量更适合(在任务间或任务与中断之间)实现同步,
而互斥锁更适合实现简单
互斥。
一旦获得二进制信号量,则无需返回,
因此任务同步可以通过一个任务/中断连续“提供”信号量,
而另一个任务/中断连续“获取”信号量来实现。 可以通过
xSemaphoreGiveFromISR() 文档页面上的示例代码来演示。
如果另一个优先级更高的任务尝试获取相同的互斥锁,
那么“获取”互斥锁的任务的优先级就有可能被提高。 拥有互斥锁的任务“继承”了
试图“获取”相同互斥锁任务的优先级, 这意味着必须始终“返回”互斥锁,否则
优先级较高的任务将永远无法获得互斥锁,
而优先级较低的任务将永远无法“取消继承”优先级。 用于实现互斥的互斥锁实例,
详见 xSemaphoreTake() 文档页面。
互斥锁和二进制信号量都分配给了 SemaphoreHandle_t 类型的变量,
可在任何采用此类型参数的 API 函数中使用。
- 参数:
-
xSemaphore | 已创建信号量的句柄,应为 SemaphoreHandle_t 类型。 |
用法示例:
SemaphoreHandle_t xSemaphore;
void vATask( void * pvParameters )
{
// Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
// This is a macro so pass the variable in directly.
vSemaphoreCreateBinary( xSemaphore );
if( xSemaphore != NULL )
{
// The semaphore was created successfully.
// The semaphore can now be used.
}
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|