如何清除risc-v中处理程序中的异常?

问题描述

以下是我在 FE310 Sifive-Hifive1-Rev B 板中的陷阱程序。

my_trap_routine:

    // read mcause
    csrr t0,mcause;

    // read mepc
    csrr t1,mepc;

mret;

现在,我生成一个加载访问错误异常并且执行跳转到陷阱例程中。现在如何清除处理程序中的异常,以免它一次又一次地跳入陷阱例程?

解决方法

您必须提前异常程序计数器,以便您在用户/中断代码之后返回到下一条指令。

这在 RISC V 中相当简单,除非使用压缩指令集,在这种情况下,您必须解码异常指令以确定 PC 前进多远。

幸运的是,这是一个非常简单的解码,但您需要注意 RISC V 允许以 2 字节增量的大小改变指令长度。