如何清除 risc-v 处理程序中的异常?
How to clear an exception in handler in risc-v?
以下是我在FE310 Sifive-Hifive1-Rev B板的陷阱程序。
my_trap_routine:
// read mcause
csrr t0, mcause;
// read mepc
csrr t1, mepc;
mret;
现在,我生成了一个加载访问错误异常,并且执行跳转到了陷阱例程中。现在如何清除处理程序中的异常,使其不会一次又一次地跳入陷阱程序?
你必须增加异常程序计数器,以便你return到用户/中断代码之后的下一条指令。
这在 RISC V 中相当简单,除非正在使用压缩指令集,在这种情况下,您必须解码异常指令以确定将 PC 推进多远。
幸运的是,这是一个非常简单的解码,但您需要注意 RISC V 允许以 2 字节增量的大小改变指令长度。
以下是我在FE310 Sifive-Hifive1-Rev B板的陷阱程序。
my_trap_routine:
// read mcause
csrr t0, mcause;
// read mepc
csrr t1, mepc;
mret;
现在,我生成了一个加载访问错误异常,并且执行跳转到了陷阱例程中。现在如何清除处理程序中的异常,使其不会一次又一次地跳入陷阱程序?
你必须增加异常程序计数器,以便你return到用户/中断代码之后的下一条指令。
这在 RISC V 中相当简单,除非正在使用压缩指令集,在这种情况下,您必须解码异常指令以确定将 PC 推进多远。
幸运的是,这是一个非常简单的解码,但您需要注意 RISC V 允许以 2 字节增量的大小改变指令长度。