webclient 请求期间发生异常_RISCV入门基础:RISCV架构的中断与异常(1)

写在前面的啰嗦话:

    前面介绍了最基本的必备RV32整数指令集,其他指令集做为入门就不再介绍,下面开始介绍异常中断系统,这是任何一款处理器的关键和必备;我们在2021年的毕业论文题目里列举了几个关于Riscv架构处理器设计的题目,涉及处理器设计、高级综合器应用,python移植,欢迎毕业班童鞋们踊跃选取!

    关于如何正确写好单片机程序,使单片机达到最佳性能,明天在“电路与电测”微信公众号里将推文讲解,感兴趣的童鞋可以去关注。

主题:

    中断与狭义异常的差异:中断一般指外部设备产生的异步异常,而狭义的异常指处理器核内部产生的同步异常,两者的处理工作流程基本一致,因此有时用广义异常(简称异常)来指代狭义异常和中断;没有特别指明”广义异常”时我们指的都是狭义异常。中断与异常两种概念存在一定程度的混用情况。

    RISC-V架构中定义了4种中断类型:外部中断、内核计时器中断、软件中断和调试中断。用户可以再自定义或扩展以上4种异常中断:

(1) 外部中断是指来自于处理器核外部的中断,例如外围设备UART、GPIO等产生的中断。通常多个外围设备中断可以通过中断管理器PLIC后再接入RISC-V内核的外部中断;当然也可以不通过PLIC直接扩展。

(2) 内核计时器中断是来自内核计时器的中断。

(3) 软件中断是由软件设置CSR空间的mip寄存器某些位而触发的中断,注意不是指ecal1指令异常,这些位可以是SSIP、USIP或MSIP(分别对应M、S、U模式)。

(4) 调试中断,专用于实现调试器(Debugger)

1.1.1  中断概述

处理器的中断(Interrupt)机制,可以简单描述如下:在顺序执行程序指令流时,其他请求打断并中止当前指令流的执行,处理器跳转去执行其他服务程序,待处理完其他服务程序后,返回原打断点继续执行之前的程序指令流。

l 打断当前处理器指令流的“其他请求”称为中断请求(Interrupt Request),“其他的请求”的来源称为中断源(Interrupt Source),中断源即可来自内核也可来自外围硬件设备。

l 处理器跳转而去处理的“其他服务”称为中断服务程序(Interrupt Service Routine,ISR)。

l 常用的事件处理机制有中断处理、查询处理两种;一般中断处理机制效率更高。处理器收到中断请求之后,需要保存当前程序的上下文现场(比如相关的寄存器内容的保存),简称为保存现场。处理完中断服务程序执行完后,处理器需要根据保存的现场信息,恢复之前的上下文现场,从而继续执行之前被打断的程序,简称为“恢复现场”。

l 可能存在多个中断源同时向处理器发出请求的情况,此时需要对这些中断源进行优先级仲裁,从而优先处理哪些优先级别高的中断源。此种情况称为“中断仲裁”。不同的中断可以分配不同的优先级,即中断存在着“中断优先级”的概念。

l 当处理器正在执行某个中断服务程序,此时又有一个优先级更高的新中断请求到来,此时处理器该如何是处理?

1) 第一种情况是处理器并不响应新的中断,而是继续执行当前的中断服务程序,待到原中断服务程序完成之后才响应新的中断请求,这时称为处理器“不支持中断嵌套”。

2) 第二种情况是如果新的中断请求的优先级比正在处理的中断优先级高,则处理器中止当前的中断服务程序,转而开始响应新的中断请求,并执行新的“中断服务程序”,如此便形成了中断嵌套(即前一个中断还没响应完,又开始响应新的中断),并且嵌套的层次可以不止一层。

如果新的中断请求的优先级比正在处理的中断优先级低(或者相同),则不管处理器是否能支持“中断嵌套”,都不会响应这个新的中断请求,此时处理器必须完成当前的中断服务程序之后,才可能响应新的中断请求(因为新中断请求的优先级并不比当前正在处理的中断优先级高)。

1.3.2异常概述

处理器在顺序执行程序指令流的过程中,遇到了异常的事件而中止执行当前的程序,跳转而去运行该狭义异常的服务程序,这就是异常( Exception)机制。

