【专题1: MCU详解】 之 【1.3.嵌入式存储介质和启动详解】

编程知识 更新时间:2023-05-02 02:28:36
嵌入式工程师成长之路 系列文章 总目录
系列文章总目录
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路
原创不易,文章会持续更新,欢迎微信扫码关注公众号
项目合作技术培训 联系作者

1.嵌入式常见的存储结构


MCU和上图的存储结构是一样的。

(1)内存
iRAM、内存1都属于内存,一般称为RAM,内存可以通过C语言指针进行访问。

iRAM一般是SRAM(静态内存),它集成在了SoC或MCU内部(虽然是在内部。但也是直接接在cpu的地址总线上的);上电之后不用通过软件初始化,就直接可以把代码放到iRAM中运行,但掉电数据会全部丢失。

内存1一般是DRAM(动态内存),它是直接接在cpu的地址总线上;上电之后不能直接使用,必须通过软件进行初始化,初始化好之后才可以把代码放到DRAM中运行,掉电数据会丢失。

既然SRAM不用软件初始化就能使用,那为什么不全部使用SRAM?还非得加上使用更为麻烦的DRAM呢?因为静态内存价格比动态内存高非常多,好用的东西总是更贵的。

(2)外存
iROM、外存2、外存3都属于外存,外存一般被称为flash或是ROM,数据掉电不会丢失。

iROM一般是nor Flash,它集成在了SoC或MCU内部;上电之后不用通过软件初始化,就可以直接把代码放到iROM中运行,并且掉电后数据不会丢失。它和iRAM的特性类似,但掉电数据不会丢失,也可以通过C语言指针访问(除外存3之外,其他的存储介质都是IO和内存统一编址的,都可以通过C语言指针的方式来访问)。

外存2和iROM的特性是一样的,只不过它在SoC外面。它也是直接连到了地址总线上,可以通过C语言指针访问。

外存3:通过专门的接口和SoC或MCU相连,譬如有spi接口的flash、eeprom、台式机硬盘、Nand/inand/U盘/SSD(台式机中固态硬盘)。初始化好之后,可以根据对应的接口的时序对其进行读写。

2.ROM和RAM的区别

RAM是可读可写的随机存储器,随机访问的意思是:对于512M的地址空间,想要访问哪个地址就能立马访问哪个地址。和随机访问相对的是顺序访问,顺序访问:对于512M的地址空间,假如我要访问第100地址的内容,必须把前面的100个地址的内容全部先访问到,然后才能访问第100地址处的内容,也就是说不能随机访问,不能想访问哪个就访问哪个。RAM一般都是用来放数据段的。

ROM是只读存储器,只读的意思不是真的不能读,而是不能像读RAM那样采用地址进行访问(RAM直接和cpu地址总线相连,给出地址就可以访问,而ROM要按照一定的时序进行访问,譬如spi接口的flash,就需要使用spi接口的时序来访问该flash)ROM主要用来放代码段。

3.系统是如何启动的

其实介绍这么多关于存储介质的内容,就是想搞清楚一个问题,cpu或SoC或MCU上电之后到底是怎么样启动的?

读大学一年级的时候就一直有个问题困扰了我很久:不上电或断电的时候,内存里面是没有数据或代码的。因为外存断电数据不会丢失,所以我们的程序是放在外存的(譬如操作系统放在C盘,所以我们也称C盘为系统盘)。

那问题来了,系统一上电,外存是不能用的,因为没有被初始化;初始化外存,就需要运行代码,而代码是运行在内存上的,但此时代码还在外存上,代码并没有从外存被搬到内存上,系统肯定是无法启动的,那为什么我们的电脑或平板能正常启动呢?当时之所以会有这个疑问,主要是因为不了解这些存储介质的特性。

(1)电脑的启动过程:

第一步:电脑一上电,首先会运行BIOS里面的程序
BIOS的存储介质就是nor Flash(或是和它有一样特性(上电不用使用代码初始化,可以直接使用,断电数据不会丢失,和cpu地址总线相连)的东西),所以电脑一上电,可以直接从BIOS里面读取代码。

为什么一上电就会从BIOS处读取代码呢?cpu就是这样设计的(你问我,我也只能去问intel那帮工程师了),只要一上电就直接跑到BIOS的首地址处开始运行代码(嵌入式领域也称这个机制为reset复位),这是cpu设计公司(譬如intel)他们设计好了的。

那BIOS的程序哪里来的?

