IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 第十一章:异常相关指令的实现 -> 正文阅读

[嵌入式]第十一章:异常相关指令的实现

11.1 MIPS32架构中定义的异常类型

在MIPS32架构中,有一些事件要打断程序的正常执行流程,这些事件有中断(Interrupt)、陷阱(Trap)、系统调用(System Call)以及其他任何可以打断程序正常执行流程的情况,统称为异常。异常类型及其优先级如表所示。

在这里插入图片描述在这里插入图片描述 OpenMIPS处理器只实现对其中6种异常情况的处理,列举如下:

  • 硬件复位
  • 中断(包含软中断、硬中断)
  • syscall系统调用
  • 无效指令
  • 溢出
  • 自陷指令引发的异常
    异常发生后,会进入异常处理例程进行具体的异常处理,处理结束后,返回到异常发生前的状态进行执行。在上面的6中异常中,硬件复位是一种特殊的异常,特殊之处在于不用从异常处理例程返回,所以不用考虑保护现场,也不用保存返回地址,OpenMIPS对硬件复位异常的处理方法是很简单的:全部寄存器清零,从地址0x0处取指执行,这实际也就是复位的过程,所以硬件复位异常的处理过程不再论述

11.2 精确异常

当一个异常发生后,系统的顺序执行会被中断,此时有若干条指令处于流水线上的不同阶段,处理器会转移到异常处理例程,异常处理结束后返回原程序继续执行,因为不希望异常处理例程破坏原程序的正常执行,所以对于异常发生时,流水线上没有执行完的指令,必须记住它处于流水线的哪一阶段,以便异常处理结束后能恢复执行,这便是精确异常。
对一个实现精确异常的处理器,在异常发生时,都会有一个被异常打断的指令,称为异常受害者(Exception Victim),也可称为发生异常的指令,该指令前面的所有指令都要被执行到流水线的最后一个阶段,也就是正常执行完成,但是该指令及该指令之后的指令都要被取消,就像从来没有执行过一样。如图11-1所示。第2条指令add在执行阶段发生溢出异常,在这种情况下,已经到达访存阶段的第1条指令ori会继续执行完成,而第2,3,4条指令都会被取消,不会有任何影响处理器的情况发生,就像没有进过流水线一样。在这里插入图片描述
为了实现精确异常,必须要求异常发生的顺序与指令的顺序相同,在非流水线的处理器上,这是必然的,但是对于拥有流水线的处理器,就会有些复杂。在流水线处理器上,异常会在流水线的不同阶段发生。带来潜在的问题。比如:以图11-2为例,加载指令lw会在流水线的访存阶段发生地址未对齐的异常(因为加载地址是0x3,指令lx要求加载地址的最后两位为00),该异常应该会在第4个时钟周期发生,而它的后一条指令di是无效指令(MIPS32架构没有定义该指令,所以是无效指令),会在流水线的译码阶段引发无效指令异常,也就是在第3个时钟周期,而此时上一条加载指令lw还处于执行阶段,没有进入访存阶段,所以先发生的异常就是无效指令异常。从而不满足异常发生的顺序与指令的顺序相同这一要求。在这里插入图片描述
为了避免上述情况,先发生的异常并不立即处理,异常事件只是被标记,并继续运行流水线。在大多数处理器中,会射击一个特殊的流水线阶段,专门用于处理异常。如果某一条指令的异常事件到达了流水线的这个阶段,那么会进行异常处理,并且当前处于流水线其余阶段的指令的异常事件都会被忽略。还是以图11-2为例,假设处理器会在访存阶段处理异常情况,那么di指令虽然在第3个时钟周期发生了异常,但是并不处理,只是保存一个异常标记,等到第5个时钟周期该指令进入访存阶段再处理。但是,在第4个时钟周期,上一条指令lw进入了访存阶段,并且发生了地址未对齐异常,因为已经处于访存阶段了,所以会处理该异常,而包括无效指令异常在内的流水线其余阶段的异常都被忽略。
通过以上方法就可以在流水线处理器中实现“按指令执行的顺序处理异常,而不是按异常发生的顺序处理异常处理”。

11.3 异常处理过程

当检测到异常发生后,处理器会执行一系列动作以处理异常,不同处理器的处理过程也不同,OpenMIPS处理器的处理过程如下:在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

11.4 异常相关指令介绍

MIPS32指令集架构中定义的异常相关指令包括:自陷指令、系统调用指令syscall、异常返回指令eret,下面分别介绍。

11.4.1 自陷指令

自陷指令有12条,按照指令中是否包含立即数,可以分为两类。

  1. bububaohan 立即数的自陷指令
    不包含立即数的自陷指令有6条,指令格式如图所示。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  2. 包含立即数的自陷指令
    包含立即数的自陷指令也就是6条,指令格式如图所示。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

11.4.2 系统调用指令syscall

在这里插入图片描述在这里插入图片描述在这里插入图片描述

11.4.3 异常返回指令eret

在这里插入图片描述

11.5 异常处理实现思路

在这里插入图片描述

11.5.1 实现思路

在这里插入图片描述在这里插入图片描述

11.5.2 修改数据流图

在这里插入图片描述

11.5.3 修改系统结构

为了实现异常处理,需要修改系统结构,添加部分接口,如图所示。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:20:18  更:2022-02-03 01:20:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:19:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码