arm初识
一.CPU从指令集角度分类
1.1. CISC (X86)
1.1. 1. CISC CPU 指complex instruction set computer复杂指令集CPU
1.1.2. CISC体系的设计理念:
a. 是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计
1.2. RISC (RAM)
1.2.1. RISC CPU 指:Reduced Instruction-Set Computer精简指令集CPU
1.2.2. RISC的设计理念:
a. 让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了。
1.3. RISC和CISC对比
1.3.1. 从指令角度
a. 一般典型CISC CPU指令在300条左右
b. ARM CPU常用指令30条左右
c. RISC 设计者把主要精力放在那些经常使用的指令上,尽量使它们具有简单高效的特色。对不常用的功能,常通过组合指令来完成。因此,在RISC 机器上实现特殊功能时,效率可能较低。但可以利用流水技术和超标量技术加以改进和弥补。而CISC 计算机的指令系统比较丰富,有专用指令来完成特定的功能。因此,处理特殊任务效率较高
1.3.2. 从CPU芯片电路
a. RISC CPU 包含有较少的单元电路,因而面积小、功耗低;而CISC CPU 包含有丰富的电路单元,因而功能强、面积大、功耗大。
二. IO与内存编址
2.1. 什么是IO?
2.1.1. IO(input and output)是输入输出接口,是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设。
2.2. 什么是内存?
2.2.1. 内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元
2.3. IO与内存的编址
2.3.1. IO与内存统一编址(ARM)
a. 把外设寄存器类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式
2.3.2. IO与内存独立编址(X86)
a. 使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址方式
2.3.3. 统一编址和独立编址区别
a. 由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高
b. IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源
c.IO与内存独立编织方式,优势是 不占用CPU地址空间,缺点是CPU设计变复杂了
三. 哈佛结构和冯诺依曼结构
3.1. 代码的构成元素
3.1.1. 代码的两大核心元素:程序部分 + 数据部分
3.1.2. 程序部分
a. 程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。
3.1.3. 数据部分
a. 数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改变数据的值。
3.2. 冯诺依曼结构
3.2.1. 程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
3.3. 哈佛结构
3.3.1. 程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9, cortex-A等)均采用哈佛结构。
3.3.2. 哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多
3.4. 两个结构对比
3.4.1. 冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单
3.5.2. 哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)
四. 寄存器
4.1. 寄存器分类
4.1.1. 分为两大类
a. 通用寄存器
b. SFR(special function register,特殊功能寄存器)
4.1.2. 通用寄存器
a. 通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与
4.1.3. SFR
a. SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设
4.1.4.寄存器操作示例
汇编: ldr r1, =0xE0200280 str r0, [r1] mov r0, #0 C: int *p = (int *)0x30008000; *p = 16;
参考《朱老师.1.2ARM裸机课件》