1:可编程器件的编程原理
1.1;电子器件的发展
1.2 可编程器件的特点
cpu为什么是可编程器件
因为cpu在固定的时钟频率控制下节奏运行 的
cpu在每个节拍下只做一件事情
例如我们S5PV2410芯片的主频为1G 其表示就是一秒钟cpu有2的10次方个节拍表示1ns就一个节拍
cpu可以通过总线读取外部存储器(flash)中的二进制指令集进行运行
cpu所执行 二进制指令集 是在ARM公司就规定好了的 本质就是一窜01的编码 但是 在cpu中已经被规定成指定的作用了
1.3:从源代码到CPU执行过程
2;指令集对cpu的意义
2.1;先介绍一下汇编语言与c语言及其他高级语言 的区别
就学习使用相对而言:汇编要比其他语言难学难使用
就移植性问题:汇编语言几乎没有移植性 因为每台cpu都有相对应的汇编指令,而c语言因为编译器的存在使其有一定的移植性 而java等其他语言移植性就比较高了
就执行效率而言 当然是汇编 的效率最高 最贴近机器码,而相对于c语言已经其他语言就要效率相对较低
就代码量而已 汇编语言不适合编辑大型项目 而一般使用其他语言来编写
2.2;汇编的本质
汇编的实质就是机器指令(机器码01)的借助符。一种低级的符号语言
机器指令是什么?机器指令集是一款cpu所特有的的编程特征 是这款CPU的设计者制定的,大家都知道cpu其实是芯片 内部都是电路我们所学的数电 我们传入的机器码就是01这些代码高低电平的信号 ,cpu根据自己配套的机器码,分析这些01电平需要完成的作用 这样组合完成cpu的某项功能。CPU的内部电路设计就是为了实现这些指令集的功能。机器指令集就好象CPU的API接口一样。
借助符就知道了吧 一大串01的指令 对于这款cpu可以完成这个作用 就这样我们使用一些符号来代替这一串机器码。借助符就是便于我们程序员来操控的。汇编器就可以完成将这些借助符转换成机器码给cpu执行
2.3;编程语言的发展过程以及各个语言适合的场景
纯机器码编程:就是01的二进制
高低电平在cpu芯片中根据指定的编码转换实现不同的功能
汇编语言编程:机器指令(机器码)的助记符,
不同的cpu:配有的不同的指令集—————因此无移植性
汇编器 将人读写的汇编语言转换成cpu电路读写的高低电平机器码。
应用于 需要高效率的地方 cpu启动 引导的代码
C语言编程:c语言相对汇编就更加高级一些 更加适合程序员使用
c语言的移植性更高了。
因为不同cpu的配置了不同的编译器可以把相同c语言编写成它能使用的汇编语言
c语言就主要应用于系统层,这种需要效率又要有一定移植项目大的层次
C++语言编程:Java C#等语言编程:在c语言的基础上进一步集成
效率低 但是集成高 可以适用于大型项目
应用于应用层 适合应用开发
脚本语言编程:更加简单
每种语言的更新换代都离不开编译器的发展
所以在编程语言的发展史上最大的功臣就是编译器
2.4总结
汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征。
不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU间互相移植。
使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要用汇编处理。
好刀要用到刀刃上 表示不同的语言有他各自的优缺点 我们需要更加他的优缺点很好利用起来
例如 我们的c语言内嵌汇编语言编程 单独只靠c语言是可以的 但是我们为什么还要靠汇编呢 这就牵扯到一个机器的执行效率问题
3;CISC与RISC
3.1CISC(complex intruction-sex computer)复杂指令集电脑cpu
他的设计理念就是用最少的指令来完成任务;
把cpu复杂化 让cpu读取更多的汇编操作 意思就是cpu电路中的功能模块更多了
譬如计算乘加法只需要一条指令指令即可,而其他的可能需要多条指令组合才能完成 因为该款cpu中存在乘加法电路 而其他的没有 则需要一些指令调用配套的电路组合才能完成)
特点 : 因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计,因为基本都是一条语句完成一个作用不需要组合。CISC的cpu的常用汇编指令大约有300条 也就是cpu中大约有300多个模块 来读取这些汇编指令转换成的机器码进行操作。并且我们汇编的程序员需要知道这300条指令才能对CISC进行开发
至今Intel还一直采用CISC设计
3.2;Reduced Instruction-Set Computer精简指令集CPU
他的设计理念:让软件来完成具体的任务,CPU本身仅提供基本功能指令集。
就是把cpu简单化 cpu芯片中只含有几十个常用的电路模块 ——也就是说RISC的cpu的汇编指令也就只有几十条 ,我们需要通过这个几十条语句 的组合才能完成某些功能 而不像 CISC这样有直接的模块工作 RISC需要程序员自己编写进行组合 cpu只提供简单常用的 基本指令集。
特点:因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了。cpu简单化了 但是编译器困难了 汇编语句少了 但是需要进行组合利用了。而不是想CISC那样直接利用
ARM芯片就是典型的RISC精简指令集 的代表
3.3;cpu的发展历程
RISC与CISC指令数对比
一般典型CISC CPU指令在300条左右
ARM CPU常用指令30条左右
4:统一编址与独立编址&冯若依曼结构与哈弗结构
4.1;什么是内存 什么是I/O接口
内存我们之前介绍了 DDR 程序运行的场所,内存与cpu之间使用总线连接,cpu通过地址总线传送相关地址信息到内存中找到具体的内存单元块。
I/O 我们都知道的是他是输入输出接口(input and output);是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设;其实他就是我们外设 但是再深入一点 我们cpu访问I/O访问外设其实访问的是什么 是外设里面的寄存器 通过访问读写外设的寄存器来进行操控的 因此可以把I/接口理解成寄存器
4.2;内存与I/O的访问方法
内存是cpu通过地址总线对内存进行寻址定位的 通过数据总线来对具体的内存单元块来进行数据传输的
一款cpu的地址总线的位数是cpu在设计时就定制的,因此 一款cpu寻址的范围也就是确定的 。内存就是要占用cpu的寻址空间的 注意不是cpu所有的寻址空间都给了内存,还有I/O等等 例如S5PV2410 cpu有32位地址总线 应该是4g的cpu寻址范围,但是它的内存只分配了1.5g。其余的用在其他地方。
内存是与cpu直接通过总线相连的 属于直接连接 点是效率高访问快,缺点是资源有限,扩展性差。
I/O指的是与CPU连接的各种外设的寄存器
cpu访问外设寄存器的方法有两种 这也就是 我们的统一编址和独立编址了
I/O与内存 的统一编址方式:将外设中的寄存器当做一个内存单元一样进行方法 因此就跟访问内存没有了区别 这就叫I/O与内存的统一编址
I/O与内存的独立编址方式:使用cpu独特的指令对外设寄存器进行访问 这就是独立编址了 因为每次对不同 的外设寄存器那么就要使用不同 的指令 则与我们 的CISC的cpu设计类似 cpu指令多
ARM中访问IO和内存的方法是一样 的 则是统一编址
intel中访问 的IO与内存方法不一样 则是 独立编址 并且 intel的cpu是cisc模式,指令多刚好与性质符合 通过指令对寄存器访问
4.3;程序与数据
程序运行时两大核心元素:程序 + 数据
程序就是我们所编辑的源代码以及编译链接后变成 的可执行文件都是程序。并且程序cpu是不可修改的
数据 就是我们在程序中定义的变量 全局变量 局部变量等等,需要cpu进行运算修改的
常说 程序是数据的加工器 程序就是为了对数据进行各种各样的加工而产生 的
程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。
数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改变数据的值。程序就是对数据加工的机器
4.4 冯诺依曼结构与哈佛结构
就是因为有程序数据的存储以及cpu不用对程序修改 而需要对数据进行 修改 就导致了有两种存储结构 来存储程序和数据
冯若依曼结构 :程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构
就是把程序和数据存储在一起 进行交织存储 存储一块 因此就会导致存储的这块区域cpu即可读也可写,则会导致一些安全稳定隐患 我们可以将程序修改,在运行过程中将程序修改是非常危险的 这也是黑客攻击的一个漏洞 通过修改程序对来下病毒。
Intel的CPU均采用冯诺依曼结构。
哈弗结构 :程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构
就是把程序和数据分开存储 将程序存储到只能让cpu读而不能写的地方 数据则可以读写地方 例如我们所说的 代码区和数据区 也可以是ROM(flash)和RAM(内存),同样还可以都放在内存中但是不能交叉存储 需要分开 因为程序不准cpu进行修改 保证安全
大部分的单片机(MCS51、ARM9,嵌入式等)均采用哈佛结构。
优劣对比 从而得出各自适用的领域
冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单。
哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)
5;软件编程控件硬件的关键——寄存器
之前我们说过I/O的实质就是外设的寄存器 外设就是我们所说的硬件
之前还说了在ARM里面嵌入式里面 IO与内存都是统一编址的
那么我们是怎么通过软件编程控制硬件的呢?
1:通过对外设的寄存器的读写进行控制外设硬件的
2;通过向内存一样的地址总线的寻址方式找到寄存器的地址
3;通过向内存传输数据一样通过数据总线向寄存器传输数据
就是这么三步 通过软件编程 来修改寄存器的值 来达到控制外设
5.1;什么是寄存器
寄存器是真实存在的硬件设备 他属于cpu外设的硬件组成部分
cpu可以向访问内存一样访问寄存器(统一编址)
寄存器是cpu硬件设计者特意制定的 目的就是为了留在外设为来充当软件编程的“活动开关 ”
寄存器就如汇编指令是cpu的编程api一样, 寄存器是外设硬件的软件编程接口API。
使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。
5.2;寄存器具体是怎样操作硬件的
我们编写软件是就要考虑这个问题 寄存器是怎样操作硬件 的 这觉得我们需要怎么修改寄存器的值
这时候我们就需要看芯片开发手册了
编程操作寄存器类似于访问内存(统一编址
寄存器中每个bit位都有特定含义,因此编程操作时需要位操作。几个位就控制一个引脚的某个模式
单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率。例如32位的数据线一个时钟节拍就是传输一次 因此位宽一样可以达到最佳访问效率 反正他都是要传输过去 所以你就可以都利用起来
5.3;通用寄存器和特殊寄存器
特殊寄存器:SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。
其实有两种寄存器 我们上面说的都是特殊寄存器 有什么特殊的地方呢?
1;cpu的硬件设计师事先定义好了 不能修改 。某段bit表示某个引脚的作用 这个是不能修改的 。
2;一个寄存器是为某个功能特定制定的使用的 跟某个外设绑定在一起的。
通用寄存器:就是cpu图解中的那块寄存器 在cpu内部的 是通用的没有事先定义的
(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。
看过实例 分别是通过汇编和c语言来对寄存器进行操作
- ldr r1, =0xE0200280
str r0, [r1]
mov r0, #0//r0,r1就是通用寄存器汇编才用 - int p = (int )0x30008000;
*p = 16;如何往一个特殊寄存器里面写值
6;对ARM的体系结构进行总结
ARM是属于RISC架构的cpu。因此ARM只有常用的二三十条指令,并且ARM是低功耗cpu的,对功耗是十分控制的 因此他非常适合单片机和嵌入式领域
而追求性能的服务器等高性能领域目前主导还是Intel、
ARM是统一编址的,内存与io是进行统一编址 的
内存和io外设寄存器是统一编址的 都是地址总线进行寻址定位的
大部分ARM(M3 M4 M7 M0 ARM9 ARM11 A8 A9等)都是32位架构
32位ARM CPU支持的内存少于4G,通过CPU地址总线来访问还需要访问io
而io特殊寄存器 SFR
在SOC芯片中各种内部外设都是通过对各自的SFR编程进行控制的 。这些SFR的访问方式类似于访问普通内存,这叫IO与内存统一编址。
ARM的程序与数据的存储结构都是哈佛结构。
哈佛结构保证了ARM CPU运行的稳定性和安全性,因此ARM适用于嵌入式领域
哈佛结构也决定了ARM裸机程序(使用实地址即物理地址数据手册上的地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多
该篇博客主要介绍了cpu 从以下方面
1:可编程器件的编程原理:介绍了 cpu的工作原理,时钟节拍以及它是可编程器件可以后期烧录程序
2:指令集对CPU的意义:介绍了汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征。 并且比较了各种编程语言
3:RISC和CISC的区别:介绍了两种cpu的架构 精简指令集cpu和复杂指令集cpu
4:统一编址&独立编址:对于内存和io寄存器的寻址有两种方法 跟内存一样的使用地址总线定位的是统一编址 使用特定指令进行寻址的叫独立编址
5:哈佛结构&冯诺依曼结构:对于程序代码与数据的存储 是否存储在一起 有了两种存储结构
6:软件编程控制硬件的关键-寄存器:通过SRF编程 读写外设的寄存器来实现对外设的控制