前言
很多嵌入式初学者都会有两个核心疑问:
1. 嵌入式板子支持 SPI Flash、SD卡、UART、USB 等多种设备启动,CPU 真的能直接运行这些设备里的代码吗?
2. 板子一上电,CPU 执行的第一条指令到底来自哪里?
这两个问题的核心答案,都离不开一个关键概念——XIP 本地执行。本文从基础概念、硬件组成、核心问题拆解到完整启动流程,一次性讲透嵌入式系统底层启动逻辑。
一、XIP 本地执行概念
1. XIP设备(eXecute In Place,本地执行设备)
XIP即原地本地执行,是嵌入式启动最核心的基础概念,也是CPU执行指令的唯一原生方式。简单来说,XIP设备就是可以被CPU直接寻址、直接执行代码,无需提前拷贝到内存的存储设备。
核心特点:设备存储的二进制指令,可被CPU实时读取、直接运行,无需中转、无需搬运,启动响应速度快、逻辑简单。
硬件代表:芯片片内ROM、Nor Flash。
核心定位:嵌入式系统上电启动的基石,负责执行系统第一条指令、完成底层硬件初始化。
2. 非XIP设备
非XIP设备是嵌入式项目中最常用的存储介质,和XIP设备完全相反,CPU无法直接寻址、无法直接执行其中的代码。
核心特点:仅具备数据和代码存储能力,无直接执行权限,必须依靠其他引导程序,将内部代码搬运至内存后,CPU才能执行。
硬件代表:SPI Flash、SD卡、U盘、NAND Flash。
核心定位:长期存储系统程序、用户固件、业务数据,是嵌入式系统的“硬盘”。
二、嵌入式系统硬件整体组成
嵌入式主控芯片基本都是 SOC(片上系统),即将 CPU、存储、各类控制器、外设接口全部集成在一颗芯片内,这也是嵌入式体积小、集成度高的核心原因。
1. SOC 核心硬件模块
一颗完整的 ARM 嵌入式芯片,核心集成部件如下:
CPU:核心运算执行单元
片内 ROM:只读存储器,XIP设备,存放出厂固化启动代码
片内 RAM:高速临时内存,用于临时缓存代码和数据
DDR 内存控制器:管控片外DDR内存
SD/MMC 控制器:驱动 SD 卡设备
SPI 控制器:驱动 SPI Flash 存储设备
USB 控制器:支持USB存储设备启动
UART 控制器:串口调试、串口启动
中断控制器:管理系统各类中断
2. 嵌入式SOC vs PC 硬件架构类比
很多人熟悉PC架构,通过类比可以快速理解嵌入式硬件逻辑:
嵌入式SOC | PC电脑 | 作用 |
|---|---|---|
片内ROM启动代码 | BIOS芯片 | 上电初始化硬件,引导系统启动 |
CPU | CPU | 指令运算与执行 |
片外DDR | 电脑内存条 | 程序运行内存 |
SPI Flash/SD卡 | 电脑硬盘 | 存储系统程序与用户数据 |
三、嵌入式系统完整启动流程详解
嵌入式系统支持SPI Flash、SD卡、USB、UART等多种启动方式,所有非XIP设备启动逻辑完全一致,全程依靠片内ROM引导完成,以下是标准化上电启动全流程:
1. 上电复位,执行第一条指令
板子上电瞬间,硬件强制将CPU程序计数器指向片内ROM起始地址,CPU直接执行ROM中的固化代码。这是系统上电的第一条指令,也是所有嵌入式启动的起点。
核心关键点:片内ROM是唯一出厂固化、原生支持XIP的设备,是CPU上电唯一可直接执行的程序载体。
2. ROM程序完成底层硬件初始化
ROM固化程序作为一级引导程序,优先完成基础硬件初始化,为后续代码加载、程序运行铺垫环境:
初始化系统时钟:提升CPU、各类外设的工作频率,保障硬件正常工作;
初始化DDR内存:DDR上电无默认工作状态,必须初始化后才可读写使用;
初始化外设硬件:配置SD卡、SPI、看门狗等启动相关外设,打通设备通信通道。
3. 筛选启动设备(多启动方式适配)
芯片支持多设备启动,ROM程序会通过硬件配置自动选择启动源,行业通用三种适配方式:
方式一:跳线/拨码开关手动指定单一启动设备;
方式二:预设设备列表,按顺序逐个检测可用启动设备;
方式三:厂商固化固定启动优先级,无需用户配置。
4. 解析固件信息,搬运代码至内存
确定启动设备后,ROM程序读取设备内的固件程序,解决加载地址、加载长度两大核心问题:
固件头部自带配置信息,明确程序需要加载的内存地址、有效数据长度;无自定义配置时,默认加载至芯片固定内存位置、固定长度;
设备内程序存储格式分为两种:原始二进制(raw bin)格式、分区文件格式。
最终将非XIP设备中的完整固件代码,搬运至片内RAM或片外DDR内存中。
5. 跳转执行用户程序,完成启动
代码搬运完成后,ROM引导程序完成全部工作,CPU跳转至内存指定地址,开始执行加载好的系统固件/业务程序,嵌入式系统正式启动完成。
四、二者核心本质区别(XIP与非XIP启动逻辑)
1. 执行逻辑本质区别
XIP设备启动:无需代码搬运,CPU直接读取设备内指令运行,启动流程极简、实时性极强;
非XIP设备启动:无直接执行权限,必须依靠ROM引导程序完成硬件初始化、代码搬运、内存加载,间接实现系统启动。
2. 硬件能力本质区别
XIP设备:可被CPU直接寻址,兼具存储和可执行属性,适合存放启动引导代码;
非XIP设备:仅具备纯存储属性,无法被CPU直接寻址,仅适合存放大容量固件和数据。
3. 应用场景本质区分
XIP设备:仅用于系统初始启动引导,存放固化、固定逻辑的启动代码,不存放用户业务程序;
非XIP设备:是嵌入式主力存储介质,存放系统程序、用户业务代码、多媒体数据,适配绝大多数项目启动场景。
五、常见误区答疑
误区1:SPI Flash/SD卡可以启动系统,说明CPU可以直接执行其代码?
错误。SPI Flash、SD卡均为非XIP设备,CPU永远无法直接执行其代码。设备能启动系统,核心是依靠片内ROM中转搬运代码,并非CPU直接读取执行。
误区2:系统启动代码存放在SD卡/SPI Flash,上电优先执行这里的代码?
错误。嵌入式上电优先级固定:片内ROM代码优先执行,这是硬件固化机制,无法修改。外部存储设备的代码,必须等待ROM程序初始化、搬运后才可执行。
误区3:所有Flash都是XIP设备?
错误。仅Nor Flash支持XIP本地执行,常见的SPI Flash、NAND Flash均为非XIP设备,不具备直接执行能力。
六、核心知识点总结
XIP核心:原地执行,无需拷贝代码到内存,CPU可直接寻址执行
设备区分:ROM、Nor Flash为XIP设备;SPI Flash、SD卡、U盘为非XIP设备
上电第一指令:永远来自芯片片内ROM,这是嵌入式启动的核心基石
非XIP启动原理:ROM初始化硬件 + 搬运代码到内存 + 跳转执行
多启动方式本质:只是ROM支持的外设读取方式不同,底层启动逻辑完全一致
后续会持续更新ARM架构与编程,感兴趣的可以点赞收藏+关注。