存储系列
ROM、RAM、DRAM、SRAM和FLASH的区别_种瓜大叔的博客-CSDN博客_ram和sram的区别
嵌入式开发人员,这些ROM、FLASH、必须了解硬盘技术知识_一口Linux的博客-CSDN博客_emmc mlc
OneNand、Nand和Nor三种Flash的区别_Stone_lu。的博客-CSDN博客_onenand
常见概念:
:Random Access Memory,随机访问存储器,连续电源可以始终保存数据,断电时数据丢失。
:Static Random Access Memory,静态随机存取存储器RAM一种是实现双稳态电路,数据访问速度最快,价格昂贵,常用作缓存。
:Dynamic Random Access Memory,数据保存时间短,需要动态刷新(因为是电容实现,电容不可避免的会充电泄漏),访问速度比SRAM要慢,但比ROM要快。
:Synchronous Dynamic Random Access Memory,比DRAM多了一个同步时钟。
:Double Data-Rate Random Access Memory,双倍速率的SDRAM,数据操作可在一小时内进行两次。
动态RAM常用于主机系统的内存。
:Read-Only Memory,只读存储器,断电后保存数据。
:Electrically Erasable Programmable Read-Only Memory,电可以擦除可编程只读存储器,最小读写单元是字节,读写速度很慢。
:不易失电的存储器,又称闪存,是ROM读写操作的最小单位是风扇区(Sector),而EEPOM读写的最小单位是字节。读得快,比EEPROM快很多NOR Flash和NAND Flash两种。
:读取速度和SDRAM同样,数据总线和地址总线是分开的,可以直接运行装载的代码,间接节省SRAM空间。读写单位为字节,擦除单位为风扇区。
:数据总线与地址总线共用,不采用内存随机读取技术,不能在其中操作程序。
internal rom 内部ROM,指的是集成SoC内部的ROM
internal ram 内部RAM,指的是集成SoC内部的RAM
计算机的rom与硬盘不同,RAM和ROM亲爱的傻瓜分不清吗?_weixin_39807691的博客-CSDN博客
内部存储器 用来运行程序的RAM 举例(DRAM SRAM DDR) SRAM 静态内存 其特点是容量小,价格高。优点是可以直接使用,无需软件初始化。 DRAM 动态内存 特点是容量大,价格低。缺点是上电后不能直接使用,软件初始化后才能使用。 单片机:内存需求小,希望开发尽可能简单,适合所有使用SRAM 嵌入式系统:内存需求大,无NorFlash等待介质启动 PC机器:内存需求大,软件复杂,不在乎DRAM初始化费用适合全部使用DRAM
外部存储器 储存物品 ROM 举例(硬盘 Flash(Nand iNand···· U盘、SSD) 光盘)
NorFlash:其特点是容量小,价格高优点是可以和CPU直接连接总线,CPU上电后可直接读取,一般用作启动介质。 NandFlash(和硬盘一样):容量大,价格低,缺点是不能总线访问,也就是不能上电CPU需要直接读取CPU首先运行一些初始化软件,然后通过时接口读写。
所以一般PC机器都是:容量很小BIOS(NorFlash) 大容量的DRAM 大容量硬盘(类似于NandFlash) 一般的单片机:很小容量的SRAM 很小容量的NorFlash 嵌入式系统:因为NorFlash很贵,所以现在很多嵌入式系统倾向于不使用NorFlash,但直接使用:
模式为:启动介质 内存介质 外存介质
CPU连接内存和外存的连接方式不同。内存需要直接访问地址,因此通过地址总线&连接数据总线的总线访问模式(优点是直接访问和随机访问;缺点是占用CPU地址空间,尺寸有限);外存是通过CPU外存接口连接(优点是不占用)CPU缺点是访问速度不如总线快,访问时间复杂)
内存参数
(硬件和逻辑) 从硬件的角度来看:硬件内存的实现本身是宽度的,也就是说,有些内存条是8,有些是16。然后需要强调的是,内存芯片可以并联,即使是8个内存芯片也可以制作16或32个硬件内存。 从逻辑上讲,内存位宽在逻辑上是任意的,甚至在逻辑上,内存位宽是24位的(但实际上这种硬件是买不到的,没有实际意义)。从逻辑角度来讲不管内存位宽是多少,我就直接操作即可,对我的操作不构成影响。但由于您的操作不是纯逻辑的,而是需要硬件来执行,因此不能为所欲为,因此我们的许多实际操作都受到硬件特性的限制。例如,24位的内存在逻辑上与32位的内存没有什么不同,但实际硬件是32位的,必须根据32位的特点和限制来工作。
内存单元有四个大小单位:位(1)bit)字节(8bit)半字(一般16bit)字(一般是32bit) 在所有计算机和机器中(无论是32位系统、16位系统还是未来的64位系统),位永远是1bit,字节总是8bit。 历史上有三种:16位系统、32位系统和64位系统,还有操作系统windows、linux、iOS等很多,所以历史上很多概念都被混淆了。 建议你不要详细区分单词、半字和双字的概念,只要你知道这些单位依赖于平台的具体位置。在实际工作中,首先在每个平台上找出平台的定义(单词是多少位置,半字总是单词的一半,双字总是单词的两倍大小)。 一般来说,在编程过程中根本不使用单词的概念。我们区分这个概念主要是因为这些概念将用于一些文档。如果没有区别,它可能会导致你对程序的误解。 在linux ARM这个软硬件平台上(我们嵌入式核心课的所有课程中),字是32位的。
我随便给一个数字(比如7),然后说这个数字是内存地址,然后问你内存地址对应的空间有多大。这个尺寸是固定的,也就是字节(8bit)。 如果把内存比作一栋楼,那么这栋楼里的房间就是内存格子,这个格子的大小是固定的8bit,就好象这个大楼里面所有的房间户型是一样的。
C语言中的基本数据类型有:char short int long float double int 整形手术(整数类型,这反映在它和CPU例如,32位的数据位宽是相同的)CPU,整形手术是32位,int就是32位。 数据类型与内存的关系在于: 数据类型用于定义内存中需要存储和操作的变量。因此,数据类型必须与内存匹配才能获得最佳性能,否则可能不工作或效率低下。 最好在32位系统中定义变量int,因为效率高。原因是32位系统本身也有32位内存,这种硬件配置自然适合定义32位int类型变量,效率最高。8位也可以定义char类型变量或16位short类型变量,但实际上访问效率不高。 我们实际定义了许多32个环境bool类型变量(实际上只需要一个)bit够了)都是用的int来实现bool也就是说,我们定义一个bool b1;当编译器实际上帮助我们分配32位内存来存储这个时候bool变量b1.编译器实际上浪费了31位的内存,但优点是效率高。 问题:实际编程应以省内存为主还是以运行效率为主?答案是不确定的。这取决于具体情况。许多年前,内存非常昂贵。机器上的内存很少。当时,编写代码主要是省内存。现在,随着半导体技术的发展,内存变得非常便宜。现在机器配置高,不在乎节省一点内存,效率和用户体验已经成为关键。因此,现在大多数程序都注重效率。
我们在C中int a;定义一个int类型变量必须在内存中分配存储在内存中a。有两种不同的内存分配思路和策略: 第一种:0 1 2 3 &bsp; 对齐访问 第二种:1 2 3 4 或者 2 3 4 5 或者 3 4 5 6 非对齐访问 内存的对齐访问不是逻辑的问题,是硬件的问题。从硬件角度来说,32位的内存它 0 1 2 3四个单元本身逻辑上就有相关性,这4个字节组合起来当作一个int硬件上就是合适的,效率就高。 对齐访问很配合硬件,所以效率很高;非对齐访问因为和硬件本身不搭配,所以效率不高。(因为兼容性的问题,一般硬件也都提供非对齐访问,但是效率要低很多。)
变量和内存的关系
1、变量的属性:声明一条变量,同时给他赋初值int a=0;等价于int a;a=0;从这个例子我们可以看到:
第一个属性:变量是有值的。我们给他赋值为0,就相当于他的内存单元里边存的是0,不再是随机数了。 第二个属性:变量的名,a就是他的名字。 第三个属性:变量的地址,你存到哪里了?值存在哪里? 第四个属性:变量被分配的内存大小;因为不是整个内存都归他管,你到底占多大的内存空间呢?有一个分配的内存大小。 2、变量的类型决定了变量被分配内存空间的大小。内存是计算机内的存储部件,代码和数据都存在其中。
3、内存的特点:所有指令和数据都保存在内存里,速度快,可随机访问,但掉电即失去(掉电就没了)。
内存如何编址呢?你声明一个变量,他可能就分配了一个内存空间,那么他得有个地址。
地址是按照字节编号的,内存中每个字节都有唯一的编号。(就像我们的宿舍不是按照床位编号的,是按房间编号的,没有编制到位而是字节,每一个字节有8位,每个字节都有一个唯一的编号,这个编号就是他的地址,这个地址是一个什么样的数?他是一个整数是无符号的) 地址是一个16进制无符号整数,字长与主机相同,32位计算机的内存地址编码是32位,从0x00000000,到0xFFFFFFFF。(为什么用16进制来表示,因为16进制是2进制压缩的一个版本,用16进制来表示2进制很简单,比较短;字长与主机相同,所以32位计算机呢,他的内存地址编码就是32位;16进制一个符号代表4位,总共8个符号,4x8=32) 按变量声明的类型分配内存空间,大小类似于博士生、硕士生、本科生分配寝室。(按变量声明的类型来分配内存大小,几个字节几个字节。) 4、如何衡量这个内存的大小呢?
计算机存储数据的最基本单元,衡量物理存储器容量的最小单位----------位,也称为比特。那一个位有多大呢?要么是0,要么是1;那我们知道了为什么计算机只能识别0和1,因为它存在里边的就是0和1,他存的不是别的就是0和1,就是二进制。
5、为什么计算机用二进制存储,不用十进制?
第一个原因:双稳态在电器元件中容易实现;(计算机的他的内部的元器件,像三极管、二极管啊他有通和断,就像我们的电灯他有开和闭一样,他两种稳定的状态这样的电气原件很容易实现,但是你想用十进制的话,你必须找到一种电器元件,它能够有10种稳定的状态,很难找。但是两种稳态的电器原件很容易找,二极管通和断等太多了,三极管也是。)
第二个原因:计算机进行二进制运算比进行十进制运算要简单的多。(二进制的话2X2=4就4条0+0,0+1,1+0,1+1就4种。但是10进制的话你得10x10=100种)
6、计算机存储单位:(内存的编址是按字节来编址的,一个字节等于8个比特,8个比特能表示多大的数字呢?最小是0,最大全1的时候就是255,255对应的二进制是11111111;可以表示这么多0到255之间的整数,字节也是标识字符的最小单位,)
四种栈
这种分类不是通常的那种针对栈本身的空栈和满栈(栈状态),而是针对栈指针来说的。
空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出
满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针
增栈:栈指针移动时向地址增加的方向移动的栈
减栈:栈指针移动时向地址减小的方向移动的栈
四种组合,空增栈,空减栈,满增栈、满减栈
注意,这里的空栈和满栈,不是说栈是空的,或者栈是满的。指的是,当前指针指向的栈格,是空的还是已经被占位了。