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()函数请求和释放信号量。