芯片的XIP与BootRom启动方式

article/2025/10/14 1:49:14

XIP:execute in place,就地执行,即芯片内执行,指应用程序可以直接在flash闪存中取指然后译码、执行,不必再把代码读到系统RAM中,flash内执行时指Nor flash不需要初始化,可以直接在flash内执行代码,但往往只执行部分代码,比如用于初始化RAM等。所谓片内执行不是说程序在存储器内执行,CPU的基本功能是取指、译码、运行。Nor Flash能在芯片内执行,指的是CPU能够直接从Nor flash中取指令,供后面的译码器和执行器来使用。

NOR Flash和Nand Flash

Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Electrically Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理和需要特殊的系统接口。通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多。

XIP启动与BootRom启动

CPU执行代码是指执行存储在其内存中的代码指令的过程。CPU从高速指令缓存中取出指令,对其进行解码,然后执行指令指定的操作。CPU一条一条地读取指令,执行指令指定的操作,然后继续执行下一条指令,直到程序结束。那这和启动方式有啥关系?不同的启动方式,决定了高速指令缓存里面的指令从哪里来。

XIP eXecute In Place启动

XIP技术需要CPU和flash同时支持, 要能够实现XIP,Flash应该是并行总线接口挂在AMBA上,这个并行总线应有独立的地址线和数据线,且地址线宽度跟Flash大小相对应,类似于DDR或SRAM总线。那么SPI NorFlash为什么能实现XIP,答案就是FlexSPI外设,也就是说需要CPU具备特殊的SPI控制,该控制器实现了串行flash总线到并行总线的转换。为了提升性能控制器内部可以集成类似cache功能的buffer。下图所示为某款CPU的支持XIP的SPI控制器逻辑拓扑。

在这里插入图片描述
XIP启动方式:把指令直接从NorFlash拷贝到芯片的高速指令缓存;

从软件的角度来说,XIP是在外部闪存直接执行代码,就像芯片在内部flash 的地址0x0800 0000直接执行一样,称为“就地执行”。
软件技术实现

用户应用程序代码应链接到目标执行存储器地址(外部QSPI或FMC-NOR闪存)

用户应用程序代码编译的时候链接地址要改成外部闪存的地址,如STM32 H7系统给QSPI Flash在系统总线分配的地址是0x9000 0000,那么代码的地址就要改成0x9000 0000。

例程:该代码是运行在RT-Thread操作系统上的嵌入式系统的启动代码。此代码负责初始化系统,包括 LED0 引脚、闪存和系统缓存。

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <drv_common.h>
#include "w25qxx.h"#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>/* defined the LED0 pin: PB1 */
#define LED0_PIN    GET_PIN(I, 8)#define VECT_TAB_OFFSET      0x00000000UL
#define APPLICATION_ADDRESS  (uint32_t)0x90000000typedef void (*pFunction)(void);
pFunction JumpToApplication;int main(void)
{/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);  //首先使用该rt_pin_mode功能将 LED0 引脚设置为输出模式。/* initialize the flash memory */W25QXX_Init();//使用该函数初始化闪存W25QXX_Init。/* enable the flash memory to be memory-mapped 内存映射 */W25Q_Memory_Mapped_Enable();/* disable instruction cache 禁止指令缓存*/SCB_DisableICache();/* disable data cache 禁止数据缓存 */SCB_DisableDCache();//使用 SCB_DisableICache 和 SCB_DisableDCache 函数禁用指令和数据缓存。 这样做是因为应用程序代码直接从内存映射的闪存中执行,而不是先复制到系统 RAM 中。/* disable the SysTick timer */SysTick->CTRL = 0;//通过将寄存器设置为 0 来禁用 SysTick 计时器。SysTick->CTRL这样做是为了防止计时器在系统启动时生成中断请求。/* set the jump-to-application function to the address of the application's reset handler */JumpToApplication = (pFunction)(*(__IO uint32_t *)(APPLICATION_ADDRESS + 4));//然后将 JumpToApplication 函数设置为应用程序重置处理程序的地址,该地址存储在 APPLICATION_ADDRESS + 4。/* set the main stack pointer (MSP) to the address of the application's initial stack pointer */__set_MSP(*(__IO uint32_t *)APPLICATION_ADDRESS);//使用 __set_MSP 函数将主堆栈指针 (MSP) 设置为应用程序初始堆栈指针的地址。/* jump to the application */JumpToApplication();//最后,系统使用 JumpToApplication 函数跳转到应用程序代码。 main函数末尾的return RT_EOK语句用于表示main函数已成功完成并返回RT_EOK错误代码。 在这种情况下,它没有被使用,因为系统已经跳转到应用程序代码并且不再执行启动代码。return RT_EOK;
}

