2022.7.27
ARM汇编指令与伪指令
基本概念
指令:是CPU机器指令的助记符,经过编译后可以得到一串10组成的机器码,由CPU读取执行。
伪指令:本质上不是指令,由编译环境提供,用来指导编译过程,不生成机器码。
两种不同风格的ARM指令
ARM官方汇编风格:指令一般用大写(Windows中IDE开发环境),如LDR R0, [R1]
GNU风格:指令一般用小写(Linux中常用),如ldr r0, [r1]
ARM汇编特点
- LDR/STR架构
ARM采用RISC架构,CPU不能直接读取内存,要先将内存中的文件存储到寄存器中读取。
LDR:将内存内容加载入寄存器;STR:将寄存器内容存入存储空间。
- 8种寻址方式
1
2
3
4
5
6
7
8
9
mov r1,r2 //寄存器寻址,r2运送到r1
mov r0,#0xFF00 //立即(数)寻址,#是数字的标识
mov r0,r1,lsl #3 //寄存器移位寻址,左移三位(每一次左移*2,等于*8)
ldr r1,[r2] //寄存器间接寻址,[]表示内存地址,将r2的内存地址赋给r1
ldr r1,[r2,#4] //基址变址寻址,将r2+4的内存地址赋给r1
ldmia r1!,{r2-r7,r12} //多寄存器寻址,r1从起始地址,依次读八个数读出来放在后面的寄存器中
stmfd sp!,{r2-r7,lr} //堆栈寻址,访问的是堆栈,连续访问x个字节放入后面的寄存器中
beq flag //相对寻址,即跳转到flag运行
flag: //:表示标号
- 指令后缀
指令后面常带后缀,变成不同的指令,指令族。
B(Byte):功能不变,操作长度变为8位
H(Half word):功能不变,操作长度变为16位
S(Signed):功能不变,操作数变为有符号
S(S标识):影响CPSR标志位,如mov、movs
ldr–>ldrb,ldrh,ldrs,ldrsb,ldrsh
- 条件执行后缀(特有特性)
条件后缀执行的注意点:
条件后缀是否成立,不取决于本句代码,而是取决于这句代码之前的代码运行后的结果。
条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句的运行。
条件执行后缀条件码表
- 多级指令流水线
S5PV210使用13条流水线,允许多个操作同时处理。
取指(PC、PC)->解码(PC-4、PC-2)->执行(PC-8、PC-4)
PC指向正在取指的指令,而不是正在运行的指令。(括号内左侧为ARM模式地址,右侧为Thumb模式地址)
2022.7.26
ARM的编程模式和7种模式
32位ARM的CPU
约定:
Byte:8bits
Halfword:16bits(2byte)
Word:32bits(4byte)
提供:
ARM指令集(32-bit)
Thumb指令集(16-bit)
Thumb2指令集(16 & 32bit)
Jazelle Cores支持Java Bytecode
ARM的工作模式
User:非特权,用户模式
FIQ:特权,快速中断模式
IRQ:特权,中断模式
Supervisor(SVC):特权,复位模式
Abort:特权,存取异常模式
Undef:特权,未定义模式
System:特权,系统模式
1个非特权模式+6个特权模式;1个普通模式+5个异常模式+1个系统模式
可以通过代码修改模式,或CPU自动切换
各个模式下的权限和可以访问的寄存器不同
ARM的37个寄存器
寄存器的种类
User模式: r0-r15、cpsr(程序状态寄存器)
Abort、FIQ、IRQ、SVC、Undef模式:r0-r15、cpsr、spsr(用来保存cpsr状态)
r13又称sp(栈指针),r14又称lr(返回),r15又称pc;system模式与user模式一致
ARM共有31个寄存器,但每个模式下最多能看到18个寄存器,其他名字虽然相同但是在当前模式不可见。影子寄存器:虽有多个r14(lr)寄存器,但当前模式只有一个。
User的影子寄存器:r13、r14
FIQ的影子寄存器:r8-r14、spsr
Abort、IRQ、SVC、Undef的影子寄存器:r13、r14、spsr
共37个寄存器,其中30个完全“通用”,1个固定用作PC,1个固定用作cpsr,5个固定用作spsr
CPSR中各个bit位含义
Mode位:处理器模式位
T bit位:1(Thumb)、0(ARM)
中断禁止位:I(1:禁止IRQ)、F(1:禁止FIQ)
J位、Q位
条件位:N(ALU负结果)、Z(ALU结果0)、C(进位标识位有进位)、V(进位标识位溢出)
PC(r15)寄存器的意义
PC为程序指针,pc指向哪里,cpu就会执行哪条指令
ARM的异常处理方式
异步:非同步,无法预料的操作,靠中断(一种特殊的异常)来实现
同步:同步时钟要完全同步
异常向量表
所有的CPU都有异常向量表,由硬件决定的。
异常发生时,CPU会自动动作。(pc指针跳转到向量处处理异常,时而伴有一些辅助动作)
异常向量表是硬件向软件提供的处理异常的支持。
ARM的异常处理机制
拷贝cpsr到spsr_
设置适当的cpsr位:改变处理器状态进入ARM态(重置T位为0),改变处理器模式进入相应模式(mode位),设置中断禁止位禁止相应中断(按需)
保存返回地址到r14(lr)
设置PC为响应的异常向量
返回时,从spsr_
2022.7.25
S5PV210启动方式
使用iROM启动的好处
降低BOM成本
支持各种校验的nand
可以在不使用编程器的情况下使用一种外部存储器进行编程烧录
优先从通道0启动,通道0启动失败后从通道2(SD卡)启动
BL0代码所做的事情
关闭看门狗
初始化指令cache、栈、堆
初始化块设备复制函数(device copy function)
设置SoC时钟系统
复制BL1到内部IRAM(16kb)并检查BL1的校验和
跳转到BL1并执行
S5PV210的所有启动
先1st启动(OMpin选择启动介质),在2nd启动(SD2),再Uart启动,再USB启动。
1:ON/VCC/内,0:OFF/GND/外
SD0的eMMC启动:101100
SD2启动:OMpin设置与SD0一样
USB调试优先:1xxxx1(OM0与OM1为1即可)
区别仅在于OM5位置不同
2022.7.22
CPU和外部存储器的接口
内存:内部存储器,用来运行程序的。RAM(DRAM DDR)
内存的连接方式:利用地址总线&数据总线的总线式访问方式连接
外存:外部存储器,用来存储东西的。ROM(硬盘,光盘,Flash)
外存的连接方式:利用CPU的外存接口来连接
常用外存
NorFlash:接到SROM Bank,可以总线式访问,一般用来启动。
NandFlash:分为SLC、MLC、TLC等,不能总线式访问,需CPU运行初始化软件后通过时序接口读写。
eMMC/iNand/moviNand:embeded MMC,iNand为SanDisk出产,moviNand为三星出产
oneNand:三星自有的一种标准。
SD卡/TF卡/MMC卡
eSSD:embeded SSD
SATA硬盘
总结
外部存储器基本用来存储文件,现代SoC基本上都支持多种外部存储器。
各种不同的外部存储器原理不同,性价比不同;外部存储器一般都是通过专门的接口来连接的。
启动过程详解
SRAM和DRAM的区别
SRAM静态内存容量小、价格高,但是不需要软件初始化;
DRAM动态内存容量大、价格低,但是需软件初始化后才可使用。
单片机中内存需求量小、开发简单,适合全部使用SRAM;PC机内存需求量大、软件复杂,不在乎DRAM的初始化开销。
嵌入式系统内存需求量大,并且没有NorFlash等可启动介质。
PC机一般为小容量BIOS(NorFlash)+大容量硬盘(NandFlash)+大容量DRAM;
单片机一般为小容量NorFlash+小容量SRAM;
嵌入式系统:因为NorFlash价格贵,所以一般用大容量Nand+大容量DRAM+SoC内置SRAM;
S5PV210的启动方式
内置了96k大小的SRAM(iRAM),同时还有一个内置的64k大小的NorFlash(iROM)
因为启动代码大小不确定,所以SRAM的96k不一定合适,所以要拆分第二次读取的代码
CPU上电后从内部iROM中读取预置的代码(BL0)执行,做好了基本的初始化(CPU时钟、关看门狗等),此段代码由CPU厂商设置,仅能初始化SoC内部的东西;然后在判断选择的启动模式(通过硬件跳线更改),然后再读相应外部存储器的启动代码,将部分代码(BL1,16k)读取到内部的SRAM;
从iRAM读取刚刚的BL1启动代码,执行。BL1负责初始化NandFlash,然后将BL2读取到IRAM,运行。
从iRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,启动OS系统,结束启动过程。
2022.7.21
统一编址和独立编址
IO:外部设备与CPU之间的通信,一般用来指CPU的各种内部或外部外设。
内存:程序的运行场所,基本单位为字节,CPU通过一定的地址来访问具体内存单元。
CPU的地址总线的位置由CPU设计时确定,CPU的寻址范围是一定的,内存是需要占用CPU的寻址空间的。
内存的访问方式:
内存和CPU的总线式连接方式为直接连接,优点是效率高访问快,缺点是资源有限、拓展性差。
IO的访问方式:
一种是类似于访问内存的方式,把外设的寄存器当作一个内存地址来读写,即IO与内存统一编址方式(RISC);
另一种是使用专用的CPU指令来访问某种特定外设,即IO与内存独立编址(CISC)。
统一编址方式:编程简单,但占用CPU地址空间;
独立编址方式:不占用CPU地址空间,但CPU设计变复杂。
程序运行时的两大核心元素:程序(只读)、数据(可读写)
程序存在的原因就是将原数据经过计算生成新的值
冯诺依曼结构和哈佛结构
冯诺依曼结构:程序和数据都放在内存中,彼此不分离。
哈佛结构:程序和数据在内存中分开存储。
优势对比:
冯诺依曼结构安全和稳定性较低,但软件处理简单。
哈佛结构安全和稳定性较高,但软件处理复杂。
寄存器
软件编程控制硬件的关键,属于CPU外设的硬件组成部分,留作外设被编程控制的“活动开关”。
寄存器时外设硬件的软件编程结构API,通过编程来控制寄存器,进而控制硬件。
编程操作寄存器类似于访问内存,其中的每个bit位都有他的意义,因此编程操作时需要位操作。
单个寄存器的位宽一般与CPU的位宽一样,以实现最佳访问效率。
寄存器的分类
通用寄存器:是CPU的组成部分,功能未确定,但可读可写,可以自定义。
SFR 特殊功能寄存器:在CPU的外设中,每个bit位的意义已确定。
1
2
3
4
5
6
ldr r1, =0xE0200280
str r0, [r1]
mov r0, #0
int *p = (int *)0x30008000; //C语言访问内存地址的方法
*p = 16;
编程访问寄存器的方法
ARM体系的要点
ARM是RISC架构,常用的汇编指令只有二三十条,低功耗,适合嵌入式领域。
ARM是统一编址的,大部分都是32位和64位的架构,32位的ARM CPU少于4G,SoC中的各种外部设备通过各自的SFR编程访问。
ARM是哈佛结构,保证了运行时的稳定性和安全性,但也同时导致了裸机程序(实地址)链接比较麻烦。
地址映射(内存映射)
S5PV210属于ARM Cortex-A8架构,32位,设计时有32根地址线和32根数据线。
32根地址线决定了CPU的地址空间为4G,内存的分配使用的问题就是地址映射问题。
ROM:Read-Only memory 只读存储器(不能直接通过地址总线写)
RAM:Random Access Memory 随机访存储器
IROM:Internal ROM 内部ROM,集成到SoC内部的ROM
IRAM:Internal RAM 内部RAM,集成到SoC内部的RAM
DRAM:Dynamic RAM 动态RAM
SRAM:Static RAM 静态RAM
SROM:Static ROM
ONENAND/NAND:NAND Flash
SFR:Special Function Register 特殊功能寄存器
2022.7.20
今天学习了三节课,可编程器件的编程原理、指令集对CPU的意义,RISC与CISC的区别。
可编程器件的编程原理
目前电子器件交给用户的选择权在不断放宽,可自定义化程度也越来越高,进而催生出了各种编程。 可编程器件的编程,基于CPU在固定频率的始终控制运行。 效率越高的语言可移植性越弱,反之亦然。
指令集对CPU的意义
指令集及CPU设计者在设计的时候对CPU的各种基础操作所预置的各种指令集合,基本上由CPU头部设计者制定(ARM,Intel等),本质上是一串字符编码。
汇编指令本质上就是机器指令的助记码。
RISC与CISC的区别
RISC | CISC | |
---|---|---|
名称 | 精简指令集 | 复杂指令集 |
CPU设计复杂程度 | 复杂 | 简单 |
特性 | 功耗低、灵活 | 功耗高,性能高 |
未来趋势:往平衡性能与功耗方向努力,介于RISC与CISC之间的指令集架构新形式。
今日学习总结
今天的学习进度整体来说还是比较少的,只学习了一个小时左右,而且学习的也是基础部分的内容,基础知识的了解。