FREERTOS_任务通知——使用

FreeRtos的使用教程 RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 阅读详情

目录

一、特点

二、使用流程(无 “创建” 步骤,直接用任务句柄)

1. 前置准备(已经有一个可以run的任务,下面这些得有)

2. 创建发送 / 接收任务

三、基本使用(核心 API 与操作)

1. 发送通知(发送任务调用)

2. 接收通知(接收任务调用)

四、接收和发送加一个简单的校验,这里以LED为例:

1、main外的:

2、我有创建的两个任务:

任务1、

任务2、这个函数读取不同的按键来发不同的任务通知


一、特点

  • 无需创建独立句柄:通过任务句柄直接发送 / 接收通知,省内存;
  • 32 位通知内容:可存储命令、参数、状态等(灵活传递少量数据);
  • 支持多模式:覆盖、叠加、置位等,适配不同场景;
  • 替代简单队列 / 信号量:适合 “任务→任务” 的一对一 / 一对多通信。

二、使用流程(无 “创建” 步骤,直接用任务句柄)

1. 前置准备(已经有一个可以run的任务,下面这些得有)

   包含头文件

#include "FreeRTOS.h"
#include "task.h" // 任务通知API在task.h中声明

   定义接收任务的句柄

TaskHandle_t xRecvTaskHandle = NULL; // 接收通知的任务句柄
2. 创建发送 / 接收任务

通过xTaskCreate()创建两个任务(发送方和接收方),并保存接收任务的句柄:

// 创建接收任务(保存句柄)
xTaskCreate(RecvTask, "RecvTask", 128, NULL, 1, &xRecvTaskHandle);
// 创建发送任务
xTaskCreate(SendTask, "SendTask", 128, NULL, 2, NULL);

三、基本使用(核心 API 与操作)

1. 发送通知(发送任务调用)

        在任务中:用xTaskNotify()发送 32 位通知内容,关键是指定 “接收任务句柄” 和 “通知模式”:

uint32_t ulNotifyValue = 0x12345678; // 32位通知内容(可存命令+参数)

// 发送通知(核心函数)
xTaskNotify(
  xRecvTaskHandle,        // 接收通知的任务句柄(必须有效)
  ulNotifyValue,          // 要发送的32位内容
  eSetValueWithOverwrite  // 通知模式(常用3种,见下表)
);

常用的通知模式:

模式作用适用场景
eSetValueWithOverwrite新通知覆盖旧通知(仅保留最新值)传递实时参数(如闪烁频率)
eSetValueWithoutOverwrite旧通知未处理则不覆盖(防止丢失)传递事件(如按键触发)
eSetBits按位叠加(仅置 1 对应位,不清除其他位)多事件标记(如多个按键)
2. 接收通知(接收任务调用)

        在任务中:用xTaskNotifyWait()等待并接收通知,可设置 “阻塞超时” 和 “位操作”:

参数定义放任务起始:

uint32_t ulRecvValue; // 存储接收的32位通知内容
BaseType_t xResult;   // 接收结果(pdPASS=成功)

接收的代码:

// 接收通知(核心函数)
xResult = xTaskNotifyWait(
  0xFFFFFFFFU,        // 接收后要清除的位(0xFFFFFFFF=清除所有位)
  0xFFFFFFFFU,        // 接收时要保留的位(0xFFFFFFFF=保留所有位)
  &ulRecvValue,       // 存储接收内容的指针
  portMAX_DELAY       // 阻塞超时时间(0=非阻塞,portMAX_DELAY=永久等待)
);

// 处理通知
if(xResult == pdPASS) {
  // 解析ulRecvValue(如命令+参数分离)
  uint16_t cmd = (ulRecvValue >> 16) & 0xFFFF; // 高16位为命令
  uint16_t param = ulRecvValue & 0xFFFF;       // 低16位为参数
}

四、接收和发送加一个简单的校验,这里以LED为例:

通过位运算检查高 16 位的 “命令标识”:

为什么用高 16 位做命令?

        避免参数值和命令冲突(比如参数最大是 65535,不会影响高 16 位);

为什么用固定命令值?

        唯一标识通知的用途(比如后续扩展CMD_SET_COLOR控制 LED 颜色,也用高 16 位区分)。

1、main外的:
// 任务通知内容定义(用32位值传递:高16位标识命令,低16位传递参数)
#define CMD_SET_DELAY       0x00010000U // 命令:设置LED延时
#define GET_DELAY_PARAM(x)  (x & 0xFFFFU) // 提取低16位的延时参数
2、我有创建的两个任务:
//外:
osThreadId_t LED_TaskHandle;
const osThreadAttr_t LED_Task_attributes = {
  .name = "LED_Task",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityBelowNormal7,
};

osThreadId_t KEY_TaskHandle;
const osThreadAttr_t KEY_Task_attributes = {
  .name = "KEY_Task",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};
void Start_LED_Task(void *argument);
void Start_KEY_Task(void *argument);


