用途
该技能面向 ESP32 或 RP2040 上的真实并发问题。它的做法是保持主流程聚焦,并根据用户的具体问题加载匹配的详细参考文档。
当请求涉及 ESP32 上的多个并发作业、任务优先级或抢占、队列/信号量/互斥量/通知设计、RP2040 的 setup1 与 loop1 多核协调、看门狗安全的长时运行行为,或调试竞态条件、栈溢出、死锁时,可使用本技能。
当目标为 UNO 或其他单核开发板、简单 millis() 调度即可解决问题,或请求仅涉及一个阻塞循环、没有并发需求时,不应使用本技能。
提供的参考资料
references/patterns-task-creation.md:任务生命周期、优先级、栈大小设定与任务启动references/patterns-queues.md:使用队列进行任务间通信references/patterns-synchronization.md:互斥量、信号量、临界区与 ISR 协调references/patterns-memory.md:栈大小设定、堆检查与监控references/patterns-advanced.md:看门狗、通知、事件组、定时器与亲和性assets/workflow.mmd:架构概览
使用方式
对于控制系统的任务/资源归属、动作时序或截止时间预算,先使用 realtime-control-design;随后回到本技能获取实际的 RTOS 原语。原生 ESP-IDF 使用其自身端口的栈单位、亲和性与临界区规则;在未核对所选 SDK 前,不要把 Arduino/RP2040 示例复制到其他框架。
工作流程:
- 先确认目标平台:ESP32 对应 FreeRTOS 任务模型;RP2040 对应双核协调模型。
- 识别主导问题:任务启动则打开
patterns-task-creation.md;通信则打开patterns-queues.md;共享数据或 ISR 信号则打开patterns-synchronization.md;栈或堆风险则打开patterns-memory.md;看门狗、通知、定时器或亲和性则打开patterns-advanced.md。 - 一次只解决一个同步边界。除非设计确实需要,避免把队列、互斥量和通知的建议混在一起。
- 保持板级细节明确。ESP32 的 FreeRTOS 指导与 RP2040 的多核指导不可互换。
核心规则
- 优先使用能解决问题的最小并发原语。
- 显式保护共享状态。“大概安全”并不安全。
- 在 ESP32 上使用
vTaskDelay()或事件驱动的阻塞,切勿在任务内使用delay()。 - 有意识地预留栈大小,并用运行时证据验证。
- 对于 RP2040,在共享数据前先明确核心归属。
验证
- 确认每个任务或核心有单一明确职责。
- 根据具体数据路径检查队列深度、通知流或互斥量覆盖范围。
- 对于 ESP32,在任务大小不确定处用
uxTaskGetStackHighWaterMark()检查栈余量。 - 验证草稿能在不出现死锁或忙等待的情况下持续推进。
- 若涉及 ISR,验证所用同步原语在该平台上对 ISR 是安全的。
常见失败模式
- 任务栈过小
- 在 FreeRTOS 任务内使用
delay() - 未保护的共享数据
- 锁顺序不一致导致的死锁
- RP2040 核心启动假设缺乏互斥量或归属约束
集成
- 当用户需要完整草稿而非设计指导时,可与
arduino-code-generator组合使用。 - 仅当并发设计看起来合理且仍然存在硬件时序问题时,才与
circuit-debugger组合使用。 - 当并发设计需要任务、队列或事件流图时,可与
mermaid-diagram-generator组合使用。
共享输出约定
使用共享的 Arduino 技能约定:说明假设、所需工具与版本、实现步骤、按证明阶段划分的测试/证据、已知限制,以及恢复/安全注意事项。
限制
上述参考资料与集成技能的具体内容,以及共享输出约定的完整细节,当前资料未提供。