2、NPU与MCU协同架构基础:职责划分、典型系统拓扑与数据通路
在进入延迟预算分配实战之前,必须先厘清NPU与MCU在真实系统中的角色边界与协作方式。很多延迟问题的根源并非算力不足,而是职责错配、拓扑选择不当或数据通路设计存在瓶颈。本章从职责划分、系统拓扑、通信机制三个维度展开,帮助你在动手做延迟预算之前,先建立一张清晰的“架构地图”。
2.1 NPU与MCU的职责划分:控制面与数据面的解耦
核心原理:NPU(神经网络处理单元)与MCU(微控制器)在嵌入式AI系统中承担截然不同的角色。MCU本质上是控制面的载体,负责系统调度、外设管理、协议解析、安全监控和任务编排;NPU则是数据面的加速引擎,专注于卷积、矩阵乘、激活函数等大规模并行计算。二者通过明确的接口协议协同工作,而非互相替代。
| 维度 | MCU(控制域) | NPU(计算域) |
|---|---|---|
| 核心任务 | 流程控制、事件响应、外设驱动 | 神经网络推理、张量运算 |
| 时钟频率 | 100MHz ~ 600MHz | 500MHz ~ 1.5GHz |
| 指令集 | 通用指令(ARM/RISC-V) | 专用指令(MAC、向量) |
| 实时性要求 | 硬实时(中断响应 < 10μs) | 软实时(任务级延迟容忍) |
| 典型延迟预算 | 50μs ~ 500μs | 1ms ~ 50ms |
判断方法:在项目初期,可以通过以下三个问题快速界定职责边界:
- 任务是否涉及状态机或时序逻辑?如果是,则必须由MCU承担,NPU不具备复杂分支控制能力。
- 任务是否包含大量并行数值运算?如果是,则优先考虑卸载到NPU,MCU仅做数据封装与结果解析。
- 任务是否需要纳秒级响应?如果是,则留在MCU中断服务函数中,NPU的调度开销无法满足。
2.2 典型系统拓扑:SoC集成与独立芯片的权衡
核心原理:NPU与MCU的物理拓扑关系直接影响延迟预算的分配方式。当前主流方案分为两类:SoC内集成(如瑞萨RZ/V系列、NXP i.MX 8M Plus)和独立芯片(如地平线旭日X3搭配外部MCU)。SoC集成方案通过片内总线互联,延迟低但灵活性受限;独立芯片方案通过外部接口通信,延迟高但选型自由。
SoC内集成拓扑
- 共享内存架构:NPU与MCU通过总线矩阵访问同一片DDR或SRAM,数据零拷贝,延迟最低(约100ns~1μs)。
- 硬件Mailbox:用于核间中断通知,MCU写寄存器触发NPU中断,反之亦然,延迟约2~5μs。
- 典型延迟预算:MCU到NPU的任务下发约10μs,NPU推理完成后回传结果约5μs,端到端额外开销控制在50μs以内。
独立芯片拓扑
- 通信接口:通常使用PCIe(延迟约5~10μs)、USB 3.0(延迟约50μs)或千兆以太网(延迟约100μs)。
- 数据拷贝:需要经过DMA搬运到NPU侧内存,再执行推理,额外增加200μs~1ms的拷贝时间。
- 典型延迟预算:端到端额外开销至少500μs,适合对实时性要求不高的视觉检测场景。
| 对比项 | SoC内集成 | 独立芯片 |
|---|---|---|
| 通信延迟 | 1~10μs | 50~500μs |
| 数据带宽 | 10~50GB/s(片内总线) | 0.5~2GB/s(外部接口) |
| 功耗 | 低(共享电源域) | 高(独立供电) |
| 灵活性 | 低(固定搭配) | 高(可自由选型) |
| 延迟预算分配 | 可精确到μs级 | 需预留ms级余量 |
2.3 数据通路与通信机制:共享内存、总线与DMA
核心原理:数据通路是延迟预算的核心战场。无论采用何种拓扑,数据从MCU到NPU再到MCU的路径上,每个环节都会引入延迟。理解共享内存、总线仲裁和DMA搬运的微观行为,是精确预算的前提。
共享内存机制
共享内存是最低延迟的通信方式,但存在缓存一致性问题。MCU侧通常有L1/L2缓存,NPU侧也有自己的SRAM。当MCU写入共享内存后,NPU可能读到脏数据。解决方案包括:
- 使用硬件缓存一致性协议(如CCI总线),但会增加访问延迟约20~50ns。
- 使用内存屏障指令,强制刷新缓存,但会阻塞CPU流水线。
- 使用非缓存映射区域,直接访问DDR,延迟增加但保证一致性。
总线仲裁延迟
当MCU和NPU同时访问共享内存时,总线矩阵需要仲裁。以AXI总线为例,仲裁延迟通常在10~30个时钟周期。如果NPU持续占用总线,MCU的访问可能被阻塞数百纳秒。实测数据表明:在NPU高负载时,MCU的DMA传输延迟可能从5μs恶化到50μs。
DMA搬运策略
DMA是降低CPU负担的关键,但DMA配置本身也有延迟。一次典型的DMA传输流程包括:
- MCU写DMA控制寄存器(约1μs)
- DMA引擎获取总线控制权(约0.5μs)
- 数据搬运(取决于数据量和总线带宽)
- 传输完成中断(约2μs)
// DMA配置示例(伪代码)
DMA_Channel_Config ch;
ch.src_addr = (uint32_t)&input_buffer[0];
ch.dst_addr = (uint32_t)&npu_input_region[0];
ch.data_len = 4096 * 4; // 16KB数据
ch.burst_size = 16; // 16字节突发传输
ch.priority = DMA_PRIORITY_HIGH;
DMA_Start(&ch, DMA_INT_COMPLETE);
// 等待DMA完成中断,约需 16KB / 400MB/s = 40μs
背景:某PCB检测设备使用瑞萨RZ/V2L(集成NPU)搭配RZ/A2U MCU,通过共享内存通信。初始端到端延迟为45ms,超出客户要求的30ms。
现象分析:通过性能分析工具发现,MCU侧图像采集DMA耗时8ms,NPU推理耗时12ms,但MCU与NPU之间的数据同步等待高达25ms。
根因定位:MCU在DMA完成后立即读取NPU状态寄存器,但NPU仍在处理上一帧,导致MCU空转等待。同时,共享内存区域未做双缓冲,MCU必须等NPU完全处理完才能写入新数据。
优化措施:
1. 将共享内存改为双缓冲(Ping-Pong结构),MCU写入Buffer A时,NPU处理Buffer B;
2. 使用Mailbox中断替代轮询,MCU在DMA完成后立即进入低功耗模式,NPU处理完后再通过中断唤醒MCU;
3. 将图像预处理(缩放、格式转换)从MCU迁移到NPU的DMA通道。
结果:端到端延迟从45ms降至22ms,其中MCU侧开销从33ms降至8ms,NPU推理时间从12ms降至10ms(预处理卸载后NPU效率提升)。
复盘:延迟预算不能只看计算时间,同步等待往往占据50%以上的延迟。双缓冲+中断驱动是解决核间协作延迟的通用方案。
2.4 常见误区与设计复盘
误区一:认为NPU越快,系统延迟越低。实际上,如果数据通路设计不合理,NPU算力再强也无法弥补搬运延迟。例如,某方案NPU推理仅需3ms,但通过USB传输图像数据耗时15ms,端到端延迟反而比SoC集成方案更差。
误区二:忽略MCU侧的中断延迟。在实时系统中,MCU可能正在处理高优先级中断,导致NPU完成中断被延迟响应。实测中,如果MCU在UART接收中断中耗时200μs,NPU结果回传的响应时间可能从5μs恶化到205μs。
误区三:共享内存越大越好。大块共享内存虽然方便,但会增加缓存一致性维护成本和总线占用时间。建议将共享区域控制在4KB~64KB,并采用双缓冲机制。
| 设计决策 | 推荐做法 | 延迟影响 |
|---|---|---|
| 数据传递方式 | 共享内存 + Mailbox中断 | 比轮询节省80%等待时间 |
| 缓冲策略 | 双缓冲(Ping-Pong) | 消除核间互锁等待 |
| DMA优先级 | NPU输入DMA设为最高优先级 | 避免NPU空转等待数据 |
| 缓存策略 | 共享区域配置为Write-Through | 牺牲10%写性能,换取一致性 |