嵌入式系统基础:CPU、内存、外设、总线的基本概念,以及嵌入式系统的特点
在正式接触嵌入式NPU(神经网络处理单元)之前,我们首先需要建立对嵌入式系统整体的认知框架。NPU并非孤立工作的芯片,它总是作为嵌入式系统中的一个计算单元,与CPU协同调度,通过总线与内存和外设交换数据。如果对嵌入式系统的基本构成缺乏清晰理解,后续学习NPU的驱动开发、数据搬运、功耗优化和系统集成时,就会遇到概念上的障碍。本章将围绕嵌入式系统的四大核心组成——CPU、内存、外设、总线——展开讲解,并深入剖析嵌入式系统区别于通用PC的关键特点,为后续章节的NPU原理学习打下坚实的硬件基础。
上图展示了嵌入式系统的核心架构关系。CPU作为主控,负责运行操作系统和应用程序;NPU作为协处理器,专注于神经网络推理;内存(DDR/SRAM)为两者提供数据存储空间;外设则负责与物理世界交互;总线将所有组件连接在一起,定义了数据流动的规则。在后续内容中,我们将逐一拆解这些组成部分,并说明它们与NPU工作的具体关联。
2.1 CPU:嵌入式系统的主控核心
核心原理:CPU的职责与架构差异
CPU(中央处理器)是嵌入式系统的大脑,负责执行指令、进行逻辑判断、控制程序流程。在嵌入式领域,CPU架构主要分为三大阵营:ARM、RISC-V和x86。ARM架构凭借其低功耗和高性能的平衡,占据了移动端和嵌入式市场的主导地位,典型产品包括Cortex-A系列(应用处理器,用于Linux/Android系统)和Cortex-M系列(微控制器,用于裸机或RTOS环境)。RISC-V作为开源指令集架构,近年来在AIoT领域快速崛起,其可扩展性和免授权费的特点吸引了大量芯片厂商。x86则主要存在于工业PC和边缘服务器中,功耗较高但生态成熟。
对于NPU而言,CPU的角色是"管理者"而非"计算者"。当运行一个AI推理任务时,CPU负责解析神经网络模型、分配内存缓冲区、配置NPU寄存器、启动NPU计算,并在NPU完成计算后处理结果。CPU的算力要求并不高,但对实时性和中断响应能力有严格要求。
判断方法:如何选择合适的CPU
在实际项目选型中,需要根据以下维度评估CPU是否满足需求:
- 算力需求:主频(MHz/GHz)、DMIPS(Dhrystone百万指令/秒)、CoreMark分数。
- 内存管理单元(MMU):是否支持Linux等虚拟内存操作系统,还是仅运行裸机程序。
- 中断延迟:对于实时控制场景,需要关注中断响应时间(通常要求微秒级)。
- 功耗预算:电池供电设备通常要求CPU功耗在毫瓦级,而边缘计算盒子可接受5-15W。
- 生态与工具链:编译器支持、调试器、RTOS/BSP适配情况。
案例拆解:AI摄像头中的CPU选型
假设我们要设计一款智能网络摄像头,需要同时运行Linux系统、视频编码、网络传输和NPU推理。此时选择Cortex-A53四核处理器(主频1.5GHz)较为合适,因为它具备MMU可以运行完整Linux,且四核可以并行处理视频采集、AI推理调度和网络协议栈。如果仅做简单的关键词唤醒(KWS)功能,则可以选择Cortex-M4F单片机,主频100MHz即可,功耗可控制在100mW以内,无需运行操作系统,直接在裸机上轮询麦克风数据并触发NPU。
2.2 内存:数据存储与交换的枢纽
核心原理:内存层级与NPU的交互
嵌入式系统的内存体系通常分为三级:寄存器(在CPU内部)、Cache(SRAM,在CPU或NPU内部)、主存(DDR SDRAM,外部芯片)。对于NPU而言,内存带宽往往比内存容量更为关键。NPU在执行卷积运算时,需要反复读取输入特征图、权重参数,并写回输出特征图。如果内存带宽不足,NPU的MAC阵列将处于等待状态,导致实际算力远低于理论峰值。
以常见的INT8量化模型为例,一个输入为224x224x3的图像,经过第一层卷积后产生112x112x32的特征图,数据量约为400KB。如果NPU需要以30fps的速度处理视频流,则每秒需要搬运约12MB的数据。这还只是单层网络,完整模型的数据搬运量可达数百MB/s。因此,NPU通常配备专用的DMA(直接内存访问)控制器,可以在不占用CPU的情况下,在内存和NPU内部SRAM之间批量搬运数据。
操作流程:内存分配与对齐策略
在嵌入式Linux或RTOS环境下,为NPU分配内存需要遵循以下步骤:
- 使用连续物理内存分配接口(如CMA、ION、DMA-BUF)申请大块连续内存。
- 确保内存地址按照NPU要求的对齐方式(通常为64字节或256字节)进行对齐。
- 将物理地址转换为NPU可访问的总线地址(通常物理地址即总线地址,但需确认IOMMU配置)。
- 在NPU驱动中注册内存区域,并建立内核虚拟地址到用户空间的映射。
// 示例:在Linux驱动中分配NPU专用内存
#include <linux/dma-mapping.h>
dma_addr_t phys_addr;
void *virt_addr = dma_alloc_coherent(dev, size, &phys_addr, GFP_KERNEL);
// phys_addr 即为NPU可访问的总线地址
常见误区:内存使用中的典型错误
- 误区一:使用普通malloc分配NPU内存。malloc返回的是虚拟地址,物理内存可能不连续,且无法保证DMA访问的连续性。
- 误区二:忽略Cache一致性。CPU写入内存后,数据可能仍停留在Cache中,NPU通过DMA读取时会读到旧数据。必须使用dma_map_single或dma_alloc_coherent来保证一致性。
- 误区三:内存带宽估算不足。只关注NPU算力,忽略了DDR带宽限制。例如,LPDDR4-3200的理论带宽约为25.6GB/s,但实际可用带宽通常只有60%-70%,多路并发访问时还会进一步下降。
2.3 外设:连接物理世界的桥梁
核心原理:外设分类与NPU的关联
嵌入式系统的外设种类繁多,按功能可分为:通信接口(UART、SPI、I2C、USB、Ethernet)、多媒体接口(MIPI-CSI摄像头、MIPI-DSI显示屏、I2S音频)、存储接口(SDIO、eMMC、SATA)以及通用IO(GPIO、ADC、PWM)。对于NPU应用而言,最核心的外设是摄像头接口(MIPI-CSI)和显示接口(MIPI-DSI),因为视觉AI的输入输出都依赖它们。
以MIPI-CSI为例,摄像头传感器通过差分信号对将RAW图像数据传入SoC的ISP(图像信号处理器),ISP完成去马赛克、降噪、白平衡等处理后,将YUV或RGB数据写入DDR内存。此时NPU可以直接从DDR中读取这些图像数据进行推理,无需经过CPU转发。这种"摄像头→ISP→DDR→NPU"的数据流路径,避免了CPU参与大量像素数据的拷贝,是嵌入式AI系统设计的典型优化手段。
操作流程:外设驱动与数据流配置
在嵌入式系统中配置外设通常涉及设备树(Device Tree)或板级配置文件。以MIPI-CSI摄像头为例,需要配置:
- 摄像头传感器驱动(设置分辨率、帧率、曝光时间)。
- MIPI控制器驱动(配置差分信号对的通道数、时钟频率)。
- ISP驱动(设置输出格式、裁剪区域、缩放比例)。
- V4L2(Video for Linux 2)框架,向用户空间提供视频设备节点。
// 设备树中MIPI-CSI外设配置示例
&csi0 {
status = "okay";
port {
csi0_ep: endpoint {
remote-endpoint = &ov5647_ep;
data-lanes = <1 2>; // 使用2条MIPI数据通道
};
};
};
案例拆解:智能门锁的人脸识别外设链路
一款智能门锁需要实现人脸识别功能,其外设链路包括:红外摄像头(输出IR图像)、RGB摄像头(输出彩色图像)、补光灯(GPIO控制)、触摸按键(I2C接口)、显示屏(SPI接口)。系统启动时,CPU通过I2C配置摄像头寄存器,设置分辨率为640x480@30fps。当人体接近传感器触发中断后,CPU点亮补光灯,同时启动两个摄像头采集。图像数据通过MIPI-CSI进入ISP,ISP输出NV12格式的YUV数据存入DDR。NPU从DDR中读取人脸区域(由CPU通过人脸检测算法粗定位),执行特征提取,与注册库中的特征比对。整个过程CPU仅负责调度和结果判断,像素级数据全部由外设→DDR→NPU的硬件通路完成。
2.4 总线:连接所有组件的神经网络
核心原理:总线架构与协议层次
总线是嵌入式系统中传输数据、地址和控制信号的通道。现代SoC内部通常采用多层总线架构,从高速到低速分为:AXI(高级可扩展接口,用于CPU与DDR、NPU与DDR之间的高速数据传输)、AHB(用于中等速度的DMA和存储控制器)、APB(用于低速外设如UART、GPIO、I2C)。这种分层设计是为了在功耗和性能之间取得平衡——高速总线运行频率高、功耗大,仅用于关键数据通路;低速总线则服务于对带宽不敏感的外设。
对于NPU而言,AXI总线接口至关重要。NPU通常通过AXI主接口发起DMA读写操作,访问DDR中的输入输出数据。AXI协议支持突发传输(Burst)、乱序完成(Out-of-Order)和多个未完成事务(Multiple Outstanding Transactions),这些特性允许NPU在等待内存数据返回的同时,继续发出新的读写请求,从而最大化内存带宽利用率。
判断方法:总线瓶颈的识别
当NPU实际算力低于理论值时,需要检查总线是否存在瓶颈。常用的诊断方法包括:
- 使用性能计数器(Performance Counter)监测AXI总线的读写吞吐量。
- 检查DDR控制器的高水位标记(High-Water Mark),判断是否频繁达到队列上限。
- 对比不同数据格式(如NHWC vs NCHW)下的实际带宽,找出数据布局对总线效率的影响。
| 总线类型 | 典型位宽 | 最高频率 | 典型用途 | 与NPU的关系 |
|---|---|---|---|---|
| AXI | 64/128/256-bit | 500MHz-1GHz | CPU↔DDR、NPU↔DDR | NPU数据搬运主通道 |
| AHB | 32/64-bit | 100-200MHz | DMA控制器、存储控制器 | 可能用于NPU配置寄存器访问 |
| APB | 32-bit | 50-100MHz | UART、GPIO、I2C、SPI | 用于NPU控制寄存器的低速配置 |
| MIPI | 1-4 Lanes | 1-2.5Gbps/Lane | 摄像头、显示屏 | 提供NPU输入图像数据 |
常见误区:总线设计中的典型问题
- 误区一:认为总线带宽等于实际吞吐量。总线协议开销、仲裁延迟、DDR刷新周期都会降低实际可用带宽,通常实际吞吐量只有理论值的50%-70%。
- 误区二:忽略总线仲裁冲突。当CPU、NPU、显示控制器同时访问DDR时,总线仲裁器需要合理分配带宽。如果NPU的优先级设置不当,可能导致显示画面卡顿或NPU推理超时。
- 误区三:跨时钟域处理不当。NPU通常运行在独立时钟域,与CPU总线时钟不同步。跨时钟域信号需要经过同步器或异步FIFO处理,否则会导致数据采样错误。
2.5 嵌入式系统的核心特点与设计约束
核心原理:嵌入式系统的五大特征
嵌入式系统与通用PC相比,具有以下显著特点,这些特点直接影响NPU的选型和系统设计:
- 资源受限:内存容量(通常64MB-4GB)、存储空间(16MB-64GB)、CPU算力均有限,需要精打细算。
- 实时性要求:许多嵌入式系统需要在确定时间内完成任务,如自动驾驶的刹车控制、工业机器人的运动规划。
- 功耗敏感:电池供电设备对功耗有严格限制,NPU需要在不同性能模式(如高性能/均衡/低功耗)间动态切换。
- 可靠性优先:嵌入式系统往往在恶劣环境下长期运行,需要看门狗、ECC内存、电源监控等可靠性机制。
- 软硬件协同设计:硬件选型和软件架构需要同步考虑,例如NPU支持的算子类型决定了AI模型的量化策略。
操作流程:嵌入式NPU系统的设计流程
一个典型的嵌入式NPU系统设计遵循以下步骤:
- 需求分析:明确AI任务类型(分类/检测/分割)、帧率要求、精度要求、功耗预算。
- 算力估算:根据模型复杂度(MACs)和目标帧率,计算所需NPU算力(TOPS)。
- 选型评估:对比不同SoC的NPU算力、内存带宽、外设接口、工具链成熟度。
- 软硬件划分:确定哪些计算在NPU上执行,哪些在CPU上执行,哪些在ISP/DSP上执行。
- 内存规划:分配DDR带宽、SRAM空间、DMA通道。
- 驱动与中间件开发:编写NPU驱动、内存管理模块、推理运行时。
- 系统集成与调优:进行端到端性能测试,优化数据通路和电源管理策略。
案例拆解:智能音箱的NPU系统设计
以一款智能音箱为例,其需要实现远场语音识别(KWS)和本地命令词识别。系统约束为:电池供电(待机功耗<1mW)、唤醒响应时间<100ms、支持5米远场拾音。设计决策如下:
- 选用集成Cortex-M4F CPU + 微型NPU(0.5 TOPS)的SoC,待机时CPU和NPU均进入深度睡眠。
- 麦克风阵列通过PDM接口连接,音频数据由DMA直接搬运至SRAM,无需CPU干预。
- NPU运行一个参数量为300KB的DNN模型,输入为40维MFCC特征,输出为唤醒词置信度。
- 当NPU检测到唤醒词后,才唤醒CPU启动完整的语音识别流程。
该设计中,NPU的功耗仅为5mW(工作状态),CPU大部分时间处于睡眠状态,实现了待机功耗0.8mW、唤醒功耗120mW的优异表现。关键优化点在于:利用NPU的低功耗推理能力替代CPU的持续监听,将系统平均功耗降低了90%以上。