当前位置: 首页 > news >正文

网站产品页面目前会展相关网站的建设情况

网站产品页面,目前会展相关网站的建设情况,网站建设公司怎么找渠道,世界500强企业排名20212025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知 摘要 在前几章中,我们依次学习了 队列、信号量、互斥量、事件组 等任务间通信与同步机制。虽然这些工具功能强大,但在某些轻量级场景下,它们可能显得“过于复杂”&…

2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知

摘要

在前几章中,我们依次学习了 队列、信号量、互斥量、事件组 等任务间通信与同步机制。虽然这些工具功能强大,但在某些轻量级场景下,它们可能显得“过于复杂”,比如:

  • 任务之间只需要传递一个整数值
  • ISR 只需要快速通知任务执行一次操作
  • 需要更快、更轻量的同步方式

此时,使用 任务通知(Task Notification) 是最佳选择。
任务通知是 FreeRTOS 提供的最轻量级任务通信机制,它不需要额外的内存开销,比队列和信号量更高效。

2025最新超详细FreeRTOS入门教程

文章目录

  • 2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
    • 摘要
    • 一、任务通知的基本概念
      • 1. 定义
      • 2. 特点
    • 二、任务通知 API
      • 1. 发送任务通知
      • 2. 等待任务通知
      • 3. 类似信号量的 API
      • 4. ISR 中发送任务通知
    • 三、任务通知使用示例
      • 示例1:ISR 通知任务
      • 示例2:任务间通信(传递整数)
    • 四、任务通知的工作机制
    • 五、任务通知与队列/信号量对比
    • 六、常见应用场景
    • 七、调试与监控
    • 八、常见问题与解决方法
    • 九、经验总结
    • 十、总结


一、任务通知的基本概念

1. 定义

  • 每个任务都有一个 32 位通知值,由 FreeRTOS 内核维护
  • 任务可以等待通知、发送通知
  • 通知既可以当作 二值信号量 使用,也可以当作 计数信号量/事件标志/消息传递 使用

2. 特点

  • 每个任务最多有一个通知值(可扩展为多个通知数组,FreeRTOS V10.4+ 引入 TaskNotifyTakeIndexed
  • 不需要额外的句柄对象(不像队列、信号量需要额外 RAM)
  • 速度最快,适合 ISR 与任务之间的通信
通知
通知值
中断
任务1
任务2
任务3

二、任务通知 API

1. 发送任务通知

BaseType_t xTaskNotify(TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction
);
  • eAction 取值:
    • eSetBits:对通知值执行按位或
    • eIncrement:通知值自增
    • eSetValueWithOverwrite:覆盖写入
    • eSetValueWithoutOverwrite:不覆盖已有通知

2. 等待任务通知

BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait
);
  • ulBitsToClearOnEntry:进入等待前清除的位
  • ulBitsToClearOnExit:退出等待后清除的位
  • pulNotificationValue:输出通知值
  • xTicksToWait:阻塞等待时间

3. 类似信号量的 API

uint32_t ulTaskNotifyTake(BaseType_t xClearCountOnExit,TickType_t xTicksToWait);
  • 用于实现 二值/计数信号量
  • xClearCountOnExit = pdTRUE:退出时清零
  • 返回值:成功接收到的次数

4. ISR 中发送任务通知

BaseType_t xTaskNotifyFromISR(TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction,BaseType_t *pxHigherPriorityTaskWoken
);

三、任务通知使用示例

示例1:ISR 通知任务

#include "FreeRTOS.h"
#include "task.h"TaskHandle_t xHandleTask;void vTaskHandler(void *pvParameters)
{uint32_t ulNotifiedValue;for(;;){if(xTaskNotifyWait(0x00, 0xFFFFFFFF, &ulNotifiedValue, portMAX_DELAY) == pdTRUE){printf("任务被中断唤醒, 值=%lu\n", ulNotifiedValue);}}
}void EXTI0_IRQHandler(void)
{BaseType_t xHigherPriorityTaskWoken = pdFALSE;xTaskNotifyFromISR(xHandleTask, 1, eIncrement, &xHigherPriorityTaskWoken);portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}int main(void)
{HAL_Init();SystemClock_Config();xTaskCreate(vTaskHandler, "Handler", 128, NULL, 2, &xHandleTask);vTaskStartScheduler();
}

运行结果:

  • 每次中断触发,任务收到通知并打印计数

示例2:任务间通信(传递整数)

