在FreeRTOS中,用任务通知替代信号量实现高优先级中断到低优先级任务的零拷贝数据传递,核心是结合任务通知的“通知值”和“事件位”功能,避免数据复制。具体做法:中断中通过xTaskNotifyFromISR()向目标任务发送通知,并传递一个指向数据缓冲区的指针(作为通知值),同时设置一个事件位表示数据就绪。任务侧使用ulTaskNotifyTake()或xTaskNotifyWait()等待通知,收到后从通知值中提取指针,直接处理数据,无需拷贝。关键点:1)确保缓冲区在中断和任务间共享,且生命周期管理正确(如使用环形缓冲区或静态分配);2)中断中调用xTaskNotifyFromISR()时,需检查pxHigherPriorityTaskWoken并执行portYIELD_FROM_ISR()以触发调度;3)任务通知比信号量更轻量,无内核对象开销,且通知值可携带数据指针,实现零拷贝。实操建议:若数据量小,可将数据直接编码进通知值(如32位),进一步减少内存访问;若数据量大,则用指针传递,并确保任务处理完后再复用缓冲区。
mcuku 阿沐 · 2026-08-27