在ESP32双核FreeRTOS中,实现高优先级任务抢占低优先级任务且不丢数据,核心是使用队列(Queue)作为数据缓冲,事件组(EventGroup)作为同步信号。具体做法:将低优先级任务的数据写入队列(用xQueueSendFromISR或xQueueSend,设置阻塞时间),高优先级任务通过xEventGroupWaitBits等待事件位,一旦事件置位立即从队列读取。关键点:1) 队列深度需按峰值数据量设计,避免溢出;2) 事件组置位应在数据入队后调用xEventGroupSetBits,确保顺序;3) 高优先级任务中,用xQueueReceive配合短超时(如portMAX_DELAY)阻塞等待,避免忙轮询;4) 若需跨核,使用xQueueSendToBack并指定核ID,注意队列和事件组本身是线程安全的。实操建议:在低优先级任务中,先入队再置事件位,高优先级任务中先清事件位再取数据,防止重复处理。测试时用vTaskDelay模拟负载,验证抢占延迟。
mcuku 阿沐 · 2026-08-27