如何选择嵌入式产品中的存储器类型?
摘要:Flash存储器是一种非易失性内存,其作为数据、系统存储的关键介质,在嵌入式系统中扮演着重要角色。常见的Flash有NAND Flash 、Nor Flash、eMMC等,本文将简单介绍不同Flash的区别及应用场景。
图1 HD6Q-CORE ARM核心板板载Flash
1. NAND Flash
按照接口区分,NAND Flash分为串行和并行两种,串行就是每次传输1 bit,并行就是每次传输多位。下图的并行Flash采用8bit的数据位宽,并配合RE/WE等读写信号进行数据的读写。串行Flash管脚较少,多采用SPI或者QSPI接口进行通信。一般来讲,并行Flash的容量要高于串行Flash。
图2 并行NAND Flash接口
图3 串行NAND Flash接口
按照颗粒密度区分,并行NAND Flash可以分为SLC、MLC、TLC、QLC等,其中SLC、MLC颗粒较为常用。
图4 SLC、MLC、TLC、QLC
第一代SLC(Single-Level Cell)每单元可存储1比特数据(1bit/cell),性能好、寿命长,可经受10万次编程/擦写循环,但容量低、成本高,市场上用的比较少;第二代MLC(Multi-Level Cell)每单元可存储2比特数据(2bits/cell),性能、寿命、容量、成各方面比较均衡,可经受1万次编程/擦写循环,目前主流的核心板厂商大都配置该类型的存储;第三代TLC(Trinary-Level Cell)每单元可存储3比特数据(3bits/cell),性能、寿命变差,只能经受3千次编程/擦写循环,但是容量可以做得更大,成本也可以更低,大多数固态硬盘的选择;第四代QLC(Quad-Level Cell)每单元可存储4比特数据(4bits/cell),性能、寿命进一步变差,只能经受1000次编程/擦写循环,但是容量更容易提升,成本也继续降低。2.Nor Flash
NOR Flash是一种非易失闪存技术,是Intel在1988年创建。是市场上两种主要的非易失闪存技术之一。按照接口区分, Nor Flash也可以分为并行和串行两种。由于并行Nor Flash易存在兼容性问题,现已逐渐淘汰,目前常用的Nor Flash通常指串行Flash,即SPI Flash,其接口定义和图3一致。
与NAND Flash相比,Nor Flash容量较低,且读写速度和擦写速度较慢。不同于NAND Flash的是,NOR Flash支持Execute ON Chip,程序可以直接在Flash片内执行,因此很适合作为嵌入式系统中的程序启动介质。
表1 NAND Flash &Nor Flash 存储介质对比表
eMMC
eMMC 本质上还是Nand flash ,数据接口支持1bit、4bit和8bit三种。eMMC=Nand flash +闪存控制芯片+标准接口封装,其内部集成的闪存控制器具有读写协议、擦写均衡、坏块管理、ECC校验、电源管理、时钟管理、数据存取等功能,极大降低了Nand-flash的使用难度。
图5 eMMC架构
在嵌入式系统中,Flash除了用来存放数据,还有一个重要的功能就是存放uboot启动程序。一般来讲,系统可以直接从Nor Flash启动,而不能直接从NAND Flash启动。系统要从NAND Flash启动,则需要先将NAND Flash低4K的代码拷贝到CPU内部的SRAM中,然后从SRAM中驱动。再将FLASH剩下的代码拷贝到SDRAM中,从SDRAM开始执行main函数,启动流程如下图所示。
图6 NAND Flash启动方式
一般来讲,当主控制所需搭配的存储容量较低时(如256M、512M),通常选择Nand flash。当主控制所需搭配的存储容量较高时(如4GB、8GB甚至32GB),选择eMMC将更具性价比。
海思Hi35xx uboot启动分析总结
liwen01 2019.12.09
前言
在嵌入式linux设备中,uboot的最终目的就是启动kernel。对于uboot而言,没有人把它引导起来,所以uboot首先需要把自己加载起来,然后再去引导kernel的启动,这也就可以大致的分为Uboot启动的第一阶段和第二阶段。
(一)start.S第一阶段启动总结
在海思hi3251a官方的《Hi3521A_PINOUT_CN》手册上有上电锁存管脚BOOTROM_SEL,这个是引脚用来定义是从BOOTROM启动还是从spi flash启动 。
(1)BOOTROM启动
当启动模式为从 BOOTROM 启动时,海思的BOOTROM的程序会去初始化串口,然后与海思的HiBurn工具建立通信
如果能建立通信,则启动HiBurn升级uboot程序流程,如果不能与HiBurn建立连接,等待一段时间之后它就转去从外部的spi flash启动
(2)HiBurn 烧入原理
HiBurn烧入的基本原理是,HiBurn工具与BOOTROM程序建立连接之后,先下载uboot程序的开始4KB数据到海思芯片的内部RAM
然后通过下载的那一小部分uboot代码去初始化外部的DDR,如果DDR初始化成功,HiBurn再将剩下的uboot程序下载到外部的DDR中去
最后是在DDR中启动uboot,如果要进行烧入操作,是通过DDR中的Uboot程序,发送uboot命令将DDR中的uboot程序烧入到外部的flash中去,这样就实现了uboot程序的升级。
(3)spi flash启动
海思的hi3521a芯片支持从 SPI NOR Flash 和 SPI NAND Flash 直接启动,它的启动也就是我们start.s中的大部分实现。主要做的工作有:
初始化CPU相关功能(关缓存,关MMU,设置SVC模式等)将异常中断向量表重定向到内部RAM将uboot代码重定向到外部DDR中设置栈空间清空BSS段最后调用C语言接口去执行C语言代码实现第二阶段的启动。第一阶段在执行之后,在DDR中的映射空间的数据分布如下:(二)start_armboot第二阶段启动总结
在uboot的启动的第二阶段,主要做的是:
初始化变量和结构体重定向环境变量初始化堆管理器初始化环境变量进入命令处理循环在命令处理循环中,默认Uboot是超时等待用户命令输入
如果有检测到命令的输入,则执行相应的命令,如果超时没有命令输入,uboot默认执行的bootm命令进行kernel启动引导。
这里涉及到两个比较总要的点:环境变量的重定向和uboot命令处理。
(1)环境变量重定向
在uboot第二阶段的时候,uboot会去检测flash中环境变量的地址中环境变量是否有效,如果有效,则使用flash中的环境变量值来初始化uboot运行中的环境变量,如果flash中的环境变量无效,则使用默认的环境变量来初始化运行中的uboot。
在uboot的用户命令操作过程中,如果有对环境变量进行修改,都是修改的内存中的那一份环境变量,如果要将修改的环境变量保存到flash中去,则需要运行命令saveenvuboot在flash的分布如下:
uboot.bin烧入到flash的0地址位置,boot.bin里面的数据就是按我们连接脚本中的数据那样分布。在0x80000(512KB)开始的位置就是环境变量的在flash的位置,其大小为256KB。
(2)uboot命令处理
在启动的最后阶段,就是执行uboot的bootm命令,主要就是uboot将kernel程序从flash中复制到内存去,然后就是检验kernel镜像文件的有效性,设置uboot传递给kernel的参数,设置kernel启动的环境(比如关缓存,关中断,CPU处于SVC模式等)
最后就是通过一个函数指针指向kernel的启动地址,调用该函数实现uboot到kernel的运行。
在这个过程中,启动参数和机器码同时传递给kernel,关于参数传递,实际在这里是通过寄存器间参数的地址传递给了kernel。
(3)参数传递
C语言进行函数调用的时候,常常会传递给被调用的函数一些参数,对于这些C语言级别的参数,被编译器翻译成汇编语言的时候,就要找个地方存放一下,并且让被调用的函数能够访问,否则就没发实现传递参数了。对于找个地方放一下,分两种情况。
一种情况是,本身传递的参数就很少,就可以通过寄存器传送参数。因为在前面的保存现场的动作中,已经保存好了对应的寄存器的值,那么此时,这些寄存器就是空闲的,可以供我们使用的了,那就可以放参数,而参数少的情况下,就足够存放参数了,比如参数有2个,那么就用r0和r1存放即可。另外一种情况是,如果参数太多,寄存器不够用,那么就得把多余的参数堆栈中了。即,可以用堆栈来传递所有的或寄存器放不下的那些多余的参数。--------------End--------------
如需获取更多内容
请关注公众号 liwen01
相关问答
spi 总线协议详解?SPI(serialperipheralinterface)是一种同步串行通信协议,由一个主设备和一个或多个从设备组成,主设备启动与从设备的同步通信,从而完成数据的交换。SPI是一...
NRF模块用单片机 SPI 口怎么配置?-ZOL问答要将NRF模块与单片机通过SPI接口连接,需要进行一些配置步骤。以下是一般的配置流程:首先,确保单片机的SPI功能已经启用,并且相关引脚已正确连接到NRF模块。2...
单片机 启动 过程?1上电复位:当单片机上电时,会进行一次复位操作,将所有寄存器和外设初始化为默认状态。2系统时钟初始化:单片机启动后需要配置系统时钟,以确保各个外设能正...
系统1712有什么功能?系统1712是一种加密微控制器,具有多种功能。首先,它主要用于为通过外部SPI闪存启动的操控体系提供更加安全的启动。它基于CEC1712ARMCortex-M4,采用Soteria-...
spi rom什么格式文件?SPIROM的文件格式通常是二进制。SPIROM是一种闪存芯片,用于储存固化的代码和数据,它通常用于嵌入式系统和电子设备中。SPIROM的文件格式是在芯片中储存的数...
固态开卡下载到 spi 失败 - 业百科固态开卡下载到spi失败,1、内存问题:如果电脑内存不足或受损,可能会导致数据无法正确写入或读出固态硬盘。确保电脑内存和硬件连接正常,重新启动电脑后重复操作...
tomcat如何和springboot交互的? - OSCHINA - 中文开源技术交...今天看了tomcat相关资料,发现tomcat主要工作是serversocket监听客户端请求,然后解析http请求再封装request,response再去请求服务端的serv...
STM32中,DMA和IIC好像都是用来传输数据的,有什么区别吗?DMA和IIC是两种完全不同的东西。IIC是一种通讯方式、一种通讯协议,用于芯片之间或者用于板子之间等近距离的通讯。而DMA是一种控制器、单片机的片上资源,是直存...
DMA是什么,有什么功能?DMA(DirectMemoryAccess,直接内存存取)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于CPU的大量中断负载。否则,CPU需要从...
spring boot 启动 优化 - OSCHINA - 中文开源技术交流社区springboot启动优化SpringJavaSpringBoot@SpringBootApplication把上面的注释换成了@Import了,但是不知道import里面填...