一、什么是ARM
1、ARM ——Advanced RISC Machine
2、ARM 是一种处理器的体系结构(x86、PowerPC、MIPS...)
3、ARM 又是一家英国公司的名字
4、ARM公司设计ARM的IP核,不生产芯片,而将软核授权给芯片厂商,由芯片厂商生产ARM芯片(TI、Atmel、freescale、nxp、高通、boadcom、microchip...) 除了intel和AMD。
5、优点:低成本、高性能、体积小、功耗低
提示:描述CPU性能的参数:MIPS ---- Million Instruction Per Second(每秒能执行的百万指令数)
在linux操作系统中 可以用命令 cat /proc/cpuinfo 查看 cpu的详细信息
二、RISC VS CISC(精简指令集VS复杂指令集)
RISC --- Reduced Instruction Sets Computer: ARM MIPS等
CISC --- Complex Instruction Sets Computer: 51单片、X86等
本质上差异体现在这两种指令集的代码反汇编的机器码的长度上:
1、ARM的反汇编
led.elf: file format elf32-littlearm
链接地址 机器码(bin) ARM汇编指令 注释
30000000 <_start>:
30000000: e92d4800 push {fp, lr}
30000004: e28db004 add fp, sp, #4
30000008: e59f3040 ldr r3, [pc, #64] ; 30000050 <_start+0x50>
3000000c: e59f203c ldr r2, [pc, #60] ; 30000050 <_start+0x50>
30000010: e5922000 ldr r2, [r2]
30000014: e3c22a0f bic r2, r2, #61440 ; 0xf000
30000018: e5832000 str r2, [r3]
3000001c: e59f302c ldr r3, [pc, #44] ; 30000050 <_start+0x50>
30000020: e59f2028 ldr r2, [pc, #40] ; 30000050 <_start+0x50>
30000024: e5922000 ldr r2, [r2]
30000028: e3822a01 orr r2, r2, #4096 ; 0x1000
3000002c: e5832000 str r2, [r3]
30000030: e59f301c ldr r3, [pc, #28] ; 30000054 <_start+0x54>
30000034: e59f2018 ldr r2, [pc, #24] ; 30000054 <_start+0x54>
30000038: e5922000 ldr r2, [r2]
3000003c: e2222008 eor r2, r2, #8
30000040: e5832000 str r2, [r3]
30000044: e3a00501 mov r0, #4194304 ; 0x400000
30000048: eb000002 bl 30000058
3000004c: eafffff7 b 30000030 <_start+0x30>
30000050: e0200280 eor r0, r0, r0, lsl #5
30000054: e0200284 eor r0, r0, r4, lsl #5
2、X86反汇编
hello: file format elf32-i386
08048154 <.interp>:
8048154: 2f das
8048155: 6c insb (%dx),%es:(%edi)
8048156: 69 62 2f 6c 64 2d 6c imul $0x6c2d646c,0x2f(%edx),%esp
804815d: 69 6e 75 78 2e 73 6f imul $0x6f732e78,0x75(%esi),%ebp
8048164: 2e 32 00 xor %cs:(%eax),%al
Disassembly of section .note.ABI-tag:
08048168 <.note.ABI-tag>:
8048168: 04 00 add $0x0,%al
804816a: 00 00 add %al,(%eax)
804816c: 10 00 adc %al,(%eax)
804816e: 00 00 add %al,(%eax)
8048170: 01 00 add %eax,(%eax)
8048172: 00 00 add %al,(%eax)
8048174: 47 inc %edi
8048175: 4e dec %esi
8048176: 55 push %ebp
8048177: 00 00 add %al,(%eax)
8048179: 00 00 add %al,(%eax)
804817b: 00 02 add %al,(%edx)
804817d: 00 00 add %al,(%eax)
804817f: 00 06 add %al,(%esi)
8048181: 00 00 add %al,(%eax)
8048183: 00 18 add %bl,(%eax)
8048185: 00 00 add %al,(%eax)
RISC(ARM反汇编)每条汇编指令编译后生成的机器码是固定长度的,这样指令的访问速度比较快,CISC(X86的反汇编)的机器码是非固定长度的。
==============================================
三、ARM的系列
版本 系列 内核 典型的芯片
V4T ARM7 ARM7TDMI S3C44B0
ARM9 ARM920T S3C2440
V5TE ARM9E ARM926EJ-S i.MX27
ARM10E Xscale PXA270
V6 ARM11 ARM1156 S3C6410
V7 cortex-A cortex-A8 S5PV210 (单核)
(Application) cortex-A9 Exynos4412 (双核、四核)
cortex-A15 (八核)
Cortex-M
(mirco controller)
cortex-M0
cortex-M1
cortex-M3 STM32F103(uC/OS)
cortex-M4
Cortex-R 安全性/稳定性比较强的场合
(Realtime)
V8 cortex-A50 cortex-A53 64bits
cortex-A57
四、流水线
将一条指令的处理过程分成了几个部分,在每个时钟周期处理不同的部分。
一般讲一个指令的处理过程主要分成三个步骤:
取指:-----> CPU去内存中,根据地址,读取指令(机器码)
译码:-----> 汇编指令有一定的编码格式,要根据不同指令的编码格式进行译码
执行:-----> CPU执行指令
51单片机
1 取指 译码 执行
2 取指 译码 执行
3 取指 译码 执行
ARM的流水线
1 取指 译码 执行
2 取指 译码 执行
3 取指 译码 执行
4 取指 译码 执行
5 取指 译码 执行
ARM7 三级流水线:取指 译码 执行
ARM9 五级流水线:取指 译码 执行 存储器访问 寄存器回写
流水线提高了指令的执行效率
五、哈佛结构与冯.诺依曼结构
冯.诺依曼 :数据和代码放在一起。 ARM7
哈佛:数据和代码分开存放、分开处理。 ARM9
cortex-A8是哈佛结构的
Instruction cache :32KB
Data cache :32KB
L2 cache: 512MB
六、视频显示
高清 1080P: 1920*1080@30fps
标清 720P: 1280*720@30fps
超清 4k 4096*2048
七、ARM的工作模式(arm处理不同的内容时....)
ARM有七中工作模式
1、管理模式(suv):给操作系统使用的一种保护模式:linux中,系统调用就是在管理模式进行。ARM在管理模式时,才可以对内核进行配置,如:MMU、cache。
注意:
1)ARM复位启动后,默认进入管理模式
2)当uboot启动内核时候,ARM必须是管理模式
2、用户模式(usr):执行一般的应用程序
3、系统模式(sys):操作系统的超级用户模式
4、中止模式(abt):CPU在执行过程中,出现了一些错误(数据/指令访问出错)
5、FIQ模式(fiq):fast interrupt request,当ARM响应FIQ中断时,进入FIQ模式
6、IRQ模式(irq):interrupt request 当ARM响应IRQ中断时,进入IRQ模式
7、未定义模式(und):当ARM处理未定义的指令的时候(ARM不认识新的指令)
ARM中,中断有两种类型分别FIQ和IRQ,我们可以将一个中断源设置成FIQ也设置成IRQ
如何改变ARM的工作模式??????
1、通过设置CPSR (当前程序状态寄存器)
2、异常中断响应
八、ARM中的数据类型
字节:char----8bits
半字:short int-----16bits
字: int-----32bits
signed unsigned
在linux系统,数据类型
char----8bits 一个字节
short int-----16bits 两个字节
int-----32bits 四个字节
long-----与CPU的字长保持一致
思考1
struct test{
char a,
short b,
chat c,
int d,
}
struct test test1
sizeof(test1)= 12B 怎么计算?
思考2
struct test{
char a,
chat c,
short b,
int d,
}
struct test test1
sizeof(test1)= 8B
思考3
struct test{
char a,
short b,
chat c,
int d,
char e,
}
struct test test1
sizeof(test1)= 16B
思考4
struct test{
char a,
char b,
char c,
char d,
int e,
}
struct test test1
sizeof(test1)= 8B
总结:
1、所有处理器一个地址对应的存储空间是一个字节,半字类型数据占用两个地址,
2、半字类型的数据存放到内存中,存放的起始地址必须要半字对齐,即该地址除以2可以整除。
3、字类型的数据存放到内存中,存放的起始地址必须要字对齐,即该地址除以4可以整除。
访问GPD0的IO口:
#define GPD0CON (* (voalile unsigned char *) 0xe02000a0)
#define GPD0CON (* (voalile unsigned short *) 0xe02000a0)
#define GPD0CON (* (voalile unsigned int *) 0xe02000a0)
九、ARM存储体系
有一个int型的数据a,a的大小是4个字节,如果将a放到内存中,a占用4个地址。
big endian(大端模式) ------- 高字节放在低地址,低字节放在高地址
little endian (小端模式)------- 高字节放在高地址,低字节放在低地址(ARM)
十、ARM的工作状态
ARM处理器支持两种指令集,一种是32bits 的ARM指令集(默认);另一种16bits的thumb指令
ARM状态 :执行32bits 字对齐的ARM汇编指令时
Thumb状态:执行16bits 半字对齐的THUMB汇编指令时
十一、ARM中寄存器(以S5PV210为例)
ARM内核中的寄存器,有37个寄存器,其中31个是通用寄存器,6个是状态寄存器。
注意:这37个寄存器并不是同时可见的,与工作模式有关系,不同工作模式,可以访问的寄存器是不同的。
寄存器都是32bits的。
1、ARM寄存器列表
2、ARM中寄存器使用的原则
R0~R3: 使用做参数传递的(C和汇编混合编程时),如果参数只有一个,就通过R0传;如果传递的参数为2个,第一个参数由R0传,第二个参数由R1传;如果参数超过了四个,其他的参数由数据栈进行传递,
R4~R12:
存放局部变量
R13:
又叫SP---stack pointer,该寄存器存放stack的地址
R14:
又叫LR----Link Register,该寄存器保存子程序的返回地址
R15:
又叫PC----Program Counter,存放正在取指的指令的地址
CPSR ---- Current Program Status Register,反应ARM当前的工作状态
SPSR ---- Saved Program Status Register 在ARM工作模式切换时,保存CPSR