如果陷阱是由中断引起的,则 mcause 寄存器中的“Interrupt”位被设置。Exception Code 字段用于标识最后一个异常或中断的代码。下表列出了可能的机器级异常代码。异常代码是 WLRL 字段,因此仅保证包含受支持的异常代码。 (PS: 读者可能疑惑为啥在mcause中会存在 Supervissor software interrupt [TODO]) mstatus# MIE...
mncause CSR 包含 NMI 的原因,第 63 位设置为 1,并且 NMI 原因编码在最低有效位中,如果不支持 NMI 原因,则为零。mncause 的低位,定义为 exception_code,如下: mnstatus CSR 包含一个两位字段,在进入陷阱处理程序时,它包含以与 mstatus.mpp 相同的方式编码的中断上下文的特权模式 MNRET Instruction 此仅M ...
第1023行,当CSR处于S_CSR_IDLE时,如果中断状态为S_INT_SYNC_ASSERT,则在第11行将CSR状态设置为S_CSR_MEPC,在第12行将当前指令地址保存下来。 在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这...
第1023行,当CSR处于S_CSR_IDLE时,如果中断状态为S_INT_SYNC_ASSERT,则在第11行将CSR状态设置为S_CSR_MEPC,在第12行将当前指令地址保存下来。 在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这...
在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。 第24~28行,目前tinyriscv只支持定时器这个外设中断。 第30~31行,如果是中断返回指令,则设置CSR状态为S_CSR_MSTATUS_MRET。
riscv的trap(陷阱)主要分为异常(exception)和中断(interrupt)两类。其中异常就是illegal instruction, ecall一类,而interrupt则是timer interrupt, external interrupt一类。 trap处理机制(handling)是由csr中相关控制寄存器配置的,包括trap向量表,trap托管和中断使能。
当处理器进入异常后,即开始从mtvec寄存器定义的PC地址执行新的程序,该程序通常为异常服务程序,并且程序还可以通过查询mcause中的异常编号(Exception Code)以及mdcause中的详细异常信息决定进一步跳转到更具体的异常服务程序。譬如当程序查询mcause中的值为0x2,则得知该异常是非法指令错误(Illegal Instruction)引起的,因此...
任何时候,中断和异常的产生都是十分值得关注的,这些将破坏程序原有的执行逻辑。按照芯片的设计来说,中断和异常大致上可以分为三类异常(Exception)、陷入(Trap)、外部中断(Interrupt)。 异常(Exception) 在一条指令执行的过程中发生了错误,可以通过异常处理函数进行处理,最常见的异常包括无效的内存地址访问、非法指令异常...
任何时候,中断和异常的产生都是十分值得关注的,这些将破坏程序原有的执行逻辑。按照芯片的设计来说,中断和异常大致上可以分为三类异常(Exception)、陷入(Trap)、外部中断(Interrupt)。 异常(Exception) 在一条指令执行的过程中发生了错误,可以通过异常处理函数进行处理,最常见的异常包括无效的内存地址访问、非法指令异常...
• When a virtual page is accessed and the A bit is clear, or is written and the D bit is clear, a page-fault exception is raised • When a virtual page is accessed and the A bit is clear, or is written and the D bit is clear, the corresponding bit(s) are set in the PTE...