freertos中二值信号量和互斥量
时间: 2023-10-20 13:05:45 浏览: 183
【freertos】011-信号量、互斥量及优先级继承机制源码分析.doc
在 FreeRTOS 中,二值信号量和互斥量是两种常用的同步机制。
1. 二值信号量(Binary Semaphore):
二值信号量是一种同步机制,它只有两个状态:0 和 1。当一个任务获取到二值信号量时,将其状态设置为 1,其他任务试图获取该信号量时将被阻塞,直到之前的任务释放该信号量并将其状态重新设置为 0。
在 FreeRTOS 中,可以使用 `xSemaphoreCreateBinary()` 函数创建一个二值信号量,并使用 `xSemaphoreTake()` 和 `xSemaphoreGive()` 函数来获取和释放该信号量。头文件为 `semphr.h`。
2. 互斥量(Mutex):
互斥量是一种用于资源保护的同步机制。它可以确保在同一时间只有一个任务能够访问被保护资源。当一个任务获取到互斥量时,其他试图获取该互斥量的任务将被阻塞,直到持有互斥量的任务释放它。
在 FreeRTOS 中,可以使用 `xSemaphoreCreateMutex()` 函数创建一个互斥量,并使用 `xSemaphoreTake()` 和 `xSemaphoreGive()` 函数来获取和释放该互斥量。头文件为 `semphr.h`。
以下是一个简单的示例代码,演示了如何使用二值信号量和互斥量:
```cpp
#include <FreeRTOS.h>
#include <task.h>
#include <semphr.h>
// 二值信号量
SemaphoreHandle_t binarySemaphore;
// 互斥量
SemaphoreHandle_t mutex;
// 任务1
void task1(void *pvParameters)
{
while (1)
{
// 获取二值信号量
xSemaphoreTake(binarySemaphore, portMAX_DELAY);
// 执行任务1操作
// 释放二值信号量
xSemaphoreGive(binarySemaphore);
// 延时或进行其他操作
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
// 任务2
void task2(void *pvParameters)
{
while (1)
{
// 获取互斥量
xSemaphoreTake(mutex, portMAX_DELAY);
// 执行任务2操作
// 释放互斥量
xSemaphoreGive(mutex);
// 延时或进行其他操作
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main()
{
// 创建二值信号量
binarySemaphore = xSemaphoreCreateBinary();
// 创建互斥量
mutex = xSemaphoreCreateMutex();
// 创建任务1
xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
// 创建任务2
xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
// 启动 FreeRTOS 调度器
vTaskStartScheduler();
while (1)
{
// 主循环中可以进行其他操作或者延时
// ...
}
return 0;
}
```
在上述示例中,示范了如何使用二值信号量和互斥量来实现任务间的同步和资源保护。你可以根据需求在任务中适当地获取和释放这些同步机制。
希望这个示例对你有所帮助!如果你有更多问题,请随时提问。
阅读全文