From bdea091ec08ff348186e441a8d19807dffdc8d63 Mon Sep 17 00:00:00 2001 From: Yan_yan Date: Mon, 2 Nov 2020 11:03:25 +0800 Subject: [PATCH] modify the content of kernel/int.md --- docs/doc/kernel/int.md | 128 ++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/docs/doc/kernel/int.md b/docs/doc/kernel/int.md index 097f3f8..b0d3847 100644 --- a/docs/doc/kernel/int.md +++ b/docs/doc/kernel/int.md @@ -1,98 +1,98 @@ # 中断机制 -## 简介 - 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 - 中断的触发一般是由外设或者CPU内部产生,由中断控制器进行处理再通知到CPU进行中断响应过程,其要点如下: +## 简介 +中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 +中断的触发一般是由外设或者CPU内部产生,由中断控制器进行处理再通知到CPU进行中断响应过程,其要点如下: - •外设或者CPU内部产生的这个中断来源称为中断源; - •CPU响应中断转入到的新的处理程序称为中断服务程序; - •中断处理完成后,处理器需要恢复之前的现场,简称“恢复现场”; - •当多个中断源请求中断的时候,需要通过优先级区分中断,便于CPU进行中断的处理; - •低优先级可以被高优先级打断,这个过程称之为中断嵌套; - •中断可以被屏蔽; - •所有的中断源都有一个编号,称为“中断号”; - •每一个中断号通过中断向量表与中断服务程序一一对应,中断向量表保存的是所有的中断服务程序的入口地址,该入口地址被称之为中断向量; ++ 外设或者CPU内部产生的这个中断来源称为中断源; ++ CPU响应中断转入到的新的处理程序称为中断服务程序; ++ 中断处理完成后,处理器需要恢复之前的现场,简称“恢复现场”; ++ 当多个中断源请求中断的时候,需要通过优先级区分中断,便于CPU进行中断的处理; ++ 低优先级可以被高优先级打断,这个过程称之为中断嵌套; ++ 中断可以被屏蔽; ++ 所有的中断源都有一个编号,称为“中断号”; ++ 每一个中断号通过中断向量表与中断服务程序一一对应,中断向量表保存的是所有的中断服务程序的入口地址,该入口地址被称之为中断向量; -## 中断机制 - ## RISC-V架构的中断和异常 - ### 概述 - 从广义上来说,中断和异常属于一个概念;对于处理器而言,通常只区分为同步异常和异步异常。 - 同步异常:同步异常是指由于执行程序或者试图执行指令而产生的异常;例如,非法指令访问; - 异步异常:最常见的异步异常是外部中断,例如外设触发一个外部中断。 +## RISC-V架构的中断和异常 +### 概述 +从广义上来说,中断和异常属于一个概念;对于处理器而言,通常只区分为同步异常和异步异常。 ++ 同步异常:同步异常是指由于执行程序或者试图执行指令而产生的异常;例如,非法指令访问; ++ 异步异常:最常见的异步异常是外部中断,例如外设触发一个外部中断。 ### 异常处理机制 - • 进入异常时,RISC-V架构规定(以机器模式为例): - 1、当前的程序执行流停止执行,直接跳转到CSR寄存器的mtvec定义的PC地址执行; - 2、硬件同时更新下列几个CSR寄存器(具体情况可参考RISC-V架构介绍): - • mcause(Machine Cause Register):机器模式异常原因寄存器 - • mepc(Machine Exception Program Register):机器模式异常PC寄存器 - • mtval(Machine Trap Value Register):机器模式异常值寄存器 - • mstatus(Machine Status Register):机器模式状态寄存器 - mstatus寄存器的Exception Code域标识是何种异常或者何种中断。定义如下图表格所示: ++ 进入异常时,RISC-V架构规定(以机器模式为例): + + 当前的程序执行流停止执行,直接跳转到CSR寄存器的mtvec定义的PC地址执行; + + 硬件同时更新下列几个CSR寄存器(具体情况可参考RISC-V架构介绍): + + mcause(Machine Cause Register):机器模式异常原因寄存 + + mepc(Machine Exception Program Register):机器模式异常PC寄存器 + + mtval(Machine Trap Value Register):机器模式异常值寄存器 + + mstatus(Machine Status Register):机器模式状态寄存器 +mcause寄存器的Exception Code域标识是何种异常或者何种中断。定义如下图表格所示: - • 退出异常时,需要从异常服务程序中退出,并返回主程序。RISC-V架构定义了一组专门的退出异常指令:MRET、SRET、URET,分别 - 对应机器模式、监督模式、用户模式的退出。 - 以MRET为例,当处理器执行MRET指令后,硬件行为如下: - 1、当前程序执行流程停止执行,跳转到mepc的地址运行; ++ 退出异常时,需要从异常服务程序中退出,并返回主程序。RISC-V架构定义了一组专门的退出异常指令:MRET、SRET、URET,分别对应机器模式、监督模式、用户模式的退出。 +以MRET为例,当处理器执行MRET指令后,硬件行为如下: + 1、当前程序执行流程停止执行,跳转到mepc的地址运行; 2、更新mstatus状态寄存器(具体情况可参考RISC-V架构介绍); ### 中断类型 - RISC-V 架构定义的中断类型分为 4 种。 - • 外部中断(External Interrupt) :指来自处理器核外部的中断,例如GPIO、UART等产生的中断。 - • 计时器中断(Timer Interrupt) :计时器中断是指来自计时器的中断。 - • 软件中断(Software Interrupt) :软件中断是指来自软件自己触发的中断。 - • 调试中断(Debug Interrupt):专用于实现调试器(Debugger)。 +RISC-V 架构定义的中断类型分为 4 种。 ++ 外部中断(External Interrupt) :指来自处理器核外部的中断,例如GPIO、UART等产生的中断。 ++ 计时器中断(Timer Interrupt) :计时器中断是指来自计时器的中断。 ++ 软件中断(Software Interrupt) :软件中断是指来自软件自己触发的中断。 ++ 调试中断(Debug Interrupt):专用于实现调试器(Debugger)。 ### 中断控制器 - 1、CLINT 模块生成计时器中断和软件中断 - CLINT 的全称为处理器核局部中断控制器(Core Local Interrupts Controller),主要用于产生计时器中断(Timer Interrupt)和软件中断(Software Interrupt)。 - 2、PLIC 管理多个外部中断 - PLIC 全称为平台级别中断控制器(Platform Level Interrupt Controller),它是 RISC-V架构标准定义的系统中断控制器,主要用于多个外部中断源的优先级仲裁。 - RISC-V中断控制器如下图所示: ++ CLINT 模块生成计时器中断和软件中断 +CLINT 的全称为处理器核局部中断控制器(Core Local Interrupts Controller),主要用于产生计时器中断(Timer Interrupt)和软件中断(Software Interrupt)。 ++ PLIC 管理多个外部中断 +PLIC 全称为平台级别中断控制器(Platform Level Interrupt Controller),它是 RISC-V架构标准定义的系统中断控制器,主要用于多个外部中断源的优先级仲裁。 +RISC-V中断控制器如下图所示: ### 中断处理流程 #### 中断服务程序 - 每一个中断源对应一个中断号,每一个中断号又通过中断向量表和中断服务程序进行关联。当中断产生后,通过中断向量表 - 跳转到中断服务程序的入口地址进行执行。如下图所示: +每一个中断源对应一个中断号,每一个中断号又通过中断向量表和中断服务程序进行关联。当中断产生后,通过中断向量表跳转到中断服务程序的入口地址进行执行。如下图所示: #### 中断处理流程 - CPU响应中断并进行处理,通常经历以下过程:保存当前线程的栈信息、跳转中断服务程序运行、恢复被打断的线程栈继续运行。 - 如下图所示: +CPU响应中断并进行处理,通常经历以下过程:保存当前线程的栈信息、跳转中断服务程序运行、恢复被打断的线程栈继续运行。 +如下图所示: ### 中断函数接口 ```c -xs_int32 xs_RegisterHwIrq(xs_uint32 irq, void * handler, void *arg, char *name); +typedef void *xs_handler_x(int irq_num, void *arg) +xs_int32 xs_RegisterHwIrq(xs_uint32 irq_num, xs_handler_x handler, void *arg, const char *name); ``` -该函数用于 +该函数用于注册一个中断,当产生中断时,将调用该硬件中断号相应的回调函数进行执行 。 +| 参数 | 描述 | +| --- | --- | +| irq_num | 硬件中断号 | +| handler | 中断处理回调函数 | +| arg | 中断处理回调函数的参数 | +| name | 中断名称 | ```c -xs_int32 xs_FreeHwIrq(); +xs_int32 xs_FreeHwIrq(xs_uint32 irq_num); ``` +该函数用于释放一个中断。 +| 参数 | 描述 | +| --- | --- | +| irq_num | 硬件中断号 | ```c -xs_int32 xs_DisableHwIrq(); +xs_int32 xs_DisableHwIrq(xs_uint32 irq_num); ``` - +该函数用于屏蔽一个中断。 +| 参数 | 描述 | +| --- | --- | +| irq_num | 硬件中断号 | ```c -xs_int32 xs_EnableHwIrq(); +xs_int32 xs_EnableHwIrq(xs_uint32 irq_num); ``` - +该函数用于注使能一个中断。 +| 参数 | 描述 | +| --- | --- | +| irq_num | 硬件中断号 | ## 使用场景 - - - - - -/* 底层的中断控制器操作函数*/ - -xs_int32 xs_DisableHwPlicIrq() ///< RISCV平台级别中断控制器中断关闭接口,控制片上外设中断 -xs_int32 xs_EnableHwPlicIrq() ///< RISCV平台级别中断控制器中断使能接口,控制片上外设中断 - -xs_int32 xs_DisableHwClintIrq()///< RISCV局部中断控制器中断关闭接口,控制片上定时器中断和软件中断 -xs_int32 xs_EnableHwClintIrq() ///< RISCV局部中断控制器中断使能接口,控制片上定时器中断和软件中断 - -xs_int32 xs_DisableGloableIrq()