ARM体系结构与汇编指令
可编程器件的特点
CPU在固定频率的时钟控制下节奏运行
CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行
这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者ARM定义的,本质上是一串01组成的数字,这就是CPU的汇编指令集。
从源代码到CPU执行过程
.C等高级语言源代码---编译器--->.S汇编源代码---汇编器--->Elf格式二进制可执行程序---Objcopy工具--->Bin格式烧录文件---总线--->CPU读入后先解码---CPU内部指令流水线--->CPU执行指令
汇编语言与C等高级语言的差异
汇编无可移植性,C语言有一定可移植性,JAVA等更高级语言移植性更强
汇编语言效率最高,C语言次之,JAVA等更高级语言效率更低
汇编不适合完成大型复杂的项目,更高级语言更适合完成更大、更复杂的项目
汇编语言的本质
汇编的实质是机器指令的助记符,是一种低级符号语言
机器指令集是一款CPU的编程特征,是这款CPU的设计者指定的。CPU的内部电路设计就是为了实现这些指令集的功能。机器指令集就好像CPU的API接口一样。
编程语言的发展过程
纯机器码编程
汇编语言编程
C语言编程
C++语言编程
JAVA C#等语言编程
脚本语言编程
RISC和CISC
complex instruction set computer CISC设计理念是用最少的指令完成任务,因此CISC的CPU设计复杂、工艺复杂,但编译器好设计。CISC指令多,实现指令的电路多,功耗高。
reduced instruction set computer RISC设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。RISC指令少,CPU设计和工艺简单,功耗低,但编译器设计困难。
IO?内存?
内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元
IO是输入输出接口,是CPU和其他外部设备之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设
内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写
CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的
内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问快,缺点是资源有限,扩展性差
IO指的是与CPU连接的各种外设
CPU访问各种外设有两种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式
一种是使用专用的CPU指令来访问某种特定外设,叫IO于内存独立编址
由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高
IO与内存统一编制方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源
IO与内存独立编址方式,优势是不占用CPU地址空间,缺点是CPU设计变复杂了
程序运行时两大核心元素:程序+数据
程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行
数据是程序运行过程中定义和产生的变量的值
冯诺依曼结构与哈佛结构
程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。
哈佛结构中程序(ROM FLASH)和数据(RAM)独立分开存放因此好处是安全和稳定性高,缺点是软件处理复杂一些
软件编程控制硬件的关键--寄存器
寄存器属于CPU外设的硬件组成部分
CPU可以像访问内存一样访问寄存器
寄存器是CPU的硬件设计者指定的,目的是留作外设被编程控制的“活动开关”
正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器
编程操作寄存器就类似于访问内存
寄存器中每个BIT位都有特定含义,因此变成操作时需要位操作
单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率
SOC中有两类寄存器:通用寄存器和SFR
通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与
special function register不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法
S5PV210属于ARM CORTEX-A8架构,32位地址线和数据线
read only memory
ramdom access memory
internal rom
internal ram
dynamic ram
static ram
SROM
ONENAND/NAND
SFR
内存 内部存储器 用来运行程序的 RAM(例如DRAM SRAM DDR)
外存 外部存储器 用来存储东西的 ROM(例如硬盘 FLASH(NAND INAND U盘 SSD)光盘)
CPU连接内存需要直接地址访问,通过地址总线和数据总线的总线式访问方式连接的(好处是直接访问,随机访问;坏处是占用CPU地址空间,大小受限)
外存是通过CPU的外存接口来连接的好处是不占用CPU的地址空间,坏处是访问速度没有总线式快,访问时序较复杂
SOC常用外部存储器
NORFLASH 总线式访问,接到SROM BANK,优点是可以直接总线访问,一般用来启动。容量小,可靠性高。
NANDFLASH 工艺分为SLC和MLC(大、便宜、要做ECC校验)
eMMC/iNAND/moviNAND embedded MMC
oneNAND oneNAND是三星出的一种NAND
SD卡/TF卡/MMC卡 标准不同
eSSD
SATA硬盘:机械式访问、磁存储原理、SATA是接口
S5PV210启动过程
内存:
SRAM 静态内存 特点是容量小、价格高,基本小于1m;优点是不需要软件初始化直接商店就能使用
DRAM 动态内存 特点就是容量大、价格低;缺点是需要软件初始化后才能使用
单片机中内存需求小,而且希望开发尽量简单,适合全部使用SRAM
嵌入式系统内存需求大,而且没有NORFLASH等可启动介质
PC内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM
外存:
NORFLASH:特点是容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用作启动介质
NANDFLASH(跟硬盘一样):特点是容量大,价格低,缺点是不能总线式访问,不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写
所以一般PC机都是: 很小容量的BIOS(NORFLASH),很大容量的硬盘(类似NANDFLASH),大容量的DRAM
一般单片机: 很小容量的NORFLASH,很小容量的SRAM
嵌入式系统: 因为NORFLASH很贵,所以现在很多嵌入式系统倾向于不用NORFLASH,直接用:NAND+DRAM+SOC内置的SRAM(通过CPU设计在开机时把一部分NAND中的代码读取到SRAM中,作为启动代码,然后初始化NAND和DRAM)
S5PV210使用的启动方式是:210内置了一块96KB大小的SRAM(叫iRAM),同时还有一块内置的64KB大小的NORFLASH(叫iROM)
大致启动过程:
1、(BOOTLOADER)CPU上电后先从内部iROM中读取预先设置的代码(BL0),执行。这一段iROM代码做了一些基本的初始化(CPU时钟、关看门狗等等)这一段iROM代码是三星出厂前设置的,三星也不知道我们板子上将来接的是什么样的DRAM,所以不能初始化外接DRAM,只能初始化SOC内部的东西;然后这一段代码会判断我们选择的启动模式(我们通过硬件跳线可以更改板子的启动模式),然后从相应的外部存储器去读取第一部分启动代码(BL1,16K)到内部SRAM
2、 从SRAM去运行刚上一步读取来的启动代码BL1,然后执行。BL1负责初始化NANDFLASH,然后将BL2读取到iRAM(剩余80KB)然后运行
3、 从iRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,然后启动OS
思路:因为启动代码的大小是不定的,有些公司可能96KB就够了,有些公司可能1MB都不够,所以刚才说的2步的启动方式不合适。
三星的解决方案是:把启动代码分为两半(BL1和BL2),这两部分协同工作来完成启动。
BL0
iROM START
关看门狗
初始化指令cache
wakeup status 唤醒状态(复位状态)根据休眠程度不同跳转至不同的地方执行
初始化栈
初始化堆
初始化块设备复制功能
设置SOC时钟系统
复制BL1到内部iRAM(16KB)
OM PIN 启动方式
检查BL1的校验和
检查是否安全启动
跳转到BL1去执行
1st启动,通过OM PIN选择启动介质
2st启动,从SD2
UART启动
USB启动