芯片的XIP与BootRom启动方式

news2025/1/12 20:40:24

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)0x90000000

typedef 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 0x70000000

void 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://www.coloradmin.cn/o/601868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elsevier期刊中,撰写Author Statement

Author Statement或Authorship Contribution通常指作者声明&#xff0c;用于声明当前学术论文中每位作者的贡献。 大部分期刊都要求作者在首次投稿的时候就添加这部分内容&#xff0c;也有一些仅要求在发表之前提交。作者声明指导与模板有些学术期刊会专门提供具体的作者声明模…

Vue3 mixin 自定义指令 teleport

文章目录 Vue3 mixin & 自定义指令 & teleportmixin 混入简单使用 自定义指令简单使用全局注册参数 teleport 传送门简单使用 Vue3 mixin & 自定义指令 & teleport mixin 混入 mixins 选项接受一个 mixin 对象数组。这些 mixin 对象可以像普通的实例对象一样…

【企业化架构部署】Apache网页优化

文章目录 一、Apache网页优化概述1.优化内容2.网页压缩2.1gzip概述2.2作用2.3Apache的压缩模块概述mod_gzip模块与mod_deflate模块 3.配置网页压缩功能3.1启用网页压缩功能步骤3.2具体操作步骤 4.配置网页缓存功能4.1启用网页压缩功能步骤4.2具体操作步骤 二、Apache安全优化1.…

【JVM】.class类文件是如何被加载的?

一、类加载过程 .class文件最终加载到JVM并使用整体步骤及图示如下&#xff1a; 每个步骤所做的事情如下&#xff1a; 1、加载 &#xff08;1&#xff09;通过一个类的全限定名来获取该类文件的二进制字节流&#xff1b;&#xff08;读取class文件到内存中&#xff09; &am…

点击这里!解锁海量数据在openGauss Developer Day 2023的高光时刻

5月26日&#xff0c;openGauss Developer Day 2023在此起彼伏的掌声中圆满落幕。最前沿的核心产品、最深度的专业解读、最全面的落地案例......海量数据在此次盛会上时时高光&#xff0c;事事精彩&#xff0c;尤其是在专场分论坛上&#xff0c;数据库领域各路精英济济一堂&…

linuxOPS基础_linux文件检索及筛选

find命令 查找文件 主要功能&#xff1a;当我们查找一个文件时&#xff0c;必须使用的一个命令。 find 搜索路径 [选项]选项选项说明-name指定要搜索文件的名称&#xff0c;支持*星号通配符&#xff08;Shift 8&#xff09;-type代表搜索的文件类型&#xff0c;f代表普通文件…

使用开源代码和开源软件如何选择开源许可证

常用的开源许可证 世界上的开源许可证大约有近百种&#xff0c;如何使用开源代码和开源软件并正确理解、遵守这些开源许可证赋予的权利和义务是个比较繁琐的问题&#xff0c;我们对其中主要的六种许可证GPL、BSD、MIT、Mozilla、Apache和LGPL做个简单的梳理&#xff0c;对比一下…

什么是企业移动化管理 (EMM)

什么是EMM或企业移动化管理 企业移动化管理 &#xff08;EMM&#xff09; 是组织用来保护公司拥有和员工拥有的移动设备上的敏感公司数据的一组策略和做法。Mobile Device Manager Plus 是一个全面的 EMM 解决方案&#xff0c;允许 IT 团队和管理员跨多个平台管理设备&#xf…

推进产业发展健全服务体系,中国信通院数字员工评测工作正式启动

数字技术与应用正在快速重塑全新的经济发展格局&#xff0c;创新应用人工智能、大数据、云计算等新兴技术是企业实施数字化转型的重要策略之一。 “数字员工”是数字生产力与创造力体系的核心要素&#xff0c;自动化、智能化的执行模式将成为企业业务运营的新常态。随着数字员…

外包实在是太坑了,划水三年,感觉人都废了

先说一下自己的情况&#xff0c;专科生&#xff0c;19年通过校招进入杭州某个外包软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…

