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

时间: 2024-10-18 05:15:49

ARM裸机的相关文章

ARM裸机之点亮LED

声明:本文由个人学习过程中整理而成,转载请注明出处 实验开发版:S5PV210 1.什么是GPIO? General Purpose Input Output (通用输入/输出)简称为GPIO,属于芯片引脚的一部分. 嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号.而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭.对这些设备/电路的控制,使用传统的串行口或并行口都不合适

ARM裸机开发中内存管理库RT_HEAP的使用

在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动态使用 首先,应该初始化C堆,初始化代码如下 #include "malloc.h" #pragma import (__use_realtime_heap) //这个函数在rt_heap.h中声明,需要用户自己去实现,返回任意值 unsigned __rt_heap_extend(uns

ARM裸机程序之LED灯

从3月份开始看arm的裸机程序,到现在一个半月了,做到后来,发现自己越做到综合的程序,越吃力,还是得回头看看,为了最终写一个bootloader打下点基础吧,所以以这篇文章为开始,总结一下之前做过的裸机程序,希望会有所收获,我用的开发板是友善之臂的mini2440. 首先声明一点我都是在linux环境下写裸机程序的,因为这样能知道更多底层的东西,不过在这里面写就是有点不方便的是调试的时候,所以你程序要是调试不出来,你得把程序移植到一些编译器里调试(请注意移植的时候格式有点不同),所以偶尔在kei

【转载】eclipse调试arm裸机程序

一.集成开发环境 软件部分:eclipse , GDB Server , Jlink软件 硬件部分:Jlink硬件 准备工作1:从SD/NOR Flash启动,格式化nand flash 准备工作2:硬件连接 1. Jlink连接 2. 串口连接 3. nand启动 二.安装GDB Server 解压:tar xvzf arm-linux-gdb-7.5.tar.gz 进入目录:cd arm-linux-gdb-7.5 编译安装:./build-all 上面执行好后,gdb工具就安装好了,安装在

ARM裸机编程系列----nandflash

关于NAND Flash S5PV210的NAND Flash控制器有如下特点: 支持512byte,2k,4k,8k的页大小 通过各种软件模式来进行NAND Flash的读写擦除等 8bit的总线 支持SLC和MCL的NAND Flash 支持1/4/8/12/16bit的ECC 支持以字节/半字/字为单位访问数据/ECC寄存器,以字为单位访问其他寄存器. 注意:在此使用的GEC210的NAND Flash类型为SLC,大小为512MB,型号为K9K8G08U0A.所以本章的内容是针对SLC类

eclipse调试arm裸机程序

一.集成开发环境 系统:centos 6.5 软件部分:eclipse , GDB Server , Jlink软件 硬件部分:Jlink硬件 准备工作1:从SD/NOR Flash启动,格式化nand flash 准备工作2:硬件连接 1. Jlink连接 2. 串口连接 3. nand启动 二.安装GDB Server 下载 GDB   ftp://sourceware.org/pub/gdb/releases/ 解压:#tar xvzf gdb-7.5.tar.gz 进入目录:#cd gd

ARM裸机第十一部分-NandFlash和iNand

NandFlash和iNand NandFlash的接口 Nand的型号与命名 (1)Nand的型号命名都有含义,就拿K9F2G08来示例分析一下:K9F表示是三星公司的NandFlash系列.2G表示Nand的大小是2Gbit(256MB).08表示Nand是8位的(8位就是数据线有8根) (2)Nand命名中可以看出:厂家.系列型号.容量大小.数据位数. Nand的数据位 (1)Nand有8位数据位的,有16位数据位的.做电路时/写软件时应该根据自己实际采购的Nand的位数来设计电路/写软件

Eclipse开发调试ARM裸机程序

Makefile稍微动一下,就是原来的开头的“led_on.bin”改为“all”,eclipse默认编译的目标为“all”,就可以顺利编译通过了,编译完后会产生led_on.bin,led_on_elf.前者是下载到NandFlash中运行的,后者是调试用的. 能编译后就要开始配置调试了,和调试u-boot唯一不同的是指定应用程序的名字,如下图所示.其它的 Debugger Commands和调试u-boot中的配置一样的. 还有根据Makefile中的链接地址得出这个不是在SDRAM中运行的

ARM的异常与裸机开发

2019-12-15 关键字:嵌入式开发.异常处理.嵌入式裸机开发 1.ARM的异常 异常在嵌入式开发中是很常见的事件,它也是非常重要的事件.简单来说,异常就是一种会打断程序正常执行的事件.异常通常又称为“中断”. 异常的种类大致可分为如下几种: 1.中断 IRQ / FIQ 由外部硬件触发的中断. 2.软中断 soft interrupt 由系统调用的中断事件,由软件产生的中断事件. 3.复位 Reset 4.未定义指令 5.数据异常 例如数据越界等. 中断: ARM 有两级外部中断:1.FI