FreeRTOS的信号量是一种多任务同步机制,用于在不同任务之间共享资源或控制流程。信号量是一个计数器,用于跟踪可用资源的数量。任务可以通过请求或释放信号量来获取或释放资源。

FreeRTOS提供了两种类型的信号量:二进制信号量和计数信号量。

二进制信号量只有两个状态:可用和不可用。它们通常用于排他性访问共享资源。

计数信号量则可以跟踪多个资源的数量。它们通常用于限制对某些资源的访问,并且可以用于实现生产者-消费者模式。

使用FreeRTOS信号量非常简单。首先,在任务创建时创建信号量,然后可以使用xSemaphoreGive()和xSemaphoreTake()函数请求和释放信号量。

下面是一个使用二进制信号量的示例代码:

// 创建信号量
SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();

void vTask1( void *pvParameters )
{
    // 请求信号量
    xSemaphoreTake( xSemaphore, portMAX_DELAY );

    // 执行任务

    // 释放信号量
    xSemaphoreGive( xSemaphore );

    vTaskDelete(NULL);
}

void vTask2( void *pvParameters )
{
    // 请求信号量
    xSemaphoreTake( xSemaphore, portMAX_DELAY );

    // 执行任务

    // 释放信号量
    xSemaphoreGive( xSemaphore );

    vTaskDelete(NULL);
}

int main( void )
{
    // 创建任务
    xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, NULL);
    xTaskCreate(vTask2, "Task 2", 1000, NULL, 1, NULL);

    // 启动调度器
    vTaskStartScheduler();

    return 0;
}

在这个例子中,vTask1和vTask2任务都需要互斥地访问共享资源,因此我们创建了一个二进制信号量xSemaphore,并在每个任务中使用xSemaphoreTake()和xSemaphoreGive()函数请求和释放信号量。