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字节

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

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

另外补充说明就是根据以上描述,流水线只有被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线被再次填满。因此,尽量地少使用跳转指令可以提高程序的执行效率这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pclr-irq #4。

最新文章

  1. Oracle Connect by与递归with
  2. jquery的live转on的办法
  3. 还是畅通工程[HDU1233]
  4. 一个可拖拽的DIV框框
  5. c语言基础数据类型及命名规范
  6. Spring源码学习之:FactoryBean的使用
  7. 《零成本实现Web性能测试:基于Apache JMeter》读书笔记
  8. paip.java 线程无限wait的解决
  9. 详解Java中的访问控制修饰符(public, protected, default, private)
  10. Django视图与网址传参
  11. 2016 cocoapods的安装和使用以及版本升级遇到的问题
  12. linux下删除乱码文件、目录
  13. C++中使用const修饰指针
  14. tarjin求割点
  15. echarts 中国地图实现 省、市、区县三级联动,省级下钻、市级下钻
  16. 20135327郭皓--Linux内核分析第八周 进程的切换和系统的一般执行过程
  17. js 模拟call、apply、bind实现
  18. linux设置时间显示格式和系统版本
  19. Excel2010如何合并列数据
  20. TEXT 6 Travelling with baggage

热门文章

  1. 华中校赛 14th
  2. ggplot2绘制Excel所有图
  3. IP分组
  4. bug提交遵循的规则
  5. CF70E Information Reform
  6. 010_STM32程序移植之_lib库建立
  7. Lavevel 中 trait 如何继承与复写
  8. bufferedinputstream FileInputStream inputstream的比较
  9. danfu添加商品实例
  10. java大视频上传实现