//内:
LED_TaskHandle = osThreadNew(Start_LED_Task, NULL, &LED_Task_attributes);
KEY_TaskHandle = osThreadNew(Start_KEY_Task, NULL, &KEY_Task_attributes);
任务1、
void Start_LED_Task(void *argument)
{
  uint32_t ulNotificationValue; // 接收的通知内容
  uint16_t current_delay = 500U; // 默认500ms闪烁
  BaseType_t xResult;

  // 初始状态:确保LED是熄灭的(可选,根据硬件调整)
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  for(;;)
  { //HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10);
    /* 核心修改:用 xTaskNotifyWait 替代 xTaskNotifyWaitIndexed(基础API) */
    xResult = xTaskNotifyWait(
      0xFFFFFFFFU,        // 接收后清除所有位(清空通知)
      0xFFFFFFFFU,        // 保留所有位(完整接收32位内容)
      &ulNotificationValue, // 存储通知内容
      0  //portMAX_DELAY       // 永久等待通知
    );

    /* 收到通知后解析处理 */
    if(xResult == pdPASS)
    {
      // 判断是否是“设置延时”命令
      if((ulNotificationValue & 0xFFFF0000U) == CMD_SET_DELAY)
      {
        current_delay = GET_DELAY_PARAM(ulNotificationValue); // 更新延时
      }
    }

    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    vTaskDelay(current_delay); // ѓʱ500ms
  }
}
任务2、这个函数读取不同的按键来发不同的任务通知
    case 1:
		// 构造通知:命令 + 延时参数
        ulNotificationValue = CMD_SET_DELAY | 200U;
        // 核心修改:用 xTaskNotify 替代 xTaskNotifyGiveIndexed(基础API,无索引)
        //             接收通知的任务句柄、通知内容、覆盖模式:新通知替换旧通知
        xTaskNotify(LED_TaskHandle, ulNotificationValue,eSetValueWithOverwrite);        
        ); 
    break;

    case 2:
		ulNotificationValue = CMD_SET_DELAY | 800U;
        xTaskNotify(LED_TaskHandle, ulNotificationValue, eSetValueWithOverwrite);
    break;

FreeRTOS任务通知 ——————(正点原子FreeRTOS学习笔记) 开始学习FreeRTOS,学习参考书籍和视频来自正点原子FreeRTOS源码详解与应用开发,北京航空航天大学出版社 1    任务通知简介         任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS 定义为 1。FreeRTOS 的每个任务 阅读详情

相关推荐

FreeRTOS 任务通知

@(嵌入式) 简述 通知 API 数据结构 轻量级二进制信号量 获取信号量 释放信号量 轻量级计数信号量 轻量级事件标记组 轻量级消息邮箱 参考 FreeRtos 简述FreeRTOS 从版本 V8.2.0开始提供任务通知这个功能,每个任务都有一个32位的通知值。按照 FreeRTOS 官方的说法,使用消息通知相比二进制型号量方式解除阻塞任务快 45%, 并且更加省内存(无需创建队列)。Fre

orienlu's Learning Zone 3831

FreeRTOS学习(一)

3、Task3运行过程中,Task3阻塞了(系统延时或等待信号量等),此时就绪态中,优先级最高的任务Task2执行。1、首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行。4、Task3阻塞解除了(延时到了或者接收到信号量),此时Task3恢复到就绪态中,抢占TasK2的运行。2、Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行。

Caramel_biscuit的博客 1267

FreeRTOS操作系统中文入门手册

任务管理(任务创建、任务优先级、删除任务),队列管理(任务队列),中断管理,资源管理,内存管理,错误排查(常见的编译错误排查error)。

【一文读懂->FreeRTOS用法

板凳精神星光不问赶路人- 你可以不平凡。

weixin_42205800的博客 638

视觉定位避坑指南:基于双mark点的坐标转换常见错误排查

本文详细解析了工业视觉项目中基于双mark点的坐标转换常见错误及排查方法,涵盖旋转矩阵构建、坐标系原点选择、图像预处理优化等关键环节。通过实战案例和代码示例,帮助工程师避免定位偏差,提升系统精度,特别适用于自动化检测和精密制造场景。

7z8x2c4v6b9的博客 167

Kali下RTL8812AU网卡5G抓包精准适配指南

WiFi监听模式是无线安全测试的基础能力,其核心在于网卡驱动对802.11a/n/ac协议栈的完整支持。RTL8812AU系列USB无线网卡因成本低、兼容性广被广泛用于渗透测试,但其芯片版本碎片化(如VA/VC/ACM)与Linux内核演进(6.1~6.5)存在严重适配断层,导致5GHz频段Beacon帧捕获失败、信道切换异常、注入功能残缺等典型问题。技术价值在于突破‘即插即用’幻觉,建立从USB设备ID识别、固件版本校验到射频寄存器级补丁的全链路可控流程。典型应用场景包括CTF无线赛题实战、红蓝对抗中的W

weixin_33783283的博客 760

Freertos基础指令

该篇文章主要用于新手FreeRTOS操作系统基础命令的查询,仅供参考,后续会慢慢补全其他常用命令。

m0_74748126的博客 335

别再为数据发愁了!盘点5个公开可用的医学图像数据集(含MRI/CT/PET合成任务)

