|
@@ -6,7 +6,6 @@ author: "尚硅谷研究院"
|
|
|
date: 2026-07-17
|
|
date: 2026-07-17
|
|
|
created: 2026-07-17
|
|
created: 2026-07-17
|
|
|
---
|
|
---
|
|
|
-
|
|
|
|
|
# 任务通知
|
|
# 任务通知
|
|
|
|
|
|
|
|
> **用生活理解**:任务通知就像同事直接走到你工位前告诉你一件事,不需要通过公司广播(队列)、公告栏(信号量)或旗语系统(事件标志组)。直接、高效,但因为是一对一,没法同时通知所有人。
|
|
> **用生活理解**:任务通知就像同事直接走到你工位前告诉你一件事,不需要通过公司广播(队列)、公告栏(信号量)或旗语系统(事件标志组)。直接、高效,但因为是一对一,没法同时通知所有人。
|
|
@@ -18,115 +17,131 @@ created: 2026-07-17
|
|
|
任务通知(Task Notification)是 FreeRTOS V8.2.0 引入的轻量级任务间通信机制。每个 TCB 中内置了一个 **32 位通知值**和 **8 位通知状态**,无需创建额外的内核对象。
|
|
任务通知(Task Notification)是 FreeRTOS V8.2.0 引入的轻量级任务间通信机制。每个 TCB 中内置了一个 **32 位通知值**和 **8 位通知状态**,无需创建额外的内核对象。
|
|
|
|
|
|
|
|
- **无需中间对象**:发送任务直接向目标任务发通知
|
|
- **无需中间对象**:发送任务直接向目标任务发通知
|
|
|
-- **约 45% 更快**:比队列/信号量省去了创建和操作中间对象的时间
|
|
|
|
|
|
|
+- **更快**:比队列/信号量省去了创建和操作中间对象的时间
|
|
|
- **一对一**:每个任务只有一个通知值,不能一对多广播
|
|
- **一对一**:每个任务只有一个通知值,不能一对多广播
|
|
|
|
|
|
|
|
### 工作原理
|
|
### 工作原理
|
|
|
|
|
|
|
|
任务通知支持 3 种使用模式:
|
|
任务通知支持 3 种使用模式:
|
|
|
|
|
|
|
|
-| 模式 | 发送函数 | 接收函数 | 行为 |
|
|
|
|
|
-|------|---------|---------|------|
|
|
|
|
|
-| **信号量模式** | `xTaskNotifyGive()` | `ulTaskNotifyTake()` | 通知值递增/递减,模拟二值/计数信号量 |
|
|
|
|
|
-| **消息邮箱模式** | `xTaskNotify(handle, value, eSetValueWithOverwrite)` | `xTaskNotifyWait()` | 直接覆盖通知值,模拟消息邮箱 |
|
|
|
|
|
-| **事件标志组模式** | `xTaskNotify(handle, bits, eSetBits)` | `xTaskNotifyWait()` | 按位 OR,模拟事件标志组 |
|
|
|
|
|
|
|
+| 模式 | 发送函数 | 接收函数 | 行为 |
|
|
|
|
|
+| ------------------------ | ------------------------------------------------------ | ---------------------- | ------------------------------------ |
|
|
|
|
|
+| **信号量模式** | `xTaskNotifyGive()` | `ulTaskNotifyTake()` | 通知值递增/递减,模拟二值/计数信号量 |
|
|
|
|
|
+| **消息邮箱模式** | `xTaskNotify(handle, value, eSetValueWithOverwrite)` | `xTaskNotifyWait()` | 直接覆盖通知值,模拟消息邮箱 |
|
|
|
|
|
+| **事件标志组模式** | `xTaskNotify(handle, bits, eSetBits)` | `xTaskNotifyWait()` | 按位 OR,模拟事件标志组 |
|
|
|
|
|
|
|
|
### 核心API
|
|
### 核心API
|
|
|
|
|
|
|
|
-| 函数 | 参数 | 功能简述 |
|
|
|
|
|
-|----------|--------|-------------|
|
|
|
|
|
-| `xTaskNotifyGive()` | `xTaskToNotify` | 发送通知(信号量模式),通知值 +1 |
|
|
|
|
|
-| `ulTaskNotifyTake()` | `xClearCountOnExit`, `xTicksToWait` | 接收通知(信号量模式),返回通知值 |
|
|
|
|
|
-| `xTaskNotify()` | `xTaskToNotify`, `ulValue`, `eAction` | 发送通知(带值),eAction 控制写/OR/覆写行为 |
|
|
|
|
|
-| `xTaskNotifyWait()` | `ulBitsToClearOnEntry`, `ulBitsToClearOnExit`, `pulNotificationValue`, `xTicksToWait` | 接收通知(带值),可获取通知值和清除指定位 |
|
|
|
|
|
-| `xTaskNotifyFromISR()` | 同上+ISR 版本 | 中断中发送通知 |
|
|
|
|
|
-| `vTaskNotifyGiveFromISR()` | `xTaskToNotify`, `pxHigherPriorityTaskWoken` | 中断中发送(信号量模式) |
|
|
|
|
|
|
|
+| 函数 | 参数 | 功能简述 |
|
|
|
|
|
+| ---------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------- |
|
|
|
|
|
+| `xTaskNotifyGive()` | `xTaskToNotify` | 发送通知(信号量模式),通知值 +1 |
|
|
|
|
|
+| `ulTaskNotifyTake()` | `xClearCountOnExit`, `xTicksToWait` | 接收通知(信号量模式),返回通知值 |
|
|
|
|
|
+| `xTaskNotify()` | `xTaskToNotify`, `ulValue`, `eAction` | 发送通知(带值),eAction 控制写/OR/覆写行为 |
|
|
|
|
|
+| `xTaskNotifyWait()` | `ulBitsToClearOnEntry`, `ulBitsToClearOnExit`, `pulNotificationValue`, `xTicksToWait` | 接收通知(带值),可获取通知值和清除指定位 |
|
|
|
|
|
+| `xTaskNotifyFromISR()` | 同上+ISR 版本 | 中断中发送通知 |
|
|
|
|
|
+| `vTaskNotifyGiveFromISR()` | `xTaskToNotify`, `pxHigherPriorityTaskWoken` | 中断中发送(信号量模式) |
|
|
|
|
|
|
|
|
## 实验
|
|
## 实验
|
|
|
|
|
|
|
|
|
|
+> 以下实验代码均提取自配套 Keil 项目的 `freertos_demo.c`,仅展示核心任务函数。
|
|
|
|
|
+
|
|
|
### 实验1:任务通知模拟信号量 (P16)
|
|
### 实验1:任务通知模拟信号量 (P16)
|
|
|
|
|
|
|
|
-**需求**:KEY1 → `xTaskNotifyGive(task2)`,task2 通过 `ulTaskNotifyTake()` 接收。
|
|
|
|
|
|
|
+**需求**:KEY1 → `xTaskNotifyGive(task2_handle)` 通知 task2,task2 通过 `ulTaskNotifyTake()` 阻塞等待通知。
|
|
|
|
|
|
|
|
-**代码来源:**03_代码/16_任务通知模拟信号量/Core/Src/freertos_demo.c**
|
|
|
|
|
|
|
+**代码来源:**`03_代码/16_任务通知模拟信号量/Core/Src/freertos_demo.c`
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-/* task1:KEY1按下,发送任务通知(信号量模式) */
|
|
|
|
|
-void Task1(void *pvParameters)
|
|
|
|
|
|
|
+/* task1:KEY1按下,向task2发送任务通知(信号量模式:通知值+1) */
|
|
|
|
|
+void task1(void *pvParameters)
|
|
|
{
|
|
{
|
|
|
uint8_t key = 0;
|
|
uint8_t key = 0;
|
|
|
-
|
|
|
|
|
- while (1) {
|
|
|
|
|
|
|
+ BaseType_t res = 0;
|
|
|
|
|
+ while (1)
|
|
|
|
|
+ {
|
|
|
key = Key_Detect();
|
|
key = Key_Detect();
|
|
|
- if (key == KEY1_PRESS) {
|
|
|
|
|
- printf("任务通知模拟二值信号量释放\r\n");
|
|
|
|
|
- /* 向task2发送任务通知,通知值+1 */
|
|
|
|
|
- xTaskNotifyGive(task2_handler);
|
|
|
|
|
|
|
+ if (key == KEY1_PRESS)
|
|
|
|
|
+ {
|
|
|
|
|
+ /* 向task2发送通知,通知值计数+1 */
|
|
|
|
|
+ res = xTaskNotifyGive(task2_handle);
|
|
|
|
|
+ if (res == pdPASS)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("task1向task2发送任务通知成功!\r\n");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- vTaskDelay(10);
|
|
|
|
|
|
|
+ vTaskDelay(500);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* task2:接收任务通知(信号量模式) */
|
|
|
|
|
-void Task2(void *pvParameters)
|
|
|
|
|
|
|
+/* task2:阻塞等待任务通知 */
|
|
|
|
|
+void task2(void *pvParameters)
|
|
|
{
|
|
{
|
|
|
- uint32_t rev = 0;
|
|
|
|
|
|
|
+ uint32_t notify_value = 0;
|
|
|
|
|
+ while (1)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("task2等待...\r\n");
|
|
|
|
|
|
|
|
- while (1) {
|
|
|
|
|
- /* 等待任务通知,pdTRUE表示退出时清零通知值 */
|
|
|
|
|
- rev = ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
|
|
|
|
- if (rev != 0) {
|
|
|
|
|
- printf("接收任务通知成功,模拟获取二值信号量\r\n");
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /* pdFALSE = 收到通知后通知值减1(适合计数信号量)
|
|
|
|
|
+ pdTRUE = 收到通知后通知值清零(适合二值信号量) */
|
|
|
|
|
+ notify_value = ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
|
|
|
|
|
+
|
|
|
|
|
+ printf("Task2收到通知值=%d\r\n", notify_value);
|
|
|
|
|
+ vTaskDelay(5000); /* 模拟长时间工作,期间task1的通知累积 */
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
### 实验2:任务通知模拟消息邮箱 (P17)
|
|
### 实验2:任务通知模拟消息邮箱 (P17)
|
|
|
|
|
|
|
|
-**需求**:KEY1/KEY2 → `xTaskNotify(task2, key, eSetValueWithOverwrite)`,task2 通过 `xTaskNotifyWait()` 接收并处理。
|
|
|
|
|
|
|
+**需求**:KEY1/KEY2 → `xTaskNotify(task2_handle, key, eSetValueWithOverwrite)` 覆写通知值,task2 接收后打印。
|
|
|
|
|
|
|
|
-**代码来源:**03_代码/17_任务通知模拟消息队列/Core/Src/freertos_demo.c
|
|
|
|
|
|
|
+**代码来源:**`03_代码/17_任务通知模拟消息队列/Core/Src/freertos_demo.c`
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
-/* task1:扫描按键,通过任务通知发送键值 */
|
|
|
|
|
-void Task1(void *pvParameters)
|
|
|
|
|
|
|
+/* task1:扫描按键,通过任务通知将键值发送给task2 */
|
|
|
|
|
+void task1(void *pvParameters)
|
|
|
{
|
|
{
|
|
|
uint8_t key = 0;
|
|
uint8_t key = 0;
|
|
|
-
|
|
|
|
|
- while (1) {
|
|
|
|
|
|
|
+ BaseType_t res = 0;
|
|
|
|
|
+ while (1)
|
|
|
|
|
+ {
|
|
|
key = Key_Detect();
|
|
key = Key_Detect();
|
|
|
- if ((key != 0) && (task2_handler != NULL)) {
|
|
|
|
|
- printf("任务通知模拟消息邮箱发送,发送的键值为:%d\r\n", key);
|
|
|
|
|
|
|
+ if (key == KEY1_PRESS || key == KEY2_PRESS)
|
|
|
|
|
+ {
|
|
|
/* 直接覆写task2的通知值(消息邮箱模式) */
|
|
/* 直接覆写task2的通知值(消息邮箱模式) */
|
|
|
- xTaskNotify(task2_handler, key, eSetValueWithOverwrite);
|
|
|
|
|
|
|
+ res = xTaskNotify(
|
|
|
|
|
+ task2_handle,
|
|
|
|
|
+ key, // 要发送的值(按键编号)
|
|
|
|
|
+ eSetValueWithOverwrite // 无条件覆写通知值
|
|
|
|
|
+ );
|
|
|
|
|
+ if (res == pdPASS)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("task1向task2发送通知值[%d]成功...\r\n", key);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- vTaskDelay(10);
|
|
|
|
|
|
|
+ vTaskDelay(500);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* task2:接收通知值,根据键值做不同动作 */
|
|
|
|
|
-void Task2(void *pvParameters)
|
|
|
|
|
|
|
+/* task2:接收通知值并打印 */
|
|
|
|
|
+void task2(void *pvParameters)
|
|
|
{
|
|
{
|
|
|
- uint32_t notify_val = 0;
|
|
|
|
|
-
|
|
|
|
|
- while (1) {
|
|
|
|
|
- /* 等待任务通知,参数:入口不清零,出口全清零 */
|
|
|
|
|
- xTaskNotifyWait(0, 0xFFFFFFFF, ¬ify_val, portMAX_DELAY);
|
|
|
|
|
-
|
|
|
|
|
- switch (notify_val) {
|
|
|
|
|
- case KEY1_PRESS: {
|
|
|
|
|
- printf("接收到的通知值为:%d\r\n", notify_val);
|
|
|
|
|
- LED_Toggle(LED1_Pin);
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
- case KEY2_PRESS: {
|
|
|
|
|
- printf("接收到的通知值为:%d\r\n", notify_val);
|
|
|
|
|
- LED_Toggle(LED2_Pin);
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
- default:
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ uint32_t notify_value = 0;
|
|
|
|
|
+ BaseType_t res = 0;
|
|
|
|
|
+ while (1)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("task2等待...\r\n");
|
|
|
|
|
+
|
|
|
|
|
+ /* 入口不清零(0x00000000),出口全清零(0xffffffff) */
|
|
|
|
|
+ res = xTaskNotifyWait(
|
|
|
|
|
+ 0x00000000, // 进入时不清除任何位
|
|
|
|
|
+ 0xffffffff, // 退出时清除所有位(通知值归零)
|
|
|
|
|
+ ¬ify_value, // 保存接收到的通知值
|
|
|
|
|
+ portMAX_DELAY);
|
|
|
|
|
+
|
|
|
|
|
+ if (res == pdTRUE)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("Task2收到通知值=%d\r\n", notify_value);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -134,53 +149,70 @@ void Task2(void *pvParameters)
|
|
|
|
|
|
|
|
### 实验3:任务通知模拟事件标志组 (P18)
|
|
### 实验3:任务通知模拟事件标志组 (P18)
|
|
|
|
|
|
|
|
-**需求**:KEY1 → 置 EVENTBIT_0,KEY2 → 置 EVENTBIT_1,task2 等待两个位都置位。
|
|
|
|
|
|
|
+**需求**:KEY1 → 通知值 bit0 置 1,KEY2 → 通知值 bit1 置 1,task2 累加检查。
|
|
|
|
|
|
|
|
-**代码来源:**03_代码/18_任务通知模拟事件标志组/Core/Src/freertos_demo.c**
|
|
|
|
|
|
|
+**代码来源:**`03_代码/18_任务通知模拟事件标志组/Core/Src/freertos_demo.c`
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
#define EVENTBIT_0 (1 << 0)
|
|
#define EVENTBIT_0 (1 << 0)
|
|
|
#define EVENTBIT_1 (1 << 1)
|
|
#define EVENTBIT_1 (1 << 1)
|
|
|
|
|
|
|
|
-/* task1:KEY1 -> 设置EVENTBIT_0,KEY2 -> 设置EVENTBIT_1 */
|
|
|
|
|
-void Task1(void *pvParameters)
|
|
|
|
|
|
|
+/* task1:KEY1 -> 置bit0,KEY2 -> 置bit1 */
|
|
|
|
|
+void task1(void *pvParameters)
|
|
|
{
|
|
{
|
|
|
uint8_t key = 0;
|
|
uint8_t key = 0;
|
|
|
-
|
|
|
|
|
- while (1) {
|
|
|
|
|
|
|
+ BaseType_t res = 0;
|
|
|
|
|
+ while (1)
|
|
|
|
|
+ {
|
|
|
key = Key_Detect();
|
|
key = Key_Detect();
|
|
|
- if (key == KEY1_PRESS) {
|
|
|
|
|
- printf("将bit0位置1\r\n");
|
|
|
|
|
- /* 使用eSetBits模式,按位OR设置通知值 */
|
|
|
|
|
- xTaskNotify(task2_handler, EVENTBIT_0, eSetBits);
|
|
|
|
|
- } else if (key == KEY2_PRESS) {
|
|
|
|
|
- printf("将bit1位置1\r\n");
|
|
|
|
|
- xTaskNotify(task2_handler, EVENTBIT_1, eSetBits);
|
|
|
|
|
|
|
+ if (key == KEY1_PRESS)
|
|
|
|
|
+ {
|
|
|
|
|
+ /* 使用eSetBits模式,按位OR将bit0置1 */
|
|
|
|
|
+ res = xTaskNotify(task2_handle, EVENTBIT_0, eSetBits);
|
|
|
|
|
+ if (res == pdPASS) printf("KEY1按下将bit0置1..\r\n");
|
|
|
}
|
|
}
|
|
|
- vTaskDelay(10);
|
|
|
|
|
|
|
+ else if (key == KEY2_PRESS)
|
|
|
|
|
+ {
|
|
|
|
|
+ res = xTaskNotify(task2_handle, EVENTBIT_1, eSetBits);
|
|
|
|
|
+ if (res == pdPASS) printf("KEY2按下将bit1置1..\r\n");
|
|
|
|
|
+ }
|
|
|
|
|
+ vTaskDelay(500);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* task2:等待bit0和bit1都置位 */
|
|
|
|
|
-void Task2(void *pvParameters)
|
|
|
|
|
|
|
+/* task2:累加收到的位,两个位都收到后打印信号 */
|
|
|
|
|
+void task2(void *pvParameters)
|
|
|
{
|
|
{
|
|
|
- uint32_t notify_val = 0, event_bit = 0;
|
|
|
|
|
-
|
|
|
|
|
- while (1) {
|
|
|
|
|
- /* 等待任务通知 */
|
|
|
|
|
- xTaskNotifyWait(0, 0xFFFFFFFF, ¬ify_val, portMAX_DELAY);
|
|
|
|
|
-
|
|
|
|
|
- if (notify_val & EVENTBIT_0) {
|
|
|
|
|
- event_bit |= EVENTBIT_0;
|
|
|
|
|
|
|
+ uint32_t notify_value = 0;
|
|
|
|
|
+ uint32_t expect_value = 0; /* 累加累计收到的位 */
|
|
|
|
|
+ BaseType_t res = 0;
|
|
|
|
|
+ while (1)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("task2等待...\r\n");
|
|
|
|
|
+
|
|
|
|
|
+ res = xTaskNotifyWait(
|
|
|
|
|
+ 0x00000000, // 进入时不清除
|
|
|
|
|
+ 0xffffffff, // 退出时清除所有位
|
|
|
|
|
+ ¬ify_value,
|
|
|
|
|
+ portMAX_DELAY);
|
|
|
|
|
+
|
|
|
|
|
+ if (notify_value & EVENTBIT_0)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("接收到bit0=1\r\n");
|
|
|
|
|
+ expect_value |= EVENTBIT_0;
|
|
|
}
|
|
}
|
|
|
- if (notify_val & EVENTBIT_1) {
|
|
|
|
|
- event_bit |= EVENTBIT_1;
|
|
|
|
|
|
|
+ if (notify_value & EVENTBIT_1)
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("接收到bit1=1\r\n");
|
|
|
|
|
+ expect_value |= EVENTBIT_1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (event_bit == (EVENTBIT_0 | EVENTBIT_1)) {
|
|
|
|
|
- printf("任务通知模拟事件标志组接收成功\r\n");
|
|
|
|
|
- event_bit = 0; /* 手动清除 */
|
|
|
|
|
|
|
+ /* 两个位都已收到则输出 */
|
|
|
|
|
+ if (expect_value == (EVENTBIT_0 | EVENTBIT_1))
|
|
|
|
|
+ {
|
|
|
|
|
+ printf("两个事件均已收到 expect_value=%d\r\n", expect_value);
|
|
|
}
|
|
}
|
|
|
|
|
+ vTaskDelay(500);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
@@ -189,23 +221,24 @@ void Task2(void *pvParameters)
|
|
|
|
|
|
|
|
```c
|
|
```c
|
|
|
/* FreeRTOSConfig.h */
|
|
/* FreeRTOSConfig.h */
|
|
|
-#define configUSE_TASK_NOTIFICATIONS 1 /* 使能任务通知(默认已使能) */
|
|
|
|
|
-#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 通知数组大小,默认1 */
|
|
|
|
|
|
|
+#define configUSE_TASK_NOTIFICATIONS 1 /* 使能任务通知(默认已使能) */
|
|
|
|
|
+#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 /* 通知数组大小,v10.4起支持多通知 */
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
## 核心函数速查表
|
|
## 核心函数速查表
|
|
|
|
|
|
|
|
-| 函数 | 参数 | 返回值 | 功能简述 |
|
|
|
|
|
-|----------|-----------|--------|-------------|
|
|
|
|
|
-| `BaseType_t xTaskNotifyGive(xTaskToNotify)` | 目标任务句柄 | pdPASS/pdFAIL | 发送通知(信号量模式,通知值+1) |
|
|
|
|
|
-| `uint32_t ulTaskNotifyTake(xClearCountOnExit, xTicksToWait)` | 退出时清零?, 超时 | 通知值 | 接收通知(信号量模式,阻塞) |
|
|
|
|
|
-| `BaseType_t xTaskNotify(xTaskToNotify, ulValue, eAction)` | 目标任务, 值, 动作(覆写/OR/增量等) | pdPASS/pdFAIL | 发送通知(带值) |
|
|
|
|
|
-| `BaseType_t xTaskNotifyWait(ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait)` | 入口清除, 出口清除, 值指针, 超时 | pdPASS/pdFAIL | 接收通知(阻塞等待) |
|
|
|
|
|
-| `BaseType_t xTaskNotifyFromISR(xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken)` | 同 xTaskNotify+唤醒标记 | pdPASS/pdFAIL | ISR中发送通知 |
|
|
|
|
|
-| `void vTaskNotifyGiveFromISR(xTaskToNotify, pxHigherPriorityTaskWoken)` | 目标任务, 唤醒标记 | 无 | ISR中信号量模式发送 |
|
|
|
|
|
-| `BaseType_t xTaskNotifyAndQuery(xTaskToNotify, ulValue, eAction, pulPreviousValue)` | 同 xTaskNotify+原值 | pdPASS/pdFAIL | 发送并获取原通知值 |
|
|
|
|
|
|
|
+| 函数 | 参数 | 返回值 | 功能简述 |
|
|
|
|
|
+| ------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------- | -------------------------------- |
|
|
|
|
|
+| `BaseType_t xTaskNotifyGive(xTaskToNotify)` | 目标任务句柄 | pdPASS/pdFAIL | 发送通知(信号量模式,通知值+1) |
|
|
|
|
|
+| `uint32_t ulTaskNotifyTake(xClearCountOnExit, xTicksToWait)` | 退出时清零?, 超时 | 通知值 | 接收通知(信号量模式,阻塞) |
|
|
|
|
|
+| `BaseType_t xTaskNotify(xTaskToNotify, ulValue, eAction)` | 目标任务, 值, 动作(覆写/OR/增量等) | pdPASS/pdFAIL | 发送通知(带值) |
|
|
|
|
|
+| `BaseType_t xTaskNotifyWait(ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait)` | 入口清除, 出口清除, 值指针, 超时 | pdPASS/pdFAIL | 接收通知(阻塞等待) |
|
|
|
|
|
+| `BaseType_t xTaskNotifyFromISR(xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken)` | 同 xTaskNotify+唤醒标记 | pdPASS/pdFAIL | ISR中发送通知 |
|
|
|
|
|
+| `void vTaskNotifyGiveFromISR(xTaskToNotify, pxHigherPriorityTaskWoken)` | 目标任务, 唤醒标记 | 无 | ISR中信号量模式发送 |
|
|
|
|
|
+| `BaseType_t xTaskNotifyAndQuery(xTaskToNotify, ulValue, eAction, pulPreviousValue)` | 同 xTaskNotify+原值 | pdPASS/pdFAIL | 发送并获取原通知值 |
|
|
|
|
|
|
|
|
**eAction 枚举值**:
|
|
**eAction 枚举值**:
|
|
|
|
|
+
|
|
|
- `eNoAction`:仅发送通知(不修改值)
|
|
- `eNoAction`:仅发送通知(不修改值)
|
|
|
- `eSetBits`:与现有值按位 OR
|
|
- `eSetBits`:与现有值按位 OR
|
|
|
- `eIncrement`:通知值 +1
|
|
- `eIncrement`:通知值 +1
|