BIOS里面的程序,我们称之为启动代码,也称为bootloader。这个代码是电脑厂家出厂前就预置好的。我们自己重装系统(所谓的重装系统,指的是,BIOS将flash中C盘分区的操作系统擦除,然后把新操作系统写到C盘中),也就是通过BIOS里面的刷机代码(从U盘中将操作系统代码写到C盘中),正是因为有BIOS的存在,我们才能反复自己重装系统。如果BIOS被破坏了,电脑就真的成砖头了,必须返厂才能修。

第二步:初始化硬盘和搬操作系统。
因为nor flash的价格是很贵的,所以它的大小很小,也就意味着里面的代码很少。这也是为什么操作系统不直接放在nor flash中的原因。

运行BIOS时,BIOS里面的代码会先初始化DDR内存,因为做内存的厂家就那么几家,所以电脑厂家可以把所有内存厂家的初始化代码都放在BIOS上,BIOS通过内存条的某些特定的信息来区分需要执行哪段初始化代码。

初始化好DDR内存之后,再初始化好硬盘(和初始化内存同样的道理)。

BIOS再把硬盘中C盘的操作系统原封不动的搬到DDR中,此前已经初始化好DDR和硬盘了,当然可以在他们两者之间搬东西了。

第三步:跳转到操作系统处执行代码。
DDR和硬盘都初始化之后,并且windows操作系统也被BIOS搬到DDR中之后,cpu再执行一个跳转指令,直接从BIOS存器介质中跳转到了DDR存储介质中。

到目前为止,电脑启动完毕。

(2)复杂嵌入式设备(譬如手机或智能电视)的启动过程:

和电脑的启动相比,复杂嵌入式设备的处理器内部多了一个静态内存iRAM,电脑的硬盘(机械硬盘或固态硬盘)也被替换成了flash。为什么会有这些差别呢?

首先,nor flash的价格非常贵,一台电脑动辄几千元,用得起nor flash。但嵌入式设备,对价格非常敏感,能省一分钱就省一分钱,所以就不用nor flash了。可能很多人对一块钱两块钱没什么概念,但其实电子设备出货量非常大,譬如一年出货2000万台,如果省一块钱,一年就能省2000万,这将直接导致这家公司是盈利还是亏本。深圳太多这样的公司了…

SRAM的价格比nor flash价格低很多。没有nor flash,系统是怎么启动的呢?
以S5PV210(三星出的一款cortex-A8架构的处理器)为例,SoC内部有一段内置代码,内置代码称为bl0。这个内置代码负责初始化nand flash(nand flash价格非常便宜)和DDR,初始化好他们之后,再把nand flash中的bootloader,也就是uboot的一部分搬到iSRAM中。

为什么只搬一部分?因为uboot太大了,一般有几百KB,而iSRAM一般只有几十KB,所以只能搬一部分。搬好之后,再跳转到iSRAM中运行uboot,我们把这部分uboot代码称为bl1,bl1会初始化系统部分外设,然后把uboot的所有代码都搬到DDR中,再跳转到DDR中运行刚刚没有运行完的uboot代码,这段代码称为bl2,bl2会初始化好大部分外设,并把linux操作系统搬到DDR中,搬操作系统的过程也就是加载Linux内核的过程。

加载完linux内核后,直接一个长跳转,跳转到Linux内核的入口函数中执行了。

这个过程其实非常复杂,三星推荐的方式是把一口气把uboot直接搬到iSRAM中,iSRAM是96KB,对于小于96KB的bootloader,确实可以这样做。但出于成本考虑,绝大多数的复杂嵌入式设备都是使用免费开源的uboot作为bootloader的,而uboot一般是几百KB,所以我们才需要分两次加载,这种方式也被称为分散加载。

(3)51单片机或STM32等嵌入式设备的启动方式:
这种设备的启动方式就简单多了,因为这种系统通常跑裸机,一个产品的代码量可能不到100KB,所以都用最贵的。譬如STM32F103RBT6,有128KB的iROM和20KB的iRAM,都是上电就直接能用的。

所以我们在开发51或stm32时,压根就没有初始化内存和外存这一说。编写好代码之后,直接把所有代码都事先下载到iROM中,代码运行时,函数内部产生的局部变量直接放在iRAM中,非常完美。初学阶段理解到这一层就行了。

但工作后,真正做过产品就会遇到这种需求:程序是在电路板上的MCU内部的,电路板是被产品外壳包围着的,那如果产品的代码需要升级(譬如开发了新功能或解决了bug),如果产品升级需要拆外壳那是反人类的设计。

那要怎么做升级呢?你可能会说,把jtag的接口或串口下载的接口流出来,方便日后产品升级。但你要知道,你作为一个开发人员,你是没有那么多时间去给每一个产品升级的。所以必须再招聘一个现场工程师或产品售后点的售后工程师,但现场工程师可能并不具备嵌入式专业的技能,所以需要重新考虑代码架构了。

