ARM基础 -- 2

本文来源于朱有鹏老师的课程,有兴趣购买课程学习的小伙伴,可以私聊我,我拉你进朱老师的学习群。

一、可编程器件的编程原理

1.1 电子器件的发展方向

模拟器件 --> 数字器件
ASIC(Application Specific Integrated Circuit 专用集成电路):这个是不可以编程的 --> 可编程器件

1.2 可编程器件的特点

  1. CPU在固定频率的时钟控制下, 节奏运行。
  2. CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行。
  3. 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(本文中提及的是ARM公司)定义的,本质上是一串串1和0组成的数字。这就是CPU的汇编指令集。

1.3 整个编程及运行过程

从源代码到CPU执行过程:
.c等高级语言源代码 ----(编译器)----- .S汇编源代码 ----(汇编器)----- Elf格式二进制可执行程序 ----(Objcopy工具)-----Bin格式烧录文件 ----(总线)----- CPU读入后先解码 ----(CPU内部指令流水线)----- CPU执行指令。

注: 对预编译,编译,汇编,链接过程不清楚的,可以看看这位小伙伴的博文

二、指令集对CPU的意义

2.1 汇编语言与C等高级语言的差异

  1. 汇编难写,C好写。
  2. 汇编无可移植性,C语言有一定的可移植性,Java等更高级的语言移植性更高。
  3. 汇编语言效率最高,C语言次之,Java等更高级语言效率更低。
  4. 汇编不适合完成大型复杂的项目,更高级语言更适合完成更大,更复杂的项目。

2.2 汇编语言的本质

  1. 汇编的实质是机器指令(机器码)的助记符,是一种低级符号语言
  2. 机器指令集是一款CPU的编程特性,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能,机器指令集就好像CPU的API接口一样。

2.2.1 编程语言的发展过程

  • 纯机器码编程
  • 汇编语言编程
  • C语言编程
  • C++语言编程
  • Java C#等语言编程
  • 脚本语言

2.2.2 汇编语言的特点和用途

  • 汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特性。
  • 不同CPU的机器指令集设计不同,因此汇编程序不能在不同的CPU间互相移植。
  • 使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要汇编处理。

三、RISC和CISC的区别

3.1 复杂指令集CPU — CISC

  • Complex Instruction-set computer 复杂指令集CPU
  • CISC体系的设计理念是用最少的指令(注意说的是指令而不是指令集)来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编程器好设计。CISC出现较早,至今Intel还一直采用CISC设计。

3.2 精简指令集CPU — 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条左右。
    注:ARM为什么功耗低? (乱序执行能力不如X86)

3.5 发展趋势

  • 没有纯粹的RISC或CISC,发展方向是RISC与CISC结合,形成一种介于两者之间的CPU类型。

四、统一编址&独立编址

4.1 什么是IO?什么是内存?

  • 内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体的内存单元。
  • IO(input and output)是输入输出接口,是CPU和其它外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路,一般的,IO就是指CPU的各种内部和外部的外设。

4.2 内存访问方式

  • 内存通过CPU的数据总线来寻址定位,然后通过CPU的数据总线来读写。
  • CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是确定的,而内存是需要占用CPU的寻址空间的。
  • 内存和CPU的这种总线连接方式属于直接连接,优点是效率高,访问快,缺点是资源有限,拓展性差。

4.3 IO访问方式

  1. IO是指CPU连接的各种外设。
  2. CPU访问各种外设有两种方式,具体如下:
      (1) 类似于访问内存的形式,即把外设的寄存器当做一个内存地址来读写,从而以访问内存相同的方式来访问各种外设,叫 IO与内存统一编址方式。
      (2) 使用专用的CPU指令来访问某种特定外设,叫 IO与内存独立编址。

对比

  • 由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。
  • IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需占用一定的CPU地址空间,而CPU的地址空间是有限资源。
  • IO与内存独立编址方式,优势是不占用CPU地址空间,缺点是CPU设计变复杂了。

五、程序与数据

  • 程序运行时两大核心元素:程序+数据
  • 程序是我们写好的源代码经过编译,汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。
  • 数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是改变数据的值。

六、冯诺依曼结构和哈佛结构

  • 程序和数据都放在内存中,且彼此不被分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
  • 程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)均采用哈佛结构。

6.1 优劣对比

  • 冯诺依曼结构中程序和数据放在一起,因此安全和稳定性是个问题,好处是处理起来简单
  • 哈佛结构中程序(一般放在ROM、FLASH中)和数据(一般放在RAM中)独立分开存放。因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)。
注:FLASH=ROM=硬盘(只读属性) DDR=内存=RAM

七、软件编程控制硬件的关键 — 寄存器

7.1 寄存器的定义

  • 寄存器属于CPU外设的硬件组成部分。
  • CPU可以像访问内存一样访问寄存器。
  • 寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”。
  • 正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写硬件的寄存器。

7.2 关于寄存器

  • 编程操作寄存器类似于访问内存。
  • 寄存器中每个bit位都有特定的含义,因此编程操作时需要位操作。
  • 单个寄存器的位宽一般和CPU的位宽(int/char)一样,以实现最佳访问效率。
注:CPU的位宽指的是数据总线的条数

7.3 两类寄存器

Soc中有两类寄存器:通用寄存器和SFR。

  • 通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要CPU的支持和参与。
  • SFR(Special Function Register,特殊功能寄存器)不在CPU中,而存在CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。
    注: SFR:硬件外设某个寄存器的地址,对应的数据位都是设计时定义的。

八、ARM 体系结构要点总结

8.1 ARM 是RISC架构

  • 常用ARM汇编指令只有二三十条
  • ARM是低功耗CPU
  • ARM 的架构非常适合单片机、嵌入式、尤其是物联网领域,而服务器等高性能领域, 目前主导还是IntelARM是统一编址的,
  • 大部分ARM (m3 m4 m7 m0 ARM9 ARM11 A8 A9等)都是32位架构
  • 32位ARM CPU 支持的内存少于4G,通过CPU 地址总线来访问
  • SOC的各种内部外设通过各自的SFR 编程访问,这些SFR的访问方式类似于访问普通内存,这叫IO与内存统一编址

8.2 ARM 是哈佛结构的

  • 常见ARM (除ARM7外)都是哈佛结构的
  • 哈佛结构也决定了 ARM逻辑程序(使用实地址即 物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知连接器如何组织程序,对于OS之上的应用(工作在虚拟地址之中)则不需要考虑这么多
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多维不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值