xuos-web/docs/doc/kernel/int.md

99 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 中断机制
## 简介
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
中断的触发一般是由外设或者CPU内部产生由中断控制器进行处理再通知到CPU进行中断响应过程其要点如下
•外设或者CPU内部产生的这个中断来源称为中断源
•CPU响应中断转入到的新的处理程序称为中断服务程序
•中断处理完成后,处理器需要恢复之前的现场,简称“恢复现场”;
•当多个中断源请求中断的时候需要通过优先级区分中断便于CPU进行中断的处理
•低优先级可以被高优先级打断,这个过程称之为中断嵌套;
•中断可以被屏蔽;
•所有的中断源都有一个编号,称为“中断号”;
•每一个中断号通过中断向量表与中断服务程序一一对应,中断向量表保存的是所有的中断服务程序的入口地址,该入口地址被称之为中断向量;
## 中断机制
## 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架构定义了一组专门的退出异常指令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
### 中断控制器
1、CLINT 模块生成计时器中断和软件中断
CLINT 的全称为处理器核局部中断控制器Core Local Interrupts Controller主要用于产生计时器中断Timer Interrupt和软件中断Software Interrupt
2、PLIC 管理多个外部中断
PLIC 全称为平台级别中断控制器Platform Level Interrupt Controller它是 RISC-V架构标准定义的系统中断控制器主要用于多个外部中断源的优先级仲裁。
RISC-V中断控制器如下图所示
### 中断处理流程
#### 中断服务程序
每一个中断源对应一个中断号,每一个中断号又通过中断向量表和中断服务程序进行关联。当中断产生后,通过中断向量表
跳转到中断服务程序的入口地址进行执行。如下图所示:
#### 中断处理流程
CPU响应中断并进行处理通常经历以下过程保存当前线程的栈信息、跳转中断服务程序运行、恢复被打断的线程栈继续运行。
如下图所示:
### 中断函数接口
```c
xs_int32 xs_RegisterHwIrq(xs_uint32 irq, void * handler, void *arg, char *name);
```
该函数用于
```c
xs_int32 xs_FreeHwIrq();
```
```c
xs_int32 xs_DisableHwIrq();
```
```c
xs_int32 xs_EnableHwIrq();
```
## 使用场景
/* 底层的中断控制器操作函数*/
xs_int32 xs_DisableHwPlicIrq() ///< RISCV平台级别中断控制器中断关闭接口控制片上外设中断
xs_int32 xs_EnableHwPlicIrq() ///< RISCV平台级别中断控制器中断使能接口控制片上外设中断
xs_int32 xs_DisableHwClintIrq()///< RISCV局部中断控制器中断关闭接口控制片上定时器中断和软件中断
xs_int32 xs_EnableHwClintIrq() ///< RISCV局部中断控制器中断使能接口控制片上定时器中断和软件中断
xs_int32 xs_DisableGloableIrq()