ARM体系结构及接⼝技术(部分理论知识)1、ARM相关的概念
指令->指令集->架构->arm内核->SOC
1.1 课程⽬的
1. 为学习驱动打基础
了解ARM处理器硬件的⼯作原理
2. 驱动开发
1> 裸机驱动开发:没有操作系统,单⽚机(MCU)开发:stm32
只需要具备C语⾔即可
2> linux驱动开发:有操作系统,基于linux内核提供的接⼝函数,完成硬件驱动程序的编写
驱动课程要求具备的知识:C语⾔ IO进程线程 ⽹络编程 数据结构 ARM 系统移植
1.2 ARM课程⽬标
1. 能够看懂简单的汇编指令集
2. 掌握分析硬件电路图的能⼒
3. 掌握分析和阅读芯⽚⼿册的能⼒
4. 掌握软件编程控制硬件的思想
1.3 ARM的发展历史
1. 1978年,CPU公司
Cambridge processing Unit
2. 1979年    Acorn
3. 1985年, 32位,8MHz,
使⽤的精简指令集RISC
芯⽚的名字ARM ----> Acorn RISC machine
4. 1990年,转折点
iphone 150万英镑 VLSI: 25万英镑
ARM公司12⼯程师+技术专利:150万英镑
ARM公司-> Advanced RISC Machine
ARM公司不⽣产芯⽚,做技术的授权,提供解决⽅案。芯⽚⼚家拿到技术授权之后,根据需求设计⽣产⾃⼰的SOC。
5. 2016年,⽇本软银收购
6. 2020年,英伟达(未收购成功)
1.4 ARM相关的概念
内核:ARM公司授权给芯⽚设计⼚家
内核=运算器 + 控制器 + 存储器(寄存器)
存储器的分类
1.主存储器即内存。程序中待处理的数据和处理的结果都存储在内存中。
2.外存储器是⽤来长期保存数据的⼤容量存储器。
3.寄存器是CPU内部的⾼速存储器,速度快,数⽬少。
CPU(Central Processing Unit),是⼀台计算机的运算核⼼和控制核⼼。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。所谓的计算机的可编程性主要是指对CPU的编程。
处理器
SOC(CPU) 内核 架构
麒麟9000 cortex-A774 ARM-v8
cortex-a554 ARM-v8
骁龙888 cortex-x1 1 ARM-v8
cortex-A783 ARM-v8
cortex-a554 ARM-v8
Exynos4412 cortex-a94 ARM-v7
stm32MP157 cortex-A72 ARM-v7
cortex-M41
SOC(System Of Chip):⽚上系统
芯⽚的内部集成了内核和很多的外设,这样的芯⽚可以统称SOC。
## 1.5 ARM产品线
```c
ARM体系  ARMv4  ARMv5      ARMv6  ARMv7
ARM CPU  arm7  arm9/arm10  arm11 arm_cortex_a8
cortex-A: ⾼端处理器,可以运⾏linux系统,消费类电⼦产品(
⼿机、平板等)
cortex-R:主要针对的实时处理,汽车电⼦,摄像机,照相机
cortex-M:低端电⼦产品,运⾏裸机程序,物联⽹设备开发,stm32/stm8(意法半导体公司),可以运⾏实时的操作系统(FreeRTOS LiteOS AliOS ucos II)
arm内核命令的规范:
早期:ARM7 ARM9 ARM10 ARM11
从ARM11之后ARM内核的命名调整为Cortex-A
X86——32位架构
X64——64位架构
ARMv7——32位架构
ARMv8——64位架构
ARM-v8架构是arm64的架构及⽀持arm64位的汇编指令
ARM-v8架构向下兼容ARM-v7的架构
ARM-v7架构是arm32的架构及⽀持arm32位的汇编指令
架构:汇编指令集的集合
ARM汇编指令集:⼀些汇编指令的集合
ARM汇编指令:具有某个特殊功能的指令
指令本⾝是通过CMOS设计的硬件电路图
不同ARM体系采⽤的是不同的指令集
哈佛结构是数据和指令分开存储并⾏
冯诺依曼(普林斯顿)结构是混合存储的
1.6 RISC和CISC指令集的区别
RISC: 精简指令集 (ARM,8051,MIPS,PowerPC)
精简指令集是在复杂指令集中提取⼀些⽐较简单和使⽤频率较⾼的指令作为精简指令,精简指令集的指令的周期和指令的宽度固定。ARM 指令集是精简指令集
指令周期:执⾏1⼀条指令所需要的时间
指令宽度:1条指令所占⽤的内存空间
CISC: 复杂指令集(电脑CPU)
复杂指令集更加注重指令的功能和处理能⼒,复杂指令集的周期和宽度不固定。X86指令集是复杂指令集
从汇编代码的⾓度分析复杂指令集合精简指令集的区别?
复杂指令集:
// 作⽤:将elf⽂件⽣成反汇编⽂件
// objdump是GNU⼯具集中的⼀个命令
objdump -D a.out > 1.dis
内存地址机器码反汇编指令
8048154:  2f                      das
8048155:  6c                      insb  (%dx),%es:(%edi)
8048156:  69 62 2f 6c 64 2d 6c    imul  $0x6c2d646c,0x2f(%edx)
804815d:  69 6e 75 78 2e 73 6f    imul  $0x6f732e78,0x75(%esi)
8048164:  2e 32 00                xor    %cs:(%eax),%al
精简指令集:
交叉编译⼯具链:将源⽂件编译⽣成⽀持ARM架构的可执⾏程序
arm-none-linux-gnueabi-gcc 1.c
arm-none-linux-gnueabi-objdump -D a.out > 1.dis
内存地址机器码反汇编指令
8134:  62696c2f    rsbvs  r6, r9, #12032  ; 0x2f00
8138:  2d646c2f    stclcs  12, cr6, [r4, #-188]!  ; 0xffff
813c:  756e696c    strbvc  r6, [lr, #-2412]!  ; 0x96c
8140:  6f732e78    svcvs  0x00732e78
反汇编分析:
拓展:
ELF与BIN⽂件区别
gcc 编译出来的是elf⽂件。通常gcc –o test test.c,⽣成的test⽂件就是ELF格式的,在linuxshell下输⼊ ./test就可以执⾏。
bin ⽂件是经过压缩的可执⾏⽂件,去掉elf格式的东西。是直接的内存映像的表⽰。在系统没有加载操作系统的时候可以执⾏。
elf(executable  and  link  format)⽂件⾥⾯包含了符号表,汇编等。
bin⽂件是将elf⽂件中的代码段,数据段,还有⼀些⾃定义的段抽取出来做成的⼀个内存的镜像。
在Embedded中,如果上电开始运⾏,没有OS系统,如果将ELF格式的⽂件烧写进去,包含⼀些ELF格式的东西,arm运⾏碰到这些指令,就会导致失败,如果⽤arm-softfloat-linux-gnu-objcopy⽣成纯粹的汇编 bin⽂件,程序就可以⼀步⼀步运⾏。
两种⽂件都可以运⾏
机器最终只认BIN,之所以有ELF格式是在有操作系统时,操作系统会根据ELF解析出代码、数据等等,最终仍是以BIN运⾏。由于elf⽂件的信息⽐较全,所以可以⽤来以单步跟踪的⽅式运⾏。关键是看loader。
嵌⼊式开发的时候,我们的编译⼀个*.S⽂件,并最终⽣成bin⽂件,编译命令⼤致如下:
CC=arm-softfloat-linux-gnu-gcc
LD=arm-softfloat-linux-gnu-ld
OBJCOPY=arm-softfloat-linux-gnu-objcopy
$(CC) -g$(CFLAG) -c boot.S    #先将boot.S⽂件⽣成boot.o
$(LD) -g-Bstatic -T$(LDFILE) -Ttext 0x12345600 boot.o --start-group -Map boot.map -oboot.elf    #再将boot.o⽣成boot.elf,boot.elf通常就是可执⾏⽂件,类似于gcc-o test test.c 中的test⽂件,在LinuxShell下输⼊./test就可以执⾏。
$(OBJCOPY)-O binary boot.elf boot.bin    #接着将boot.elf->boot.bin,这样可以缩⼩代码尺⼨。
运⾏arm-softfloat-linux-gnu-objdump-h boot.elf 可以查看该⽂件的信息,但是如果变成
arm-softfloat-linux-gnu-objdump-h boot.bin会提⽰错误,为了看boot.bin⽂件信息,输⼊:
arm-softfloat-linux-gnu-objdump-h -b binary -m arm boot.bin就可以了。哈哈我也是现学了⼀招,其中参数-h可以被替换成为-D, -S,-s等等,请⽤arm-softfloat-linux-gnu-objdump--help查看器中表⽰的意义。
1.7 ARM数据的约定
ARM-V7约定:
char :8bits
half word:16bits
word:32bits
double word :64bits(cortex-a系列才⽀持)
ARM-V8约定:
char :8bits
half word:16bits
word:32bits
double word :64bits(cortex-a系列才⽀持)
quad word:128bits(ARM-V8架构才⽀持)
2、ARM⼯作模式和寄存器
2.1 ARM处理器的⼯作模式
总结:不同的⼯作模式下,完成不同的功能,及执⾏特定的代码,完成特定的功能
|--特权模式--|--异常模式--|-快速中断模式(FIQ)
|            |            |-普通中断模式(IRQ)
|            |            |-管理模式(SVC):当复位或软中断指令执⾏时进⼊此种模式
|            |            |-未定义指令异常模式(Und)
⼯  |            |            |-中⽌异常模式(Abort):当存取异常时会进⼊此模式
作  |            |            |-安全监控模式(Monitor)
--|            |                (cortex-A系列内核⽀持,所以会⽐armv系列多3个寄存器)
模  |            |
式  |            |--⾮异常模式 -->System
|      (属于⽤户模式的特权模式)
|
|--⾮特权模式-->user -> 执⾏⽤户空间的代码
普通中断模式(IRQ):当发⽣⼀个外部中断的事件,进⼊到IRQ模式,执⾏IRQ模式下对应的代码。外部中断事件:按键,定时器等
2.2 ARM处理器的寄存器组织(重点)
ARM内核 = 运算器 + 控制器 + 存储器
存储器 = cache + 寄存器
存储器:flash 内存(Memory)
cache(i-cache,d-cache),
寄存器(Register)
寄存器  cache  内存  flash
快 <-------------------慢读写速度
⼩ -------------------->⼤容量
贵 <-------------------贱价格
寄存器/cache/内存 : 掉电数据丢失
Flash:掉电不丢失
2.3 特殊寄存器
r13 -> 别名sp (the stack pointer)
栈指针寄存器,存放栈的地址
r14 -> 别名lr (the link Register)
链接寄存器, 保存的是返回地址
r15 -> 别名pc (the program counter)
程序计数寄存器, 保存当前取指指令的地址
cpsr -> (current program status register)
当前程序状态寄存器:存储的程序运⾏状态
每条指令执⾏的状态
处理器的⼯作模式
spsr -> (saved program status register)
保存程序状态寄存器:专门⽤于保存cpsr寄存器
2.4 CPSR寄存器的详解
2.5 ARM指令集和 Thumb指令集
ARM指令集:
⼀条指令占32位宽度,
ARM指令集的功能性更强,指令密度较低
PC取指每次⾃动加4
Thumb指令集:
⼀条指令占16位宽度
Thumb指令集的密度⼤。
PC取指每次⾃动加2
2.6 PC寄存器详解
PC寄存器中存放的是当前取指指令的地址
ARM指令集:
每条ARM指令占32bits的宽度
所有的指令必须4字节对齐,
pc寄存器中的值[31:2]位有效,[1:0]位未定义(⽆效) 0000 0000
0000 0100
0000 1000
0000 1100
pc = 0x3    @ 由于第[1:0]位未定义,永远当0处理  @ 因此从0x00地址开始进⾏取指
ARM指令集:
每条ARM指令占16bits的宽度
所有的指令必须2字节对齐,
pc寄存器中的值[31:1]位有效,[0]位未定义(⽆效)。0000 0000
x86架构和arm架构区别0000 0010
0000 0100
0000 0110
2.7 指令的三级流⽔线
取指器:根据PC寄存器中的值进⾏取指
译码器:翻译机器码,给到对应的执⾏器
执⾏器:执⾏指令,并将结果返回到寄存器
取指器,译码器,执⾏器是三个独⽴的硬件,
都是单周期的器件,⼯作互不影响。
指令1 指令2 指令3 指令4 指令5 指令6
1 取指
2  译码取指
3 执⾏译码取指
4    执⾏译码取指
5    执⾏译码取指
6      执⾏译码取指
7      执⾏译码取指
8          执⾏译码取指
⼀条指令的执⾏时间: 8 / 6 = 1
跳转和中断都会打断指令的流⽔线。
arm7 三级流⽔线
arm9 五级流⽔线
arm11 七级流⽔线
cortex-A9 13级流⽔线 (未知)
cortex-a53 8级流⽔线 (?)
3、汇编
3.1 汇编代码中的主要符号

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。