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

5.4 KiB
Raw Blame History

中断机制

简介

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
中断的触发一般是由外设或者CPU内部产生由中断控制器进行处理再通知到CPU进行中断响应过程其要点如下

  • 外设或者CPU内部产生的这个中断来源称为中断源
  • CPU响应中断转入到的新的处理程序称为中断服务程序
  • 中断处理完成后,处理器需要恢复之前的现场,简称“恢复现场”;
  • 当多个中断源请求中断的时候需要通过优先级区分中断便于CPU进行中断的处理
  • 低优先级可以被高优先级打断,这个过程称之为中断嵌套;
  • 中断可以被屏蔽;
  • 所有的中断源都有一个编号,称为“中断号”;
  • 每一个中断号通过中断向量表与中断服务程序一一对应,中断向量表保存的是所有的中断服务程序的入口地址,该入口地址被称之为中断向量;

RISC-V架构的中断和异常

概述

从广义上来说,中断和异常属于一个概念;对于处理器而言,通常只区分为同步异常和异步异常。

  • 同步异常:同步异常是指由于执行程序或者试图执行指令而产生的异常;例如,非法指令访问;
  • 异步异常:最常见的异步异常是外部中断,例如外设触发一个外部中断。

异常处理机制

  • 进入异常时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域标识是何种异常或者何种中断。定义如下图表格所示
XiUOS EXCEPTION TABLE

  • 退出异常时需要从异常服务程序中退出并返回主程序。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

中断控制器

  • CLINT 模块生成计时器中断和软件中断
    CLINT 的全称为处理器核局部中断控制器Core Local Interrupts Controller主要用于产生计时器中断Timer Interrupt和软件中断Software Interrupt
  • PLIC 管理多个外部中断
    PLIC 全称为平台级别中断控制器Platform Level Interrupt Controller它是 RISC-V架构标准定义的系统中断控制器主要用于多个外部中断源的优先级仲裁。
    RISC-V中断控制器如下图所示

XiUOS RISC-V CONTROLLER

中断处理流程

中断服务程序

每一个中断源对应一个中断号,每一个中断号又通过中断向量表和中断服务程序进行关联。当中断产生后,通过中断向量表跳转到中断服务程序的入口地址进行执行。如下图所示:

XiUOS ISR

中断处理流程

CPU响应中断并进行处理通常经历以下过程保存当前线程的栈信息、跳转中断服务程序运行、恢复被打断的线程栈继续运行。 如下图所示:

XiUOS PROCESS

中断函数接口

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 中断名称
xs_int32 xs_FreeHwIrq(xs_uint32 irq_num);

该函数用于释放一个中断。

参数 描述
irq_num 硬件中断号
xs_int32 xs_DisableHwIrq(xs_uint32 irq_num);

该函数用于屏蔽一个中断。

参数 描述
irq_num 硬件中断号
xs_int32 xs_EnableHwIrq(xs_uint32 irq_num);

该函数用于注使能一个中断。

参数 描述
irq_num 硬件中断号

使用场景