ARM体系

ARM 222浏览


一、什么是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 <delay>
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