看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果。所以,决定总结学习下ARM流水线。

ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/MHz的指令处理速度。

PS:

MIPS(Million Instruction Per Second)表示每秒多少百万条指令。比如0.9MIPS,表示每秒九十万条指令。

MIPS/MHz表示CPU在每MHz的运行速度下可以执行多少个MIPS,如0.9MIPS/MHz则表示如果CPU运行在1MHz的频率下,每秒可执行90万条指令。

如果CPU在20MHz的频率下,每秒可运行1800万条指令。MIPS/MHz可以很好的反映CPU的速度。

3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行。

⑴ 取指从存储器装载一条指令

⑵ 译码识别将要被执行的指令

⑶ 执行处理指令并将结果写会寄存器

以前学过的51单片机,因为比较简单,所以它的处理器只能完成一条指令的读取和执行后,才会执行下一条指令。这样,PC始终指向的正在“执行”的指令。

而对于ARM7来说因为是3级流水线,所以把指令的处理分为了上面所述的3个阶段。

所以处理时实际是这样的:ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出。

所以,ARM7流水线只有在取第4条指令时,第1条指令才算完成执行。

下图生动形象的说明了3级流水线的处理机制

下面一句话很关键:无论处理器处于何种状态,程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或者正在“译码”的指令。

人们一般会习惯性的将正在执行的指令作为参考点,即当前第1条指令。

所以,PC总是指向第3条指令,

或者说PC总是指向当前正在执行的指令地址再加2条指令的地址。

处理器处于ARM状态时,每条指令为4个字节,所以PC值为正在执行的指令地址加8字节,即是:

PC值 = 当前程序执行位置 + 8字节

处理器处于Thumb状态时,每条指令为2字节,所以PC值为正在执行的指令地址加4字节,即是:

PC值 = 当前程序执行位置 + 4字节

下面一个例子就很好的说明了这个问题。

0x4000 ADDPC,PC,#4 ;正在被执行的指令,将地址值PC+4写入PC
0x4004 ...;正在被译码的指令
0x4008 ...;正在被取指的指令,PC=0x4008
0x400C ...;PC+4=0x400C  

另外补充说明就是根据以上描述,流水线只有被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅单周期指令)。

如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线被再次填满。因此,尽量地少使用跳转指令可以提高程序的执行效率

这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pclr-irq #4。

ARM7的三级流水线过程相关推荐

  1. ARM中流水线分析——以三级流水线进行分析

    一.ARM流水线技术基础知识 流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器的效率和吞吐率.ARM7是冯·诺依曼结构,采用了典型的三级流水线,而ARM9则是哈佛结构,采用五级流水线技 ...

  2. ARM base instruction -- 简单三级流水线

    /*  * 简单三级流水线  */     IF        Instruction fetch                                            取指      ...

  3. 经典ARM7三级流水线的分析

    3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行. ⑴ 取指从存储器装载一条指令 ⑵ 译码识别将要被执行的指令 ⑶ 执行处理指令并将结果写会寄存器 对于ARM7来说 ...

  4. 【Java面试题全集】

    2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...

  5. ARM的流水线与PC值的关系

    一.两种结构: 冯 · 诺依曼结构 和 哈佛结构: 1.冯·诺依曼结构 冯·诺依曼结构又称作普林斯顿体系结构(Princetionarchitecture). 1945年,冯·诺依曼首先提出了&quo ...

  6. 关于ARM的内核架构

    @TOC张凌001 关于ARM的内核架构 很多时候我们都会对M0,M0+,M3,M4,M7,arm7,arm9,CORTEX-A系列,或者说AVR,51,PIC等,一头雾水,只知道是架构,不知道具体是 ...

  7. Uboot中start.S源码的指令级的详尽解析

    Uboot中start.S源码的指令级的详尽解析 版本:v1.9 Crifan Li 摘要 本文对Uboot中的Start.S的源码的几乎每一行,都进行了详细的解析 本文提供多种格式供: 在线阅读 H ...

  8. 【期末复习资料】嵌入式系统及应用

    第一章 嵌入式系统导论 嵌入式系统概述 嵌入式系统的定义 嵌入式系统是嵌入式计算机系统的简称.顾名思义,它是一种嵌入在设备(或系统)内部,为特定应用而设计的专用计算机系统. 嵌入式系统是以应用为中心. ...

  9. 组成原理(五)CPU指令流水线

    5.5 CPU指令流水线 一. 流水线 流水线 (1)流水线: 指令从取值到真正执行的过程划分成多个小步骤,cpu真正开始执行指令序列时,一步压一步的执行,减少其等待时间. (2)流水线级数越多,工作 ...

最新文章

  1. 云计算行业报告:2018, 风起云涌
  2. java四行代码实现图片下载
  3. 【Selenium 小知识】获取 token 和 cookies
  4. 1.2传值、引用、常量引用
  5. 亲加通讯云郝飞:探讨直播低延迟低流量的粉丝连麦技术
  6. ARM(IMX6U)BSP工程文件管理(分文件编程)
  7. Android 高级编程 RecyclerView 控件的使用
  8. 计算机编程学英语词汇,计算机编程英语词汇大全
  9. STM32编译环境、建立工程模板以及程序下载
  10. 限流的简单使用及学习
  11. 用MicroPython开发ESP32-文件传输工具-ampy
  12. CNN和机器学习算法性能测试
  13. 数据资产目录建设之数据分类全解(上)
  14. Visdom 介绍 | 二
  15. Java实现mysql保存微信特殊表情符号
  16. Mentor-dft 学习笔记 day44-Low-Power Design Test
  17. python中的递归函数如何表示_python:递归函数
  18. 【Python】批量对文件做downsample并且以指定名称保存到文件夹中
  19. frozen ui php,推荐几个移动端前端UI框架
  20. 虚拟服务器主机选型,如何选择虚拟主机?Windows主机选购指南

热门文章

  1. 浅C#中的装箱和拆箱
  2. VNC Viewer方式的远程连接树莓派
  3. C++/C中的Sleep函数
  4. JAVA环境与相关软件的下载与配置
  5. [4G+5G专题-141]: 终端 - 测试仪表详解
  6. 常用的RSS阅读器评测
  7. 瀑布流代码PHP,thinkPHP实现瀑布流的方法
  8. python 网页版支付宝 api_Python接入支付宝进行PC端支付
  9. 微信编辑器春天模板推荐
  10. 论文笔记28 -- (Vehicle ReID)VOC-ReID: Vehicle Re-identification based on Vehicle-Orientation-Camera