ARM體系

ARM 230瀏覽


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











































七星彩走势图2元网官网