一、可编程器件的编程原理
1.1、电子器件的发展方向
模拟器件——>数字器件
ASIC(专用芯片,一个芯片只能完成一个任务)——>可编程器件
1.2 、可编程器件的特点
CPU在固定频率的时钟控制下有节奏运行;
CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行;
这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,本质上是一串由1和0组成的数字。这就是CPU的汇编指令集。
1.3 、整个编程及运行过程
程序员用汇编指令编程——>经汇编器会变成二进制可执行程序文件——>二进制文件被CPU读取进去——>CPU内部电路对二进制文件解码(即对命令进行解析)——>解码通过则CPU执行指令、完成指令动作。
如果程序员用C语言等高级语言编程,则编译器先将C语言程序编译为汇编程序,再进行上面的后续部分。
在Linux中,Elf格式的文件是可执行文件;而在windows中后缀为.exe的文件是可执行文件。## 1.4 、从源代码到CPU执行过程
在Linux中,Elf格式的文件是可执行文件;而在windows中后缀为.exe的文件是可执行文件。
二、指令集对CPU的意义
2.1、 汇编语言与C等高级语言的差异
汇编难写,C好写;
汇编无可移植性,C语言有一定可移植性,Java等更高级语言移植性更强;
汇编语言效率最高,C语言次之,Java等更高级语言效率更低;
汇编不适合完成大型复杂的项目,更高级语言更适合完成更大、更复杂的项目;
注意:语言没有好坏之分,只有合适与不合适之分。要注意区分哪种情况用什么语言,就需要了解语言的特性。
2.2 、汇编语言的本质
汇编的本质是机器指令(机器码)的助记符,是一种低级符号语言。
机器指令集是一款CPU的编程特征,是这款CPU的设计者指定的。CPU的内部电路设计就是为了实现这些指令集的功能。机器指令集就好像CPU的API接口一样。
指令的实现体现在硬件上就是电路,通过设计一系列的电路从而实现这个指令的功能;
2.3 、编程语言的发展过程
纯机器码编程;
汇编语言编程;
C语言编程;
C++语言编程;
Java C#等语言编程;
脚本语言编程;
2.4 、总结
汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征;
不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU间互相移植;
使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要用汇编处理;
三、RISC和CISC的区别
3.1、CISC
complex instruction -set computer 复杂指令集CPU
CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计。
3.2、RISC
Reduced Instruction-Set Computer 精简指令集CPU
RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集只有很少的指令,这种设计相对于CISC ,CPU的设计和工艺简单了,但是编译器的设计变难了。
3.3、CPU设计方式发展
早期简单CPU,指令和功能都很有限;
CISC年代——CPU功能扩展依赖于指令集的扩展,实质是CPU内部组合逻辑电路的扩展;
RISC年代——CPU仅提供基础功能指令(譬如内存于寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础架构来灵活实现。
3.4、 RISC 与 CISC 指令数对比
一般典型CISC CPU指令在300条左右;
ARM CPU常用指令30条左右;
3.5 、发展趋势
没有纯粹的RISC 或 CISC,发展方向是RISC与CISC结合,形成一种介于2者之间的CPU类型。
四、统一编址&独立编址&哈佛结构&冯诺依曼结构
4.1 、什么是IO?什么是内存?
CPU的运行速度很快,而硬盘的读取速度很慢,如果直接从硬盘读取数据交给CPU处理,就会大大降低效率,所以想了一个办法就是在CPU中增加了一二三级缓存,这个缓存的读取速度就大大提高了,但是成本很高,所以空间很小。于是,就出现了内存,内存的读取速度介于缓存和硬盘之间,价格也合适,空间也介于缓存和硬盘之间。所以内存就成了用来存放运行程序的场所。
内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元;
IO(input and output)是输入输出接口,是CPU和其它外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设(的寄存器)。
4.2 、内存的访问方式
内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写。
CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的。
内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问快,缺点是资源有限,扩展性差。
4.3、IO的访问方式
IO指的是与CPU连接的各种外设。
CPU访问各种外设有2种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式(RISC思想);另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址(这是CISC的思想)。
4.4 、对比
由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。
IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。
IO与内存独立编址方式,优势是不占用CPU地址空间,缺点是CPU设计变复杂了。
4.5 、程序和数据
程序运行时两大核心元素:程序 + 数据
程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。
数据是程序运行过程中定义和产生的变量的值,数据是可以读写的,程序运行实际就是为了改变数据的值。
4.6 、冯诺依曼结构和哈佛结构
程序与数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)和嵌入式均采用哈佛结构。
4.7 、优劣对比
冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单。
哈佛结构中程序(一般放在ROM-Read Only Memory、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)。
五、软件编程控制硬件的关键——寄存器
5.1、 什么是寄存器
寄存器属于CPU外设的硬件组成部分;
CPU可以像访问内存一样访问寄存器;(IO与内存统一编址)
寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”;
正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API 。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。
5.2、寄存器的演示
请看S5PV210 datasheet;
编程操作寄存器类似于访问内存;
寄存器中每个bit位都有特定含义,因此编程操作时需要位操作;
单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率;
5.3 、两类寄存器
SoC中有2类寄存器:通用寄存器和SFR
通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与;
SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就似乎硬件编程控制的方法。
六、ARM体系结构要点总结
6.1、ARM是RISC架构
常用ARM汇编指令只有二三十条;
ARM是低功耗CPU;
ARM的架构非常适合单片机、嵌入式,尤其是物联网领域;而服务器等高性能领域目前主导还是Intel;