NXP

ARM体系

2019-07-12 13:12发布

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