革命性3D打印数据处理软件 CHITUBOX Pro 1.3.0 Crack

CHITUBOX PRO登场 革命性的3D打印数据处理软件&#xff0c;让你发挥3D打印的无限潜力 支持多种主流CAD文件格式 除了传统的stl和obj文件&#xff0c;CHITUBOX Pro还支持导入各种主流的CAD文件格式&#xff0c;包括3ds、3mf、3dm、stp、step、wrl、x3d、sat、sab、dae、dxf、fb…

5.2.5 IP数据报(三)IP数据报的分片与重组

5.2.5 IP数据报&#xff08;三&#xff09;IP数据报的分片与重组 前面我们在学习IP数据报的格式中&#xff0c;提及了数据报的分片&#xff0c;这里我们要弄明白几个问题 为什么要分片&#xff1f; 前面我们已经解释过&#xff0c;如图 因为在数据报传送的过程中如果总长度超出…

Sui教育资助计划:共同构建Web3教育的未来

Sui教育资助计划旨在通过与社区成员一起构建公开的教育资料&#xff0c;加速推广Web3&#xff0c;并支持Sui生态系统的发展。 内容类别 包括教程、指南、视频以及文本等形式的教育材料包括学习奖励和其他体验式的教育产品&#xff0c;将学习游戏化可帮助开发人员加快构建速度…

基于matlab使用差分波束成形技术形成线性差分麦克风阵列

一、前言 本示例展示了差分波束成形的基本概念&#xff0c;以及如何使用该技术形成线性差分麦克风阵列。 二、加法与差分麦克风阵列 麦克风阵列已部署在许多音频应用中。根据布局的不同&#xff0c;麦克风阵列可分为两大类&#xff1a;加法麦克风阵列和差分麦克风阵列。附加麦克…

机器视觉陶瓷检测设备稳定性怎么样?不稳定因素有哪些?

机器视觉陶瓷检测设备是一种利用现代计算机视觉技术对陶瓷产品进行快速、高效的缺陷检测的设备。相比传统的人工检测方法&#xff0c;机器视觉陶瓷检测设备具有检测速度快、精度高、可靠性强等优点&#xff0c;可以大大提高陶瓷生产线的生产效率和产品质量。但是&#xff0c;由…

学成在线(视频处理-需求分析:xxl-job)

需求分析 作业分片方案 任务添加成功后&#xff0c;对于要处理的任务&#xff0c;会添加到待处理任务表中&#xff0c;现在启动多个执行器实例去查询这些待处理任务&#xff0c;此时如何保证多个执行器不会重复执行任务&#xff1f;在上一小节的测试中&#xff0c;每个执行器…

VMware ESXi 8.0U1a Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0 Update 1a Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U1 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u1-sysin/&#xff0c;查看最新版。原…

手动上传海豚调度器资源中心的文件,解决dolphinscheduler资源中心上传大一点jar包的bug问题

手动上传海豚调度器资源中心的文件 1. 登录hdfs的任意服务器节点上传文件 注意&#xff1a;切换hdfs用户 su hdfs2. 上传文件资源到ds的资源中心&#xff08;hdfs上的资源目录&#xff09; 这里示例目录是&#xff1a;/dolphinscheduler/root/resources/gwmDs/demo-shell 示…

客服端向服务端发布、订阅、取消

这里写目录标题 PUBLISH – 发布消息SUBSCRIBE – 订阅主题SUBACK – 订阅确认UNSUBSCRIBE – 取消订阅 PUBLISH – 发布消息 MQTT客户端一旦连接到服务端&#xff0c;便可以发布消息。 每条发布的MQTT消息必须包含一个主题。MQTT服务器可以通过主题确定将消息转发给哪些客户端…

ES教程:从入门到入土

文章目录 一、环境准备1. ES安装 二、基本概念2.1 节点&#xff08;Node&#xff09;Master-eligible nodes与 Master nodeData NodeIngest NodeCoordinating NodeMachine Learning Node 2.2 集群&#xff08;cluster&#xff09;2.3 分片&#xff08;Shard&#xff09;2.4 副本…