ARM裸机

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启动

posted @ 2016-08-07 20:53  toknowledge  阅读(374)  评论(0编辑  收藏  举报