Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2584854
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: C/C++

2014-07-09 12:08:19

4.3 异常向量 

所有异常向量都存放在管理员地址空间,并通过相对寻址方式访问。只有复位和软件复位向量是放在处理器存储表中。一旦初始化结束,异常向量表基址复位后被装入VBR  

C?CORE 支持512字节的异常向量表,可容纳128个异常向量 (参见表 4-1)。开始32 个向量用于内部产生的异常。剩余96个向量用于外部设备,诸如中断控制器等。中断请求发生时,产生一个7位向量,C?CORE接受中断后,装入中断向量号,产生对应的向量地址。如果外部设备不提供向量,可提供自动向量功能。正常中断(INT)与快速中断(FINT)的自动向量号是分开的,分别是1011号。 


4.4 异常类型 
本节描述了外部中断异常和C?CORE产生的各种内部异常。涉及以下异常: ? 复位 ? 未对界 ? 访问错 ? 0作除数 ? 非法指令 ? 违反特权 ? 跟踪 ? 断点 
? 不可恢复错 ? 软件复位 ? 正常中断 ? 快速中断 ? 硬件加速器 ? Trap 指令   
4.4.1 复位异常 (向量位移 0x0)  
复位异常拥有最高的异常有先级。它提供了系统初始化和从灾难性错误恢复功能。复位终止了任何正常处理的流程而且不可恢复。  
复位异常置位PSR(S),将处理器置于管理员模式;清除PSR(TM)位禁止跟踪。复位异常还清除PSR的中断使能位IE和FE, 调试模式位(DB), 和硬件加速器使能位U3-U0。复位异常还清除向量基址寄存器 (VBR)将异常向量表的基地址调到地址0(0x00000000)。然后CPU 从异常向量表的偏移地址$0 读出复位向量加载到PC里。复位异常的处理从PC所指的这个存储器单元开始。  
4.4.2 未对界异常 (向量位移 0x4)  
当处理器试图执行一条load或store类指令,但所访问的操作数不在位于与访问宽度一致的自然边界上,这时发生未对界异常。未对界异常可通过设置PSR(MM)位来屏蔽,从而忽视数据对界检查,而且出现不对界现象时,CPU访问到的是相邻的、低一位的自然边界地址单元。在进入异常处理程序时,EPC寄存器指向的是原试图进行不对界访问的指令。  
除了与数据相关的未对界异常外,如果jmpi和jsri这些跳转类指令的目标地址是奇数,也会导致未对界异常。这时,EPC内存放的是要跳转的地址,而不是jmpi或jsri指令的地址。发生的唯一条件是“进入异常处理程序时EPC的值是奇数”。  
4.4.3 访问错异常 (向量位移 0x8)  
当访问外部存储器时,出现传送错误应答信号(TEA#)被外部指定时导致终止了一个总线周期,这时发生访问错异常。  
如果是一个操作数访问导致总线错误,那么肯定引起访问错异常, 处理器立即进行异常 处理。  






 




如果是指令预取期间检测到总线错,则该异常被推迟发生,直至处理器试图去执行该指令。这时,总线错误异常被标志(指送出信号)并开始执行异常处理。如果在指令预取周期里遇到一个错误,但相应的指令因为是跳转类指令而不会执行,该总线错误作废。在进入异常处理程序时,EPC寄存器指向的是与该总线错相关的那条指令。   
访问错异常也可以在禁止访问中出现TLB丢失时由外部存储器管理单元申请。 
  
4.4.4  0作除数异常 (向量位移 0x0C) 
以0为除数的除法指令引起的异常类似于陷阱指令。当处理器检测到一个以0为除数的除法指令时,它启动异常处理而不是执行该指令。在进入异常处理程序时,EPC寄存器指向的是该除法指令。
  
4.4.5 非法指令异常 (向量位移 0x10)  
非法指令引起的异常类似于陷阱指令。 当处理器对一条非法指令或未实施的指令译码时,它启动异常处理而不是执行该指令。在进入异常处理程序时,EPC寄存器指向的是该非法指令。
  
4.4.6 违反特权异常 (向量位移 0x14)  
为了系统安全,某些指令被赋予特权。在用户模式下,若试图执行下列特权指令时会导致违反特权异常: mfcr, mtcr, rfi, rte, stop, wait,doze。  
违反特权引起的异常类似于非法指令。 当处理器识别出一个违反特权时,它在执行该指令前启动异常处理。在进入异常处理程序时,EPC寄存器指向的是该特权级指令。   
4.4.7 跟踪异常 (向量位移 0x18)  
为支持程序开发,C?CORE拥有2类跟踪能力:逐条指令跟踪和指令跳转跟踪。在逐条指令跟踪模式时,每执行完一条指令产生一次跟踪异常, 使DEBUG程序能监视程序的执行。在指令跳转跟踪模式时,只有在执行完可能引起跳转的指令(跳转,jmp等)后,才发生一次异常处理,而不管是否真地改变了程序流向。  
 
下列指令产生指令跳转跟踪:jmp, jsr, jmpi, jsri, br, bt, bf, bsr, loopt.无任它们运行结果如何,都会导致跟踪异常。   
如果跟踪时某指令因发生了与指令相关的异常,跟踪异常将被推迟,不产生跟踪异常或标志挂起。如果在跟踪指令结束时有中断挂起,跟踪异常被推迟,在EPSR中标志挂起作为异常识别的一部分。  PSR(TM)字段控制跟踪。TM字段的状态决定了指令结束后是否产生跟踪异常。参见 2.2.2 处理器状态寄存器 关于TM字段的定义。  
跟踪异常处理在被跟踪的指令正常执行完毕后以及下一条指令开始前启动. 在进入异常处理程序时,EPC寄存器指向的是下一条指令,而不是被跟踪的指令。  
4.4.7 跟踪异常 (向量位移 0x18)  
为支持程序开发,C?CORE拥有2类跟踪能力:逐条指令跟踪和指令跳转跟踪。在逐条指令跟踪模式时,每执行完一条指令产生一次跟踪异常, 使DEBUG程序能监视程序的执行。在指令跳转跟踪模式时,只有在执行完可能引起跳转的指令(跳转,jmp等)后,才发生一次异常处理,而不管是否真地改变了程序流向。  
 
下列指令产生指令跳转跟踪:jmp, jsr, jmpi, jsri, br, bt, bf, bsr, loopt.无任它们运行结果如何,都会导致跟踪异常。   
如果跟踪时某指令因发生了与指令相关的异常,跟踪异常将被推迟,不产生跟踪异常或标志挂起。如果在跟踪指令结束时有中断挂起,跟踪异常被推迟,在EPSR中标志挂起作为异常识别的一部分。  PSR(TM)字段控制跟踪。TM字段的状态决定了指令结束后是否产生跟踪异常。参见 2.2.2 处理器状态寄存器 关于TM字段的定义。  
跟踪异常处理在被跟踪的指令正常执行完毕后以及下一条指令开始前启动. 在进入异常处理程序时,EPC寄存器指向的是下一条指令,而不是被跟踪的指令。


某些特定控制相关的指令 (rte, rfi, trap, stop, wait, doze和bkpt)从来不被跟踪,尽管在EPSR(TP)位被设置后,跟踪异常可能作为rte、rti指令正常执行的一部分而发生。这种发生与PSR/EPSR中TM位设置无关。   
如果在一条被跟踪指令完成时有中断挂起,那么被挂起的中断享有较高优先级。在中断异常被处理时,影子寄存器PSR中跟踪挂起TP会被设置为1。在中断处理程序结束处的 rte或rfi指令被执行后再发生挂起跟踪异常处理。  
 
4.4.8 断点异常 (向量位移 0x1C) 
断点指令 bkpt和硬件断点请求(BRKRQ#)共用一个独特的异常向量。请参考对应的微控制器用户手册关于BRKRQ输入操作。为了降低硬件断点异常丢失的可能性,该异常比将BRKRQ信号作为中断输入具有更高的优先级。如果在指令预取时确认BRKRQ输入,断点异常将在这条指令执行前发生(即不会因为遇到跳转类指令要改变指令流而作废)。如果是在数据读取时确认BRKRQ输入信号,那断点异常将在这指令执行完毕后发生。对于 bkpt指令或是在指令访问时确认BRKRQ输入信号,在进入异常句柄入口时EPC指向该指令。对于在数据访问时确认BRKRQ输入信号,在进入异常句柄入口时EPC指向下一条指令。  
4.4.9 不可恢复错异常 (向量位移 0x20)  
除了快速中断异常以外的异常如果发生在PSR(EE)清除状态时会导致一个不可恢复错异常 ,因为异常恢复所需的现场 (先前存放在EPC和EPSR影子寄存器里) 已经因被不可恢复错异常而破坏。  
该错误通常是系统失败的一种指示,因为写软件时就注意了清除PSR(EE)时必须预防其他异常发生。因为引起这种不可恢复错异常的异常类型是未知的,故进入不可恢复错异常句柄时,EPC指向的一条可能已被执行也可能未被执行的指令。   
4.4.10 软件复位异常 (向量位移 0x24)  
 当SRST信号被确认时,被识别是软件复位异常。该异常是不可屏蔽的。软件复位异常 具有仅次于硬件复位的最高优先级,它提供了一种系统灾难性错误恢复的手段。当SRST信号被确认时,软件复位终止任何正在进行的处理,这个处理同样也是不可恢复的。待SRST信号被否认时,软件复位异常处理开始。  
软件复位异常置位PSR(S),将处理器置于管理员模式;清除PSR(TM)位,禁止跟踪;该异常也清除处理器中断使能位PSR(IE、FE)及异常使能位PSR(EE)。硬件加速器使能位U3-U0和不对界屏蔽位MM是不确定的。向量基址寄存器 (VBR)被清除,将异常向量表的基地址调到地址0(0x00000000)。 CPU从异常向量表的偏移地址0x24处读取软件复位向量,然后装入PC。 复位异常将控制权传递给PC所指的存储器单元并开始复位异常处理。  
 
4.4.11 中断异常 
当外围设备要求C?CORE的服务时,或者准备发送处理器所需的数据时,它用中断请求和向量信号通知处理器发生了一个中断异常。 

中断通常在指令的边界位置被识别,不过有些情况下如多周期指令,允许指令完成前优先执行中断处理,然后再重新执行指令,这样可以减少中断等待时间。当PSR(IC)位被置位时,允许divs, divu, ldm, ldq, mult, stm和stq 等多周期指令完成前中断。  
有2个中断请求信号,都支持自动向量模式及外部向量模式。 
 
表 4-1 显示了中断与CPU内核相关接口信号。 对于一般向量中断方式(FINT和INT), 在产生中断请求的同时,一个7位中断向量号同时也提供给了CPU;若是自动向量输入 AVEC被指定,则采用对应的预先定义好的向量号(10或11)。若是AVEC被指定,VEC# 输入不予理睬。   
4.4.11.1 正常中断 (INT)  
INT#是正常中断请求的输入。它在2个中断输入中优先级较低。当PSR(IE) 位被清除时,INT#输入被屏蔽。正常中断使用异常影子寄存器EPSR和EPC,对应的当PSR(EE)被清除时中断也被屏蔽。当INT#被指定时,若AVEC#输入被指定,则向CPU表示外围支持自动向量中断模式,否则向CPU表示外围支持一般向量中断模式并同时提供7位向量号(范围在32–127之间)。 (处理器不再明确表示排除向量号0–31)。 如果正常中断是自动向量模式的,则使用向量表偏移地址0x28处的向量。 
  
4.4.11.2 快速中断 (FINT)  
FINT# 是快速中断请求的输入。若被使能即PSR(FE)置位,它的优先级比正常中断输入高。快速中断使用异常影子寄存器FPSR和FPC,因此当PSR(EE)被清除时中断不被屏蔽。当PSR(FE)快速被清除时,中断被屏蔽。当FINT#被指定时,若AVEC#输入被指定,则向CPU表示外围支持自动向量中断模式,否则向CPU表示外围支持一般向量中断模式并同时提供7位向量号(范围在32–127之间)。(处理器不再明确表示排除向量号0–31)。 如果快速中断是自动向量模式的,则使用向量表偏移地址0x2C处的向量。  
4.4.12 硬件加速器异常 (向量位移 0x30)  
C?CORE提供一组使能位PSR (U3-U0)用于硬件加速器指令执行的控制。当加速器模块被禁止时,若试图执行hai操作码,则执行被终止,产生本异常。本异常向量也被用于由硬件部件报告的异常(作为hai指令执行的一部分内容)。参考对应的微处理器用户手册关于hai指令操作与硬件加速器接口的详细内容
4.4.13 指令陷阱异常 (向量位移 0x40-0x5C)  
某些指令用来产生精确的陷阱异常。trap #n指令总是强制发生异常,在用户程序中完成系统调用。进入异常句柄时,EPC指向的trap指令。  
4.5 异常优先级 
如表4-2所示,异常被分为6组,是按异常的特点以及处理的优先顺序分组。表4-2 从      C?CORE硬件角度所看到的,表示同时发生异常时的处理优先级顺序。在表4-2中, 1.0 代表优先级最高,6代表优先级最低。注意在组4和组5中,多个异常同享同一优先级,因为他们是互相排斥的




 










 










 





阅读(990) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~