freertos 信号量通知机制
时间: 2025-01-03 18:40:58 浏览: 10
### FreeRTOS 中信号量的通知机制
#### 工作原理
FreeRTOS 提供了几种类型的信号量,每一种都有其特定的应用场景。对于通知机制而言,通常涉及的是二值信号量和事件组。当一个任务需要等待另一个任务完成某个条件时,可以使用这些信号量来进行同步。
- **二值信号量**:这种信号量只有两种状态——可用或不可用。它非常适合用来作为简单的通知工具,在一个任务释放信号量之后,其他正在阻塞的任务会立即被唤醒并继续执行[^1]。
- **事件组**:这是一种更高级别的同步原语,允许多个位来表示不同的事件组合情况。通过这种方式可以在单次调用中等待多种可能发生的事件之一或全部发生后再采取行动[^2]。
#### 使用方法
为了利用 FreeRTOS 的信号量进行进程间通信或同步操作,开发者应该遵循如下流程:
1. 创建所需类型的信号量对象;
2. 在适当位置给予(Give)该信号量以触发某些行为的发生;
3. 另一端的任务则尝试获取(Take)此信号量直到成功为止;此时意味着接收到相应消息/完成了预期动作。
下面是一个基于 ESP-IDF 平台下使用 `xSemaphoreCreateBinary()` 和 `xSemaphoreGiveFromISR()` 函数创建与发送中断级别的二值信号量的例子。
```c
// 定义全局变量存储信号量句柄
SemaphoreHandle_t xBinarySemaphore;
void setup() {
// 初始化硬件...
// 创建一个二值信号量
xBinarySemaphore = xSemaphoreCreateBinary();
}
void loop() {
if (digitalRead(buttonPin) == HIGH) { // 假设 buttonPin 是按钮连接到的 GPIO 引脚编号
// 给予信号量给其它任务, 这里假设是从 ISR 调用
BaseType_t xHigherPriorityTaskWoken;
xSemaphoreGiveFromISR(xBinarySemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 如果有更高优先级的任务被唤醒,则在此处切换上下文
}
}
```
在这个例子中,每当检测到按键按下时就会向系统发出一次脉冲式的“通知”,而接收方可以通过不断尝试取得这个信号量的方式得知是否有新的输入到来。
阅读全文