所以我们重新对这128KB的nor flash进行重启划分(分区)。

划分为bootloader和app区,并且还需要专门开发一个上位机软件用于更新程序。出于保密,这个上位机还不能直接烧写bin文件或hex文件格式的数据,如果你直接把bin文件给售后点 了,是不是意味着产品固件泄露了。

如果程序不小心超过128KB,要怎么办呢?

不要着急,关于上面的这些内容我会专门写几篇文档来详细把这个问题解释清楚。

4.存储部署总结

(1)内存
SRAM:静态内存,容量一般比较小,价格高;优点是不需要软件初始化,上电直接就能使用。

DRAM:动态内存,容量大,价格低,缺点就是上电后不能直接使用,需要软件初始化后才能使用。

(2)外存
NorFlash:特点是容量小,价格高,优点是可以和CPU直接地址总线式相连,CPU上电后,可以不用进行初始化直接上电进行读写操作。所以一般用作启动介质。

NandFlash(跟硬盘是一样的):特点是容量大,价格低,但它不是和CPU直接总线式相连,就不能直接总线式访问。并且上电后要先进行初始化才能使用,读写也是按照一定的时序来操作的。

(3)单片机、嵌入式和PC机对存储器的需求
单片机:内存需求量小,而且希望开发尽量简单,适合全部的内存都直接使用SRAM

嵌入式系统:内存需求大,而且没有NorFlash等可作为启动介质的东西存在。

PC机:内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部使用DRAM。

(4)单片机、嵌入式和PC机的存储器部署
单片机:很小容量的NorFlash+很小容量的SRAM。例如STM32等单片机在开发的时候就不需要关注外存和内存的初始化,譬如128KB的flash(iROM)和20KB的内存(iRAM)的stm32芯片比较常见。

嵌入式系统:因为NorFlash很贵,所以现在很多的嵌入式系统倾向于不用NorFlash,直接是:外接大容量的Nand+外接大容量的DRAM+SoC内置的SRAM。

PC机:很小容量的NorFlash(也就是BIOS)+很大容量的硬盘(类似于NandFlash)+大容量的DRAM。

5.常见外存总结

NorFlash:因为直接和CPU地址总线相连,并且和内存的访问方式是一样的,速度还行,所以一般用来做启动。

NandFlash:分为SLC和MLC。SLC价格更贵,容量一般也比较小,但是更稳定,性能更好。而MLC容量可以做得很大,并且价格低,但是不是很稳定,性能不是特别好,使用的时候必须使用校验算法进行校验。

sd卡/TF卡/MMC卡:手机中使用的sd卡,各自的大小性能等参数有所不同。

eMMC/ inand/ moviNand:
(1) eMMC:embeded MMC,也就是嵌入在SoC中的MMC卡,即将一张sd卡做成了一块芯片,然后直接嵌入到了SoC的内部,然后就成了eMMC。另一方面eMMC也是一种国际做eMMC芯片的协议。

(2) iNand是美国SanDisk公司出产的eMMC。

(3) moviNand是三星公司出产的eMMC。

6.Nandflash和eMMC/inand/moviNand的区别?

Nandflash就是一块单纯的flash,而eMMC/inand/moviNand是一块flash + 一个微处理器的集成,在eMMC/inand/moviNand的内部有一块小的CPU,用来管理flash的坏块和访问时的校验。

使用eMMC/inand/moviNand比使用Nandflash要更简单,因为flash的坏块管理以及校验都不用我们来做。

oneNand:三星自己出的一套制作eMMC的标准,然后根据自己的这套标准自己生产的eMMC卡,也就是oneNand。

eSSD:符合eMMC标准的SD卡,也就是将固态硬盘做成芯片,可以将它集成到SOC中。

SATA硬盘:机械式硬盘,磁存储原理。

EEPROM:读写速度较快,断电数据不会丢失,读写接口比较简单。

很多人在学习cortex-A系列的cpu时,想不明白为什么启动要整这么复杂,其实这不是工程师造成的,而是在需要考虑产品成本和存储介质自身特性之后,我们迫不得已做出的最优选择,也许以后,上电就能用的存储介质价格很便宜时,就可以不用整得这么复杂了。

更多推荐

【专题1: MCU详解】 之 【1.3.嵌入式存储介质和启动详解】

本文发布于:2023-04-25 06:58:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/43b1619db442f8bb6d5a04c993782eab.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:详解   嵌入式   专题   存储介质   MCU

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 102327文章数
  • 26159阅读数
  • 0评论数