l 处理器遇到的“异常的事件”称为异常( Exception)。异常与中断的最大区别在于中断往往是一种外因,是异步事件,而异常是由处理器内部事件或程序执行中的同步事件引发的,例如处理器硬件故障、程序故障,或者执行特殊的系统服务指令等都可以引起异常。

l 类似中断服务程序概念,异常响应时处理器会执行异常服务程序。

l 可能存在多个异常同时发生的情形,因此异常也有优先级,而且也可能发生多重异常的嵌套。广义而言,中断也可以被认为是一种异常,是一种异步事件的异常。

l 当把传统的异常和中断概念分开时,传统的异常一般称为“狭义的异常”;而“广义异常”是指代传统的异常和中断,此时把中断也认为是一种异常。

1.3.3 RISCV的异常中断处理机制

RISC-V的定义了三种工作模式:机器模式(Machine Mode),用户模式( User Mode)、监督模式(Supervisor Mode)。在不同的模式下均可以产生异常中断,而RISC-V的异常中断的响应模式(即处理器应该在什么模式下响应异常中断)是很灵活的,分为vertical trap和horizontal trap两种:

l vertical trap模式是指响应模式比产生模式级别高,即在用户模式触发异常中断时,异常中断的服务程序自动切换到S模式或者M模式下运行;S模式触发异常中断时,异常中断的服务程序自动切换到M模式。

l horizontal trap模式是指响应模式和产生模式级别一样,即在S模式触发异常中断时,异常中断的服务程序在S模式下运行;M模式触发异常中断时,异常中断的服务程序在M模式下运行。

l 一般同时存在U和M模式时,都是U模式下产生异常中断时,切换到M模式下运行服务程序;M模式下产生异常中断时,还是M模式下运行服务程序;不会M模式下产生异常中断时,切换到S模式下运行服务程序;而U模式下产生异常中断时,也不会在U模式下运行服务程序,这不如设计成只有M模式。

RISC-V架构要求机器模式是必须具备的模式,其他的模式均是可选而非必备的模式。后续仅介绍基于机器模式的异常处理机制。

一、异常中断的进入

异常中断进入时,RISC-V架构规定的硬件行为如下:

(1) 如果处理器有用户和机器两种模式,则工作模式由用户模式切换到机器模式;如果只有一种机器模式则不存在切换问题。

(2) 停止当前指令流执行,跳转到特定PC地址重新取指令执行:

l 单向量模式,跳转到CSR寄存器mtvec指示的PC地址重新取指令执行

l 多向量模式,跳转到CSR寄存器mtvec的BASE域+4*CAUSE指示的PC地址重新取指令执行

(3) 硬件同时更新以下4个CSR寄存器:

l 机器模式异常原因寄存器mcause  (Machine Cause Register)

l 机器模式异常PC寄存器mepc (Machine Exception Program Counter)

l 机器模式异常值寄存器mtval  (Machine Trap Value Register)

l 机器模式状态寄存器mstatus  (Machine Status Register)

1.跳转到mtvec指示的PC地址重新取指令执行

在RISC-V架构处理器的程序执行过程中,一旦发生异常且响应异常,则终止当前的指令流,处理器从mtvec寄存器内容指定的新PC地址开始取新指令运行,该过程在RISC-V的架构中命名为一个“陷阱(trap)”。RISC-V处理器trap后跳入的PC地址由机器模式异常向量基址寄存器mtvec(Machine Trap-Vector Base-Address Register)的CSR寄存器指定:

(1) mtvec寄存器是一个可读可写的CSR寄存器,软件可以编程修改其值。

(2) mtvec寄存器的详细格式如下表1.3.1所示,其中的最低2位是MODE域,高30位是BASE域。

20c28f1b623631448412f9bef2fef80e.png

往期推荐

RISCV入门基础:基础整数指令(RV32I)(3)

RISCV入门基础:基础整数指令(RV32I)(3)

RISCV入门基础:基础整数指令(RV32I)(2)

RISCV入门基础:基础整数指令(RV32I)(1)

RISCV入门基础:RISC-V指令集描述

RISCV入门基础:通用寄存器模型

注意:刚才发现推文里两篇重复的名称的相同推文,应该是发重复了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值