当一个 hart 发生异常时,硬件自动经历如下的状态转换: 异常指令的 PC 被保存在 mepc 中,PC 被设置为 mtvec。(对于同步异常,mepc 指向导致异常的指令;对于中断,它指向中断处理后应该恢复执行的位置。) 根据异常来源设置 mcause(如图 10.3 所示),并将 mtval 设置为出错的地址或 者其它适用于特定异常的信息字。
risc-v--mvec寄存器/mepc 寄存器/mcause 寄存器 点评: 异常和中端都是trap, cpu 在发生的trap的时候,pc会执行mvec的地址去执行,所有mvec需要提前设置好。此时,mpec放入的当前指令,或者下一条指令地址。 相当于对当前指令的备份, mret就是把mpec的指令拿出放到pc里面执行,当然, mpec的值,我们也可以手动的修改。
这种寻址消除 了读取和解码mcause的需要,加快了中断处理速度。 将mtval [0]设 置为1可启用此功能; 然后根据异常/中断原因x将PC设置为(mtval-1 + 4x ),而不是通常的mtvec。 mepc(Machine Exception PC)它指向发生异常/中断的指令。 mcause(Machine Exception Cause)它指示发生异常/中断的原因(类型)。 mie(...
其中 ECALL 在机器模式下的异常编码是 11,而 EBREAK 的 异常编码是 3(参见表19)。 RISC-V 的特权架构标准中特别强调,当遇到 ECALL 和 EBREAK 指令时,应 该将 mepc 寄存器(此处仅讨论机器模式)的值设置为当前指令的地址,而不是下 一条指令的地址。细心的读者也许会问:“如果是这样,当异常处理结束时,调...
通常情况下,最简单的异常处理是跳过异常发生的指令,只需要在异常处理中将 mepc +=4,然后再 mret ,处理器就会跳过 (0x80000104 ebreak)指令,执行(0x80000108 addi x2, x2, 2)指令。 mtval Machine Trap Value Register (mtval) 机器模式异常值寄存器。
会进行如下操作: -将PC指针设置为me的值 -将m的MPIE域复制MIE恢复的中断使能 - 将权限模式设置为mstatus的MPP域中的值 芯片上电默认进入的是机器,通过将mstatus中的MPP值设置为00(00: User, : Supervisor, 11: Machine), 并将main函数地址赋值给mepc,调用mret,使得用户在进入main函数运行时,芯片由...
异常指令的 PC 被保存在 mepc 中, PC 被设置为 mtvec。(对于同步异常, mepc指向导致异常的指令;对于中断,它指向中断处理后应该恢复执行的位置。) 根据异常来源设置 mcause(如图 10.3 所示),并将 mtval 设置为出错的地址或者其它适用于特定异常的信息字。
这款芯片基于SpacemiTX60™Core智算核构建,该智算核是一款双发按序的多核多簇RISC-V RVA22处理器核,采用22nm工艺,搭载了256bit RISC-V Vector1.0向量扩展及SpacemiT ME智算扩展技术。该芯片可提供强大的AI算力与DSP能力,满足现代边缘计算设备对性能与功耗的双重需求。
mepc是机器模式下异常程序指针,其只会在发生异常是被更新(中断也是一类异常),进异常时我们可以从另外两个csr寄存器mcause来看引起异常原因通过mtval查看引起异常时的值。当从异常返回时mepc的值被更新给pc。我们正是通过进中断修改mepc来实现任务的切换的,后面会详细说明这个过程。实时操作系统大家应该不陌生,...
第1023行,当CSR处于S_CSR_IDLE时,如果中断状态为S_INT_SYNC_ASSERT,则在第11行将CSR状态设置为S_CSR_MEPC,在第12行将当前指令地址保存下来。 在第1323行,根据不同的指令类型,设置不同的中断码(Exception Code),这样在中断服务程序里就可以知道当前中断发生的原因了。