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

2024-06-05 08:20

本文主要是介绍17. 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);// 创建任务1xTaskCreate(Task1, "Task1", 1024, NULL, 1, &xTask1Handle);// 创建任务2xTaskCreate(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 的直接任务通知为任务间的同步提供了一种更高效、更简洁的机制。相比于传统的二进制信号量,直接任务通知减少了内存开销和处理开销,极大地提高了系统的性能和可靠性。

这篇关于17. FreeRTOS 直接任务通知取代取代二进制信号量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032554

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构