本文详细介绍了5个高质量的公开医学图像数据集,涵盖MRI、CT和PET三大模态,适用于深度学习模型训练和医学图像合成任务。每个数据集均提供下载指南、预处理技巧和PyTorch加载示例,帮助研究人员快速获取和处理数据,解决医学AI开发中的数据瓶颈问题。

weixin_30689307的博客 523

FreeRTOS任务之使用篇

带你认识任务的相关操作函数以及基础知识,学会简单使用FreeRTOS中的任务。以FreeRTOS为基础,深入讲解任务的创建与删除方式,涵盖动态创建(xTaskCreate)与静态创建(xTaskCreateStatic)的使用差异、参数说明及其与任务控制块(TCB)的关系。同时,通过实际示例分析任务函数的编写规范、任务优先级的设置、栈空间的管理等关键点,帮助开发者在项目中正确高效地使用FreeRTOS任务机制

caiji0169的博客 1331

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 324

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1157

FreeRTOS-任务通知详解

本文的重点主要有两点:1.搞明白任务通知的三个状态(实现任务通知的关键),2.明白任务通知的优缺点,以及任务通知模拟出来的队列、信号量、事件组与真实的有何区别。

k666499436的博客 6192

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1902

FreeRTOS—任务通知

任务通知是用来通知任务的,任务控制块(TCB)中的结构体成员变量就是这个通知值。使用任务通知时,任务结构体就包含了内部对象,可以直接接收别人发过来的通知使用队列、信号量、事件标志组时都需另外创建一个结构体,通过中间的结构体进行简介通信。

m0_75103637的博客 1326

Python 爬虫实战:抓取新闻网站上的新闻标题和内容

随着信息化的进展,新闻网站已经成为人们获取新闻和时事资讯的主要途径。许多新闻网站提供了丰富的内容,涵盖了社会、政治、科技、娱乐等多个领域。通过抓取新闻网站的内容,我们可以分析新闻的趋势,获取某一领域的最新动态,甚至为数据分析和机器学习提供数据支持。本文将详细介绍如何使用 Python 编写爬虫,抓取新闻网站上的新闻标题和内容。requests:发送 HTTP 请求,获取页面内容。:解析 HTML 页面并提取数据。Selenium:抓取动态加载的网页内容。新闻API。

2201_76125261的博客 3407

C# 调用高德地图关键词 API

今天我们要一起探索如何使用 C# 来调用高德地图的关键词搜索 API,从而实现精准的地理位置搜索功能。高德地图的关键词搜索 API 可以帮助我们轻松地实现这一点,它能够返回一系列匹配关键词的地点坐标和其他相关信息。通过简单的几行 C# 代码,我们就实现了调用高德地图关键词搜索 API 的功能。接下来,我们将在一个 C# 控制台应用中实现调用高德地图关键词搜索 API 的功能。此外,如果要在生产环境中使用,还需要考虑安全性问题,例如不要在客户端暴露 API 密钥。🔥关注墨瑾轩,带你探索编程的奥秘!

java专栏 1103

FreeRTOS学习——任务通知

FreeRTOS 从版本 V8.2.0 开始提供任务通知这个功能,每个任务都有一个 32 位的通知值。按照 FreeRTOS 官方的说法,使用消息通知比通过二进制信号量方式解除阻塞任务快 45%, 并且更加省内存(无需创建队 列)。在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件标志组,可以替代长度为 1 的队列(可 以保存一个 32 位整数或指针值),并且任务通知速度更快、使用的RAM更少!

qq_47172243的博客 2674

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

十八、FreeRTOS之FreeRTOS任务通知

任务通知:用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。(队列、信号量、事件标志组也可以用来通知任务。队列可以往其它任务发数据,信号量同样发送一个资源,释放信号量,另外一个任务获取信号量,事件标志组把某一位置一,另一个任务就来读这个位是不是1。这些都能用来通知任务,为什么我们还要用任务通知呢?最主要的是:内存消耗比较小,因为队列、信号量、事件标志组使用之前都要提前创建好,才能去操作它,而任务通知就不用去创建,因为它的结构体成员就在任务控制块TCB里面。

王同学 1366

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

FreeRTOS - 任务通知

FreeRTOS学习过程中内容整理:综合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源整理而得。

luckyme_的博客 1557

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【FreeRTOS-任务通知】

FREERTOS 任务通知

weixin_43251807的博客 1431

freertos的任务通知

使用FreeRTOS的应用程序被构造为一组独立的任务,这些自主任务很可能必须相互通信,以便共同提供有用的系统功能。

ptw1992的博客 1385

FreeRTOS之任务通知

• 任务通知是FreeRTOS中一种轻量级任务间通信机制,允许一个任务或中断直接向另一个任务发送事件或数据,无需创建队列、信号量等中间对象。每个任务内部自带一个32位的通知值”(和一个“通知状态”(通过操作这两个变量实现快速同步。• 如图• 通俗比喻:• 任务通知就像直接给同事发微信消息,而传统队列/信号量则像通过公共邮箱传递信件。前者,后者需要。• 如图,区别。

luoyanglook的博客 981
上一篇: FREERTOS_事件组——创建和使用
下一篇: FREERTOS_定时器——创建和基本使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值