xSemaphoreCreateBinary
[信号量]
semphr. h
SemaphoreHandle_t xSemaphoreCreateBinary( void );
创建一个二进制信号量,并返回一个可以引用该信号量的
句柄。
configSUPPORT_DYNAMIC_ALLOCATION
必须在 FreeRTOSConfig.h 中被设置为 1,或保留未定义状态(此时,它默认
(此时默认为1),才能使用RTOSAPI函数。
每个二进制信号量需要少量RAM,用于保持
信号量的状态。 如果使用 xSemaphoreCreateBinary() 创建二进制信号量
则会从FreeRTOS堆中自动分配所需的RAM 。
如果使用 xSemaphoreCreateBinaryStatic() 创建二进制信号量,
那么RAM由应用程序编写者提供,这需要用到一个附加参数,
但允许在编译时静态分配 RAM
。 请参阅静态分配与
动态分配页面了解更多信息。
信号量是在“空”状态下创建的,这意味着必须先用
xSemaphoreGive() API 函数给出信号量,
然后才能使用 xSemaphoreTake() 函数来获取(获得)该信号量。
二进制信号量和相互锁非常相似,但
仍有一些细微差异: 互斥锁具有优先级继承机制,
但二进制信号量没有。 因此,二进制信号量是
实现同步的更好选择(任务之间或任务与中断之间),
而互斥锁是实现简单互斥的更好选择。
二值信号量并不需要在得到后立即释放,
因此,任务同步可以通过一个任务/中断持续释放信号量
而另外一个持续获得信号量来实现。 相关演示请参阅
xSemaphoreGiveFromISR()文档页面上的代码示例。
请注意,
使用直达任务通知往往可以更有效地实现相同的功能。
如果另一个优先级更高的任务试图获得相同的互斥锁,
那么“获取”互斥锁的任务的优先级就有可能被提高。 拥有互斥锁的任务“继承”了
试图“获取”相同互斥锁任务的优先级, 这意味着必须始终“返回”互斥锁,否则
优先级较高的任务将永远无法获得互斥锁,
而优先级较低的任务将永远无法“取消继承”优先级。 用于实现互斥的互斥锁实例,
请参阅 xSemaphoreTake() 文档页面。
互斥锁和二进制信号量都由 SemaphoreHandle_t 类型的变量引用,同时可以
在任何采用该类型参数的任务级 API 函数中使用。 与互斥锁不同,
二进制信号量可用于中断服务程序。
-
返回值:
-
NULL
|
创建信号量失败,
因为 FreeRTOS堆栈
不足。
|
其它值
|
信号量已成功创建。 返回
值是一个句柄,通过该句柄可以引用信号量。
|
用法示例:
SemaphoreHandle_t xSemaphore;
void vATask( void * pvParameters )
{
/* Attempt to create a semaphore. */
xSemaphore = xSemaphoreCreateBinary();
if( xSemaphore == NULL )
{
/* There was insufficient FreeRTOS heap available for the semaphore to
be created successfully. */
}
else
{
/* The semaphore can now be used. Its handle is stored in the
xSemahore variable. Calling xSemaphoreTake() on the semaphore here
will fail until the semaphore has first been given. */
}
}
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.