下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

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.