You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

e200z4核触发异常时,如何判断指令为定长或变长?

e200z4核心机器检查中断中VLE指令长度判断问题

我的问题与e200z4参考手册第5章相关。

我有一段错误修正代码,会根据异常发生时指令的长度,将程序计数器(PC)增加2字节或4字节,使用的核心为e200z4。该核心同时支持4字节定长指令和变长VLE指令。

目前遇到的问题:

  • 我们只触发了机器检查中断(IVOR1),发生在开机/关机测试中,开机时中断时长递增、关机时固定。
  • 按照逻辑,要判断是否启用VLE,需要检查异常综合征寄存器(ESR)的VLEMI位,但ESR的值始终为0x00000000,无法获取该位信息。

我想知道:

  1. 为什么CPU在机器检查中断发生时不提供VLE相关信息(比如ESR的VLEMI位)?
  2. 这种情况下,该如何判断中断发生时的指令是定长还是变长?

补充说明

注1:下方代码中的isOpCode32Bit用于解码操作码判断指令长度,但仅当isFixedLength为0(即(syndrome & VLEMI_MASK)等于1)时才有效。因此必须从syndrome中获取VLEMI的值,但ESR似乎始终为0x00,这是为什么?

注2:如前所述,我们始终进入IVOR1,且可以获取到中断发生前的指令地址。

相关代码

// IVOR1(机器检查中断汇编代码):
(mfmcsr r7)  // 将MCSR复制到寄存器7(参考手册第5章)
(store r7 &syndrome)

// IVOR2:
(mfesr r7)  // 将ESR复制到寄存器7(参考手册第5章)
(store r7 &syndrome)
#define VLEMI_MASK 0x00000020uL

isFixedLength = ((syndrome & VLEMI_MASK) == 0);

if (isFixedLength  || isOpCode32Bit)
{
    PC += 4;    // 指令为32位,将PC增加4
}
else
{
    PC += 2;    // 指令为16位,将PC增加2
}

内容的提问来源于stack exchange,提问作者Xfce4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:45:46