第二部分 ARM裸机之体系架构介绍一
一、CPU是如何运行的?
1、CPU的运行需要固定的频率时钟,就类似人一样需要心脏跳动。
2、CPU是通过总线的方式访问外部存储器中的二进制指令集(由ARM公司设计CPU规定了的指令集),然后进行解码执行完成一些列的输入输出动作。
二、程序是如何从代码转换为机器可是识别的可执行语言的?
1、汇编编程模式步骤
(1)汇编指令编程
(2)通过汇编器将其转换为二进制可执行文件
(3)CPU经过总线读取二进制可执行文件
(4)CPU内部电路进行解码
(5)依据解码结果执行指令的动作
2、高级语言编程模式步骤
(1)高级语言(C、java…)先是通过编译器编译为汇编程序
(2)执行汇编模式的步骤
3、从代码转换为机器语言的流程
三、指令集对CPU的意义
我们知道编程语言有很多机器语言、汇编、C、java、C++等..它们之间有什么关系和特点呢?
在早期计算机识别的都是二进制机器语言,打孔纸带,效率很低。后来就发明了汇编语言,作为机器指令的助记符,但是很快人们就发现汇编语言移植性差,于是推出了C语言。当项目工程发展到一定阶段C语言这种面向过程的语言开始出现不适合工程管理,于是产生了面向对象语言C++等高级语言。
事实上,机器指令集是一款CPU的编程特征,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能。也就是说不同CPU的指令集是不一样的,51和avr单片机的CPU指令是不同的。这样移植性就很差!
编译器的发明就是解决了这个问题,通过不同的编译器将同一C语言程序根据CPU型号编译适用于不同CPU的可执行汇编指令。那有童鞋就会问,移植性这么差,为什么还要用汇编呢?因为它的执行效
率是最高的,在内核中使用很多,而且C语言的调用是需要建立在栈的基础上,一开始都是通过汇编指令为C语言的运行提供环境。以后会讲到哦~~大概先了解一下。
四、CISC和RISC是什么东东?
大家可能听过这个名词,但是不知道是怎么来的?笔者在这里将学到的给大家讲讲。
CISC体系:英文名称complex instruction set computer复杂指令集。设计理念:用最少的指令完成任务,比如51单片机中的乘法指令MUL DIV。功能的扩展是依靠CPU内部组合逻辑电路的扩展。
RISC体系:英文名称Reduced Instruction-Set Computer精简指令集CPU。设计理念:CPU提供基本的指令集,具体任务由软件完成。功能的扩展是依靠使用CPU的设计人员实现。
Intel、IBM的CPU大部分是CISC架构,ARM的CPU基本都是RISC架构。说来也巧合,CISC是当时最流行的体系架构,CPU的内部电路设计是很复杂的,只有几个大巨头Intel、IBM才能进行生产。而ARM那时候只是小罗罗,没有资金加工这么庞大复杂的IC,所以CPU就采用简单的设计理念。说到这里,大家就明白了为什么电脑的CPU都是CISC架构,而手机、平板等消费电子基本都是RISC架构。RISC架构不仅是价格低,而且由于电路简单功耗也更低。所有随着近年来的嵌入式的发展,ARM凭借这个优势发展特别迅速。有时候的劣势,经过时间的推移往往成为优势!(老朱说的话,借用一下)
五、统一编址和独立编址
1、神马是IO、内存和外存?
IO:输入输出设备 通常意义也就是CPU的内部或者外部设备。
内存:程序运行的场所,一般就是RAM。CPU通过地址总线访问内存单元,再通过数据总线读写数据。例如SRAM 静态内存 (上电不需要初始化) DRAM(SDRAM)动态内存。
外存:是外部存储设备的简称,类似与电脑的硬盘,也就是我们经常说的ROM。
下面举些例子,让大家了解一下SoC常用外存:
NorFlash :总线式访问,接到SROM bank,优点是可以直接总线访问,一般用来启动。价格高
NandFlash:分为SLC和MLC(有坏块,需要进行坏块管理,但是便宜)
eMMC/iNand/moviNand:其中eMMC(embeded MMC)iNand是SanDisk公司出产的eMMC,moviNand是三星公司出产的eMMC。
oneNAND:oneNand是三星公司出的一种Nand
SD卡/TF卡/MMC卡:笔记本的插孔那种SD卡
eSSD:固态硬盘
2、CPU访问内存和外存方式
内存需要直接地址访问,所以CPU是通过地址总线和数据总线的访问方式连接的(好处是直接访问,随机访问;坏处是占用CPU的地址空间,大小受限);
外存是通过CPU的外存接口来连接的(好处是不占用CPU的地址空间,坏处是访问速度没有总线式快,访问时序较复杂,如SDIO)
3、CPU访问外设的2种方式
(1)是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式。(RICS)
(2)是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址。(CISC)
4、统一与独立编址的好坏分析
IO与内存统一编址方式:优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。例如读取ADC外设是通过读SFR寄存器实现的,而SFR是占用地址空间的。
IO与内存独立编址方式:优势是不占用CPU地址空间,缺点是CPU设计变复杂了,CPU需要设计复杂的指令集。
六、冯诺依曼结构与哈佛结构
1、冯诺依曼结构:程序和数据都放在内存(桌面电脑就是这么搞的)
这样设计的话,程序和数据不好处理。CPU都可以进行读写操作,
安全和稳定就会出现问题。所以计算机经常会导致被病毒攻击。
2、哈佛结构:程序和数据分开独立放在不同的内存块中,彼此完全分离的结构(例如MCS51 ARM都是这种结构)
程序放在ROM、flash中,数据存放在RAM。ROM是不能写的所以不会被改变,嵌入式控制安全性能得到保证。
七、软件编程如何控制硬件?
不知道大家有没有这样的疑问?为什么我们通过软件编程对GPIO口操作的时候,这个引脚会拉高拉低呢?软件是如何去影响硬件的呢?
首先,寄存器属于CPU外设的硬件组成部分,我们对GPIO操作是对这个寄存器进行控制,其次,需要知道的是寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关” 。也就实现了通过软件改变CPU的内部电路运行状态。最后,当我们需要访问某个硬件时(uart),其实就是对与该硬件相关的SFR进读写操作。
那么通过编程如何去操作寄存器呢?有两种方式,汇编和C语言操作:
ldr r1, =0xE0200280 //GPJ2CON的地址送给r1
str r0, [r1] //将r0中的内容写入到以0xE0200280为地址的内存单元
int p = (int )0x30008000;//指针p指向内存单元地址
*p = 16;
八、什么叫地址映射?
笔者所用的开发板芯片型号是S5PV210属于ARM Cortex-A8架构,32位CPU,CPU设计时就有32根地址线和32根数据线。
32根地址线决定了CPU的地址空间为4G,那么这4G空间如何分配使用?这个问题就是内存映射问题。其实对于IO与内存统一编址的ARM体系来说,其32位的地址总线寻址是达不到4G的,因为寄存器SFR是需要占空间的。上X210数据手册,关于地址空间的分布如下所示。
我们可以看到,210的内存RAM是从0x2000_0000—0x7FFF_FFFF的,也就是1.5G(技巧:1FFF_FFFF = 2^29=2^30/2 = 1G/2=512M)
不知不觉写了这么多了。。。希望对初学者有些帮助~~学习愉快!