总体而言,此启动代码为运行在 RT-Thread 操作系统上的嵌入式系统提供了基本设置。 它初始化系统,设置闪存,禁用缓存,禁用 SysTick 定时器,并跳转到应用程序代码。 该代码使用 rtthread.h、rtdevice.h 和 rtdbg.h 头文件访问 RT-Thread 库中的函数和宏,以及用于特定板和设备的 board.h、drv_common.h 和 w25qxx.h 头文件 驱动程序定义。

BootRom启动

从 ROM 引导:这是一种传统方法,其中程序指令存储在只读存储器 (ROM) 芯片中,然后复制到 RAM 中执行。这种方法需要 ROM 和 RAM,但具有只需更换 ROM 芯片即可更新固件的优点。

从SD卡启动:这种方法将固件存储在SD卡上,然后将其复制到RAM中执行。这种方法常用于需要大量固件存储的系统,具有只需更换 SD 卡即可更新固件的优点。

华邦也有SD Nand,把SD卡做成板载的形式,传输性能更好,如果MPU处理音视频性能可以得到释放;当然价格也比同容量的Nand更贵.
从NAND/NOR闪存启动:这种方法将程序指令存储在NAND或NOR闪存芯片中,并将其复制到RAM中执行。这种方法类似于从 ROM 引导,但具有能够在不更换芯片的情况下在系统内更新固件的优点。

Nand Flash启动例程:

#include "stm32f4xx_hal.h"#define NAND_FLASH_ADDRESS 0x70000000void NAND_Start(void)
{/* Disable I cache and D cache */SCB_DisableICache();SCB_DisableDCache();/* Initialize NAND flash */HAL_NAND_Init();/* Get the address of the boot loader from NAND flash */pFunction JumpToApplication = (pFunction)(*(__IO uint32_t *)(NAND_FLASH_ADDRESS + 4));/* Set the main stack pointer to the address in the vector table of the application */__set_MSP(*(__IO uint32_t *)NAND_FLASH_ADDRESS);/* Jump to the application */JumpToApplication();
}

下面简单解释一下代码:

首先禁用I cache和D cache,保证NAND flash数据被正确读取。

HAL_NAND_Init,使用STM32Cube HAL 中的函数初始化 NAND 闪存。

接下来,引导加载程序的地址从 NAND 闪存的地址处获取NAND_FLASH_ADDRESS + 4。该地址应该是引导加载程序向量表的第一个字,其中包含初始堆栈指针 (MSP) 和复位处理程序地址。

然后将主堆栈指针 (MSP) 设置为应用程序向量表的地址。

最后,微控制器通过调用JumpToApplication函数跳转到应用程序。

为什么要禁用I-Cache 和D-Cache?

I-Cache 和 D-Cache 被禁用,以确保处理器可以直接从 NAND 闪存中读取数据和指令。启用缓存后,处理器将在访问 NAND 闪存之前尝试从缓存中读取数据,这可能会导致操作不正确或数据损坏。禁用缓存可确保处理器直接访问 NAND 闪存,并有助于防止因访问可能已过时或与 NAND 闪存中存储的实际数据不一致的缓存数据而导致的任何潜在问题。

解释__set_MSP

__set_MSP 宏是 ARM Cortex-M 处理器系列(包括 STM32 系列微控制器)提供的标准 C 库函数。 用于设置主栈指针(MSP)的值,即主栈在内存中的栈顶地址。 主栈是处理器在程序执行过程中用来存放函数调用参数、返回地址、局部变量等临时数据的地方。

MSP 是 Cortex-M 处理器架构的重要组成部分,因为它决定处理器在调用函数时从何处开始为新堆栈帧分配内存,以及在函数返回时在何处查找返回地址。

在此代码中,__set_MSP 函数用于使用应用向量表的起始地址初始化 MSP,该向量表存储在闪存中的 APPLICATION_ADDRESS。 这样做的目的是确保处理器在执行应用程序代码时使用正确的堆栈和向量表,这些代码存储在闪存中的 APPLICATION_ADDRESS。

NorFlash和Nand Flash对XIP的支持差异?

NorFlash是一种非易失性存储器,支持随机存取,直接从闪存中执行指令。这使其适用于直接从闪存执行指令的 XIP 模式。

另一方面,NAND闪存是一种针对高密度存储进行了优化的存储器,通常用于存储大量数据,但并未针对直接执行指令进行优化。在NAND flash中,指令必须先拷贝到RAM中才能执行,这使得它不太适合XIP模式。

XIP启动与SPI通讯

使用XIP启动方式,SPI通讯在程序启动之后还要一直保持吗?

是的,在系统设计中,建议对启动Flash采用专用通道,不允许复用。

