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

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

Python Invoke自动化任务库的使用

《PythonInvoke自动化任务库的使用》Invoke是一个强大的Python库,用于编写自动化脚本,本文就来介绍一下PythonInvoke自动化任务库的使用,具有一定的参考价值,感兴趣的可以... 目录什么是 Invoke?如何安装 Invoke?Invoke 基础1. 运行测试2. 构建文档3.