TaskHandle_t xTaskSender, xTaskReceiver;void vTaskSender(void *pvParameters)
{uint32_t count = 0;for(;;){count++;xTaskNotify(xTaskReceiver, count, eSetValueWithOverwrite);vTaskDelay(1000);}
}void vTaskReceiver(void *pvParameters)
{uint32_t ulValue;for(;;){if(xTaskNotifyWait(0, 0, &ulValue, portMAX_DELAY) == pdTRUE){printf("接收值=%lu\n", ulValue);}}
}

四、任务通知的工作机制

调用 xTaskNotifyWait
ISR/任务发出通知
任务被唤醒并读取值
清除通知位
未通知
等待
已通知
处理

五、任务通知与队列/信号量对比

特性任务通知队列信号量
速度✅ 最快❌ 较慢中等
内存占用✅ 无额外对象❌ 队列结构体❌ 信号量对象
传递数据✅ 支持整数/位图✅ 任意数据
ISR 使用
多任务等待❌ 仅单任务

六、常见应用场景

  1. 任务与中断同步
    • ISR 中快速通知任务处理事件
  2. 任务间轻量通信
    • 不需要完整队列机制,只需传递整数
  3. 任务事件触发
    • 使用按位通知,代替事件组的轻量版本

七、调试与监控

  • 使用 uxTaskGetStackHighWaterMark() 检查任务是否正常运行
  • 使用 vTaskGetInfo() 获取任务通知状态
  • 注意避免丢失通知(覆盖写模式可能导致数据丢失)

八、常见问题与解决方法

问题可能原因解决方法
通知丢失使用覆盖写模式改用 eIncrement 或事件组
ISR 报错使用了错误 API改用 xTaskNotifyFromISR
多任务等待通知失败每个任务只能有一个通知值使用事件组/队列替代
通知无法清零xTaskNotifyWait 参数设置错误检查清除位参数

九、经验总结

📌 开发建议

  1. 若只是 ISR 与任务间的 单一事件触发,优先使用任务通知
  2. 若需要多个任务等待,使用事件组或队列
  3. 若需要传递复杂数据结构,使用队列
  4. 在高实时性场景,任务通知是最快的通信方式

十、总结

通过本章学习,你已经掌握:

  • 任务通知的概念与机制
  • 发送与接收任务通知的 API
  • 在 ISR 与任务之间使用任务通知
  • 与队列/信号量的对比和适用场景

任务通知是 FreeRTOS 中最轻量的同步与通信工具,在性能要求高的嵌入式系统中非常有价值。


🔗 FreeRTOS专栏👉 下一章:2025最新超详细FreeRTOS入门教程:第九章 FreeRTOS软件定时器 ——将学习如何在任务之外调度定时操作。


http://www.dtcms.com/a/595169.html

相关文章:

  • 天河商城网站建设中企动力常州分公司
  • Rust底层深度探究:自定义分配器(Allocators)——控制内存分配的精妙艺术
  • 商城网站开发教程应用软件有哪些系统
  • 南京科技网站设计有特点青岛网站设计工作室
  • 封开网站建设wordpress主题下载失败
  • php 微信 网站开发互联网企业网站
  • 建设一个招聘网站的策划网站建设課程
  • 郑州模板建站代理三亚凤凰镇网站建设兼职招聘网
  • 建一个网站大概需要多少钱舟山市建设信息港网站打不开
  • 求职网站怎么做安徽省安徽省建设工程信息网站
  • 建设新闻博客类网站要多大空间年度考核表个人总结网站建设
  • 学校网站建设都是谁做的no.7极简wordpress博客主题
  • 初创公司网站设计苏州上海高玩seo
  • 金华官方网站建设百度指数网址
  • 长沙网站推广和优化网站开发语言用什么好
  • 专业网站建设集团crm客户管理系统源码
  • 电商网站有哪些类型flash 如何做游戏下载网站
  • 网格系统网站微信小程序平台入口
  • 乐清网站推广做美食视频的网站
  • 东莞网络营销价格咨询怎么对一个网站做优化
  • 北仑建网站价格宿迁网站建设公司
  • 做网站与做网页的区别网站标准宽度
  • 阳泉网站建设哪家便宜学做沪江网站要多久
  • 常用的网站建设程序有那些网站开发软件d
  • 打工人日报#20251110
  • 做手机网站多少钱思科网站建设配置站点dns服务
  • 双语网站建设网站网站建设公司每年可以做多少个网站
  • 网站后台模板 jquery现在的网站开发都用什么开发
  • 果洛州wap网站建设公司手机上如何设置wordpress
  • 深圳市坪山新区建设局网站企业网站seo推广技巧