ARTICLE · 1083272
FreeRTOS 任务通知源码剖析:凭什么比二值
FreeRTOS 任务通知源码剖析:凭什么比二值
FreeRTOS 任务通知:凭什么比二值信号快
两个任务要同步,第一反应肯定是信号量。但 FreeRTOS 里有个东西,比二值信号量快 45%,还不用创建任何内核对象。
它叫任务通知。说白了,就是把事件和数据直接塞进目标任务的 TCB 里。省掉了中间那层队列和信号量,路径短得多。代价是每任务固定多占 5 字节 RAM。用得越密越划算,要是 100 个任务只有 2 个用,反而白占内存。
用法分两套。轻量对 xTaskNotifyGive 和 ulTaskNotifyTake,能完美替代二值和计数信号量。全能对 xTaskNotify 配合不同动作,还能模拟事件组和邮箱。不过要注意,它只能点对点通信,没法广播,也不能发往 ISR。
源码里看,发送方只管改目标 TCB 里的通知值,再把它从阻塞链表摘下扔进就绪链表。接收方醒来后,按清零或递减模式消费这个值。连发几次也不会丢,全攒在同一个变量里。
ISR 版则绝不直接切换上下文。它只把标记置为 true,等中断层层退出后,才靠 PendSV 异常去挑最高优先级的任务上 CPU。
原文FreeRTOS 任务通知源码剖析:凭什么比二值信号量快 45%?
作者提示: 个人观点,仅供参考
广东,4小时前,2026年9月26日