18. FreeRTOS 直接任务通知取代取代二进制信号量

FreeRTOS 直接任务通知取代取代二进制信号量

在 FreeRTOS 中,任务之间的同步和通信通常通过信号量(Semaphore)来实现。其中,二进制信号量是一种简单的同步工具,用于指示某个事件的发生。然而,FreeRTOS 提供了一种更高效的替代方案:直接任务通知(Direct Task Notification)。

为什么选择直接任务通知?

直接任务通知可以用来替代二进制信号量在任务之间进行同步和简单的事件通知。这个方法有很多好处,比如占用更少内存:直接任务通知与任务控制块(TCB)直接相关,不需要额外的内存分配,而二进制信号量则需要额外的信号量控制块。更高效:直接任务通知避免了信号量获取和释放的开销,直接修改任务的内部状态,提高了性能。更简洁:直接任务通知提供了简洁的 API 调用,减少了代码的复杂性。

🚨需要注意直接任务通知在FreeRTOS中是个高效的任务间通信方法,但它并不能替代所有情况下的二进制信号量。尤其是在多个任务需要等待同一事件、复杂同步、递归信号量以及一些中断处理时,二进制信号量还是更合适的选择。每种工具都有其独特的用武之地,灵活运用才能让系统更可靠高效。

示例:使用直接任务通知替代二进制信号量

下面的示例展示了如何使用直接任务通知来替代二进制信号量,实现两个任务间的同步。

#include <Arduino.h>
#include <FreeRTOS.h>
#include <task.h>

TaskHandle_t xTask1Handle = NULL;
TaskHandle_t xTask2Handle = NULL;

// 任务1:等待任务
void Task1(void *pvParameters) {
  while (1) {
    // 等待任务通知
    ulTaskNotifyTake(pdTRUE, portMAX_DELAY);

    // 执行任务
    Serial.println("Task1 is running");

    // 模拟任务处理时间
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

// 任务2:通知任务
void Task2(void *pvParameters) {
  while (1) {
    // 延迟2秒
    vTaskDelay(pdMS_TO_TICKS(2000));

    // 发送任务通知
    xTaskNotifyGive(xTask1Handle);
    Serial.println("Notification sent to Task1");
  }
}

void setup() {
  Serial.begin(115200);

  // 创建任务1
  xTaskCreate(Task1, "Task1", 1024, NULL, 1, &xTask1Handle);

  // 创建任务2
  xTaskCreate(Task2, "Task2", 1024, NULL, 1, &xTask2Handle);
}

void loop() {
  // 空的loop函数
}
  1. Task1:等着收任务通知,一接到通知就打印一条消息,然后模拟处理任务。
    • ulTaskNotifyTake(pdTRUE, portMAX_DELAY) 这个函数用来等待任务通知,等收到通知后就清除通知计数。
  2. Task2:每过2秒就给任务1发一次通知。
    • xTaskNotifyGive(xTask1Handle) 这个函数用来给任务1发送通知。

在这个例子里,Task1Task2 通过直接任务通知来同步。Task2 每2秒就给Task1发一次通知,Task1 在收到通知后就执行任务处理。这样就用直接任务通知代替了二进制信号量,实现了任务之间高效的同步机制。

直接任务通知 API 简介

ulTaskNotifyTake

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
  • xClearCountOnExit:当为 pdTRUE 时,通知值在退出时会被清除;为 pdFALSE 时,通知值在退出时不会被清除。
  • xTicksToWait:任务等待通知的最大时间,可以是指定的时间(以tick为单位)或 portMAX_DELAY(表示无限等待)。

xTaskNotifyGive

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
  • xTaskToNotify:要通知的任务句柄。

这两个 API 用起来简单轻松,让任务间的沟通变得爽快又顺畅,代码也变得简洁明了。让任务同步变得更直观高效。

总结

FreeRTOS 的直接任务通知为任务间的同步提供了一种更高效、更简洁的机制。相比于传统的二进制信号量,直接任务通知减少了内存开销和处理开销,极大地提高了系统的性能和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁子希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值