这是因为当高速指令缓存(I-Cache)和高速数据缓存(D-Cache)不够大,有可能无法存放当前程序中所有的指令和数据。因此,芯片必须在程序执行期间不断地从 NorFlash 读取数据,这会降低系统的整体性能。但是,这种方法无需将指令和数据从NorFlash 复制到RAM 中,从而节省了内存空间并缩短了系统启动时间。

如果程序很小,那么程序执行完一个周期之后,所有的指令都被拷贝到了CPU的高速缓存内,往后程序运行的时候将不再从Nor Flash中读取指令和数据,也就释放了对SPI接口的占用。

Flash选型参考维度

NorFlash和NandFlash在项目评估中如何选择,有哪些维度?

首先,最好是Soc厂商支持列表上的芯片,然后参考以下角度。

NorFlash 的优势:

读取速度快:NorFlash 具有快速的随机读取速度,使其适用于 XIP(就地执行)启动模式,在这种模式下,程序直接从闪存中执行。

易于使用:NorFlash 易于与微控制器接口,并具有简单的命令集,使其易于集成到系统中。

高可靠性:NorFlash具有高度的可靠性和稳定性,适合在关键系统中使用。

低功耗:NorFlash 功耗极低,适合用于电池供电设备。

NorFlash 的缺点:

写入速度慢:NorFlash 写入速度慢,不适合需要频繁写入的应用程序。

昂贵:与 Nand Flash 相比,NorFlash 更昂贵。

Nand闪存的优点:

大容量:Nand Flash存储容量大,适合存储大量数据。

低成本:与 NorFlash 相比,Nand Flash 更便宜,因此对于存储容量很重要的应用来说更具成本效益。

写入速度快:Nand Flash写入速度快,适合需要频繁写入的应用。

Nand Flash的缺点:

接口复杂:Nand Flash接口和命令集复杂,难以与微控制器接口。

可靠性有限:Nand 闪存的可靠性和稳定性水平有限,因此不适合在关键系统中使用。

需要额外的组件:Nand 闪存需要额外的组件,例如闪存控制器,以与微控制器接口,增加了系统的成本和复杂性。

读取速度慢:Nand Flash 随机读取速度慢,不适合 XIP 启动模式。

主要还是看,没有资源冲突不影响性能的情况下,哪个便宜用哪个。


http://chatgpt.dhexx.cn/article/iVTQc2rQ.shtml

相关文章

STM32CubeIDE XiP 和 BootROM介绍, XiP外部内存QSPI FLASH执行用户代码

随言&#xff1a; 目前的电子产品功能越来越多&#xff0c;随之而来的就是代码越来越庞大&#xff0c;代码所需要的存放空间也越来越大。 比如&#xff1a;用ST做GUI界面&#xff0c;面临最大的问题就是芯片内部flash最大才2M。在现在这个时代&#xff0c;2M其实也放不了几张…

mac实用小技巧之解压.xip文件

Mac下解压(.xip)文件 在安装Xcode的时候&#xff0c;我从官网下载了一个Xcode的安装文件&#xff0c;但是这个文件是(.xip)压缩文件&#xff0c;我使用了很多解压软件&#xff0c;都没有解压成功&#xff0c;最后上网查看&#xff0c;大家推荐了一种方法 “通用”里有时没有“…

XIP技术介绍

转载&#xff1a;https://blog.csdn.net/wk_kuan/article/details/39692371 1&#xff1a;简介 XIP&#xff0c;executed in place&#xff0c;本地执行。操作系统采用这种系统&#xff0c;可以不用将内核或执行代码拷贝到内存&#xff0c;而直接在代码的存储空间直接运行。采…

XIP技术

转自https://blog.csdn.net/amberman/article/details/8122300 侵删 首先认识下nandflash和norflash&#xff1a; NOR Flash 和 NAND Flash 是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR Flash 技术&#xff0c;彻底改变了原先由EPROM(Electrically Pr…

XIP技术总结

1.XIP eXecute In Place XIP即芯片内执行&#xff0c;指应用程序可以在flash闪存内运行&#xff0c;不必再把代码读到系统RAM中。需要注意的是&#xff0c;片内执行不是说程序直接在flash内执行&#xff0c;CPU的基本功能就是取指、译码和执行。norflash能在芯片内执行&#x…

XIP简介

1、XIP是什么&#xff1f; XIP&#xff08;executed in place&#xff09;本地执行。操作系统采用这种系统&#xff0c;可以不用将内核或执行代码拷贝到内存&#xff0c;而直接在代码的存储空间直接运行。 XIP是一种能够直接在闪速存储器中执行代码而无须装载到RAM中执行的机…

XIP(eXecute In Place)

XIP&#xff08;eXecute In Place&#xff09; 1.什么是XIP ​ eXecute In Place&#xff0c;即芯片内执行、就地执行&#xff0c;是指CPU直接从存储器中读取程序代码执行&#xff0c;而不用再读到内存中。应用程序可以直接在flash闪存内运行&#xff0c;不必再把代码读到系统…

