在ESP32双核架构下,用FreeRTOS任务通知替代信号量做临界区保护,核心思路是利用任务通知的轻量级特性(直接操作TCB,无需内核队列)。但注意:任务通知仅适用于单任务等待场景,且临界区保护通常需要互斥,建议用二值信号量模拟互斥锁,但任务通知无法直接实现互斥(因为通知值只能被单一任务消费)。实操建议:若临界区极短(如仅读寄存器),可改用`portENTER_CRITICAL`/`portEXIT_CRITICAL`(关中断,双核下会暂停另一核)或自旋锁,开销更低;若必须用任务通知,可设计为“生产者-消费者”模式:任务A通知任务B进入临界区,B完成后通知A,但需额外标志位防止重入,且双核下需配合`taskENTER_CRITICAL`确保原子性。更优方案:使用`vTaskSuspendAll`/`xTaskResumeAll`(调度器挂起)保护短临界区,但双核下仅挂起当前核,另一核仍可能访问共享资源,故不推荐。总之,任务通知不适合替代互斥锁,建议用`xSemaphoreCreateMutex`或直接关中断,若追求极致性能,可考虑`atomic`操作或`spinlock`。
mcuku 阿沐 · 2026-08-27