嵌入式系统基础:硬件组成与软件分层
嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁剪”的专用计算机系统。理解其硬件组成与软件分层,是进行嵌入式系统设计、驱动开发和系统调优的基石。本章将系统梳理嵌入式系统的硬件核心部件(CPU、存储器、I/O)、软件四层结构(BSP、驱动、OS、应用),并深入解析实时性这一关键设计约束。下图展示了嵌入式系统的整体软硬件架构与实时性约束的映射关系。
2.1 硬件组成:CPU、存储器与I/O
2.1.1 核心原理:三大部件的协同
嵌入式硬件以CPU(中央处理器)为控制中心,通过总线(地址总线、数据总线、控制总线)连接存储器(程序与数据的存储介质)和I/O接口(与外部世界交互的通道)。CPU负责取指、译码、执行指令;存储器按“冯·诺依曼”或“哈佛”结构组织;I/O则通过内存映射或独立编址方式与CPU通信。现代嵌入式CPU(如ARM Cortex-M系列)内部还集成了中断控制器(NVIC)、DMA控制器、定时器等,形成SoC(片上系统)。
| 部件 | 典型器件 | 关键参数 | 选型要点 |
|---|---|---|---|
| CPU | ARM Cortex-M4 / M7、Cortex-A53、RISC-V | 主频(MHz)、MIPS/DMIPS、FPU、Cache | 算力余量、功耗、生态、调试接口 |
| 存储器 | NOR Flash、NAND Flash、SRAM、SDRAM/DDR | 容量、位宽、访问速度、擦写寿命 | 代码存储 vs 数据存储、掉电保持、成本 |
| I/O | UART、SPI、I2C、GPIO、USB、CAN、Ethernet | 速率、电平标准、DMA支持、中断能力 | 外设匹配、协议栈需求、实时性要求 |
2.1.2 判断方法:硬件资源评估流程
- 需求分析:列出外设接口类型(如需要3路UART、1路CAN)、数据处理吞吐量(如ADC采样率×通道数)、存储需求(代码量+数据缓存+日志空间)。
- CPU选型:根据算法复杂度(如是否需要浮点运算、FFT)选择M3/M4/M7或A系列;评估最坏情况下的CPU占用率(建议≤70%)。
- 存储器规划:代码放NOR Flash(XIP执行),数据放SRAM(实时变量),大容量非易失数据放NAND或eMMC;注意总线位宽对性能的影响。
- I/O映射:确认每个外设的中断优先级、DMA通道分配,避免冲突。
2.1.3 案例拆解:工业数据采集器硬件选型
背景与约束:设计一款8通道、16-bit、采样率100kSPS的工业数据采集器,需通过Ethernet上传数据,并支持本地SD卡存储。功耗要求<2W,工作温度-40℃~85℃。
分析过程:
- CPU选型:采用STM32H743(Cortex-M7,480MHz),内置FPU和双精度硬件浮点,满足16-bit数据实时处理;其以太网MAC+外部PHY(如LAN8720)实现100Mbps通信。
- 存储器:代码256KB放内部Flash,数据缓存512KB用外部SRAM(IS61WV51216),SD卡通过SDMMC接口连接。
- I/O配置:8路ADC输入采用DMA循环采样,定时器触发采样时钟;UART用于调试,I2C连接温度传感器。
结果与复盘:实测CPU占用率约45%,DMA传输无丢码。关键经验:ADC采样时钟必须与定时器同步,否则产生相位抖动;SD卡写入采用FATFS+轮询方式,避免中断阻塞。
2.2 软件分层:BSP、驱动、OS与应用
2.2.1 核心原理:分层解耦与抽象
嵌入式软件采用分层架构,自底向上为BSP(板级支持包)、设备驱动、操作系统(OS)和应用层。BSP负责初始化CPU、内存、时钟、中断控制器,并提供硬件抽象接口(HAL);驱动层封装具体外设的操作(如读写寄存器、处理中断);OS层提供任务调度、内存管理、信号量、消息队列等机制;应用层实现业务逻辑。分层的好处是:硬件变化时只需修改BSP和驱动,应用代码可移植。
2.2.2 操作流程:从上电到应用运行
- Bootloader/BSP启动:设置堆栈指针、初始化时钟(PLL)、SDRAM、Flash控制器,拷贝RW段和ZI段。
- OS初始化:创建空闲任务、初始化调度器、注册中断服务例程(ISR)。
- 驱动加载:调用各外设驱动的init()函数,注册设备到设备管理框架。
- 应用启动:创建应用任务,设置优先级,启动调度。
2.2.3 实战场景:驱动层中断与DMA协作
以UART接收不定长数据为例:驱动层开启RX DMA(循环模式),每收到一帧数据触发空闲中断(IDLE)。在ISR中计算已接收字节数,通过信号量通知应用任务处理。此设计将CPU从逐字节中断中解放,提升系统实时性。若使用裸机轮询,则CPU占用率会随数据量线性增长。
2.3 实时性概念:硬实时与软实时
2.3.1 核心原理:确定性优先
实时性指系统能在规定时间内完成特定任务,且行为可预测。硬实时(Hard Real-Time)要求任务必须在截止时间前完成,否则造成灾难性后果(如安全气囊弹出);软实时(Soft Real-Time)允许偶尔超时,但影响性能(如视频播放丢帧)。实时性指标包括:中断延迟(从事件发生到ISR执行)、任务切换时间、调度延迟和抖动(Jitter)。
| 类型 | 截止时间 | 典型系统 | OS选择 |
|---|---|---|---|
| 硬实时 | 必须满足 | 汽车ECU、医疗监护 | FreeRTOS、VxWorks(优先级抢占+时间片) |
| 软实时 | 尽量满足 | 多媒体播放、网关 | Linux(PREEMPT_RT补丁)、QNX |
| 混合 | 分任务定义 | 无人机飞控+图传 | Zephyr、RT-Thread(支持优先级位图) |
2.3.2 判断方法:实时性评估与优化
- 测量中断延迟:使用逻辑分析仪测量GPIO触发到ISR置位的时间,典型Cortex-M应<1μs。
- 分析任务最坏执行时间(WCET):通过静态分析或插桩测量,确保所有任务WCET之和小于调度周期。
- 优先级反转处理:使用互斥量时启用优先级继承,或使用无锁队列。
- 关中断时间:驱动中临界区关中断时间应<10μs,否则影响实时性。
__DSB()和__DMB()屏障指令。
2.3.3 案例拆解:FreeRTOS任务调度优化
场景:一个平衡车系统,包含姿态传感器(IMU)读取任务(1kHz)、PID控制任务(1kHz)、蓝牙通信任务(100Hz)和OLED显示任务(10Hz)。
初始现象:系统偶发抖动,导致电机噪声增大。通过Tracealyzer工具分析,发现蓝牙任务优先级设置过高,频繁抢占PID任务,且OLED显示任务在SPI传输时关中断时间过长(约200μs)。
优化步骤:
- 将PID任务设为最高优先级(抢占式),IMU次之,蓝牙和OLED设为低优先级。
- OLED显示改用DMA传输,关中断时间降至5μs。
- 蓝牙任务中增加消息队列缓冲,避免阻塞。
结果:中断延迟从平均12μs降至3μs,任务切换抖动从±50μs降至±8μs,电机运行平稳。
2.3.4 总结复盘:实时性设计要点
- 中断优先级分组:将紧急硬件事件(如电机过流保护)设为最高优先级,非紧急通信设为低优先级。
- 避免在ISR中做耗时操作:ISR只做标记和唤醒,具体处理放在任务中。
- 使用零拷贝和DMA:减少数据搬移时间。
- 定期审查调度图:使用UML时序图或工具验证所有任务满足截止时间。