网页游戏设计(HTML5入门)--- 基础知识篇

01 1、网络游戏&#xff08;Online Game&#xff09; 指用户通过计算机互联网进行交互娱乐的电子游戏&#xff0c;通常以互联网为传输媒介&#xff0c;以游戏运营商和用户计算机作为处理终端&#xff0c;以专门的游戏客户端软件或浏览器为信息交互窗口。 2、客户端形式 这一…

计算机基础知识教程

计算机硬件Hardware系统 起源&#xff1a;十九世纪英国&#xff1b; 诞生&#xff1a;1946.2.15&#xff0c;美国宾州大学&#xff1b; 发展&#xff1a;电子管-》晶体管-》集成电路-》大规模集成电路-》超大规模集成电路&#xff1b; 目前&#xff1a;PC系列微型计算机&#x…

HTML5基础网页设计(加代码CSS)

简单网页的模板&#xff0c;多多支持&#xff0c;感谢。知识整理 目录 一、HTML5 简单网页设计&#xff1a; CSS修饰 一、HTML5 简单网页设计&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>简单网页测试…

vue基础知识汇总

一、简介 1.vue是一套用于构建用户界面的渐进式JavaScript框架 2.特点&#xff1a; 采用组件化模式&#xff0c;提高代码复用率、且让代码更好维护声明式编码&#xff0c;让编码人员无需直接操作DOM&#xff0c;提高开发效率使用虚拟DOM优秀的Diff算法&#xff0c;尽量复用DO…

计算机基础知识点总结

系列文章目录 文章目录 系列文章目录一、计算机系统知识计算机组成进制转换数据编码校验码Flynn分类CISC与RISC流水线cache输入输出技术总线结构内存信息安全计算机性能局部性原理 编译原理文法 操作系统基础知识 软件工程软件生存周期系统分析基础&#xff1a;软件测试 计算机…

【WEB前端开发】基础知识大总结(HTML5+CSS3)

本文共一万七千字&#xff0c;十六个内容点&#xff0c;七十个知识点 目录 一、转义字符二、表单标签1、form标签2、input元素3、label 标签4、select 标签5、button 元素 三、语义化标签四、Head标签1、title 标签2、link标签3、style标签4、script 标签5、mate 标签6、base 标…

web开发基础知识

web开发基础知识学习 一、网页开发三剑客 ​ 我们看到的网页通过代码来实现的 &#xff0c;这些代码由浏览器解释并渲染成你看到的丰富多彩的页面效果。 这个浏览器就相当于Python的解释器&#xff0c;专门负责解释和执行(渲染&#xff09;网页代码。写网页的代码是专门的语言…

HTML基础知识总结

原文 经过这段时间的学习&#xff0c;对于html的一些基础知识有了一定的了解。所谓好记性不如烂笔头&#xff0c;唯有一点点累积&#xff0c;才能汇聚成知识的海洋。现在&#xff0c;我对这段时间的学习做一个总结。 一、HTML的定义 HTML&#xff0c;超文本标记语言&#xf…

前端-HTML基础知识详解

每日分享&#xff1a; 不贪婪 凡事皆有度&#xff0c;把握好分寸&#xff0c;学会知足常乐。 目录&#xff1a; 初始常用的HTML标签资源路径列表标签表格标签表单标签表单提交 一、初始常用的HTML标签 小结 学习html语言就是学习标签的用法编写html标签一般用小写html标签…

html5基础知识第四章其他标签

以下内容是学习期间整理&#xff0c;有些语句是便于理解&#xff0c;便于快速入门写的。并不权威。 表格&#xff1a; <table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tb…

HTML5-基础知识

HTML5 author 鲁伟林 一直开发后端&#xff0c;现在开始全栈培养自己。 学习html的网址是&#xff1a;http://www.runoob.com/html/html5-intro.html gitHub地址: https://github.com/thinkingfioa/Notes/tree/master/front-developer/html5 1 HTML5特性 HTML5中的一些有趣的新…

【基础html5 基础知识点】(全)

一、新特性 1. Doctype更简单<!DOCTYPE html> 2. 简单的编码类型 <meta charset”utf-8″ /> 3. 大小写都可 <input tYPe"text" name"" id""> 4. 布尔值 <input type"radio" checked> 5. 可以省略…

HTML5前端知识图谱

HTML5知识图谱 前端知识必备概要HTML5知识概要前端开发知识库体系1. HTML5知识库2. CSS3知识库3. JavaScript知识库4. jQuery知识库5.Node.js知识库6.AngularJS知识库7.React知识库 前端开发知识库细分HTML知识图谱CSS知识图谱1. css 内容排版2. css 布局模型3. css 盒子模型4.…