📘 FreeRTOS 任务通知
高效通信技巧
🎯 30 章 · 从入门到实战
01
任务通知初探:什么是任务通知?为什么比队列/信号量快?核心数据结构解析。
通知本质 · 性能根源 · TCB 通知值
02
通知发送API详解:xTaskNotify()、xTaskNotifyGive()、xTaskNotifyFromISR()的用法与区别。
发送三剑客 · 参数细节 · 中断安全
03
通知接收API详解:ulTaskNotifyTake()、xTaskNotifyWait()的阻塞机制与超时处理。
阻塞等待 · 超时返回 · 清零模式
04
通知值的位操作:利用通知值的32位实现多事件标志,按位与/或/取反操作。
位标志 · 事件组轻量替代 · 位掩码
05
通知值作为计数器:使用xTaskNotifyGive()实现轻量级信号量,替代二进制信号量。
计数信号量 · Give/Take · 无内存开销
06
通知值作为消息邮箱:利用通知值传递16位/32位数据,替代队列传输小数据。
邮箱模式 · 覆写/累加 · 小数据高速通道
07
通知值作为事件组:将32位通知值拆分为独立事件位,替代事件组API。
事件位 · 等待多位 · 轻量事件组
08
通知的覆写与累加模式:配置eSetValueWithOverwrite与eSetValueWithoutOverwrite的区别。
覆写/不覆写 · 累加动作 · 配置策略
09
通知的等待与清除机制:理解xTaskNotifyWait()的清除掩码与等待掩码。
清除掩码 · 等待掩码 · 位过滤
10
中断中的通知:xTaskNotifyFromISR()的中断安全用法与性能考量。
ISR 通知 · 中断延迟 · 高效唤醒
11
通知与二值信号量对比:性能测试数据对比,上下文切换开销分析。
速度对比 · 切换次数 · 实测数据
12
通知与计数信号量对比:何时用通知替代计数信号量?计数上限问题。
计数上限 · 场景选择 · 溢出处理
13
通知与消息队列对比:小数据场景下的性能优势,大数据场景的局限性。
小数据快 · 大数据受限 · 队列 vs 通知
14
通知与事件组对比:32位限制下的替代方案,多事件同步场景。
32位限制 · 多事件同步 · 事件组取舍
15
多任务等待同一通知:广播通知的实现技巧与注意事项。
广播通知 · 一推多收 · 设计模式
16
通知的链式传递:任务A通知任务B,任务B通知任务C的流水线设计。
流水线 · 顺序触发 · 数据流通知
17
通知与任务状态机:利用通知值驱动状态机切换,减少轮询。
状态机驱动 · 事件驱动 · 低功耗轮询
18
通知的超时处理:设计可靠的超时重传机制,防止任务永久阻塞。
超时重传 · 看门狗 · 阻塞防护
19
通知的优先级反转:通知场景下的优先级反转问题与解决方案。
优先级反转 · 互斥通知 · 继承优先级
20
通知与内存管理:通知机制不涉及内存分配,避免动态内存碎片。
零动态内存 · 无碎片 · 确定性
21
通知在低功耗场景:利用通知实现事件唤醒,替代滴答定时器轮询。
事件唤醒 · 低功耗 · 替代 tickless
22
通知的调试技巧:使用uxTaskGetSystemState()监控通知状态。
调试通知 · 状态监控 · 通知值查看
23
通知的常见陷阱:通知值被意外覆盖、任务未等待导致通知丢失。
覆盖陷阱 · 丢失通知 · 防御编程
24
通知与多核架构:SMP系统中任务通知的原子性问题。
SMP 原子性 · 内存屏障 · 多核注意事项
25
通知的封装设计:将通知API封装为易用的模块接口。
模块封装 · 易用接口 · 代码规范
26
通知在协议栈中的应用:UART接收任务通知主处理任务。
UART 驱动 · 协议解析 · 通知唤醒
27
通知在传感器驱动:ADC采样完成通知处理任务读取数据。
ADC 完成 · 传感器 · 数据通知
28
通知在按键处理:按键中断通知任务处理消抖与长按检测。
按键消抖 · 长按检测 · ISR 通知
29
通知在周期性任务:利用通知替代软件定时器实现周期唤醒。
周期唤醒 · 替代定时器 · 精准周期
30
综合实战:构建一个基于任务通知的多任务数据采集系统。
实战项目 · 多任务采集 · 通知协同