This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:ARM 未定义指令中止处理程序

Guru**** 2466550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/665824/tms570lc4357-arm-undefined-instruction-abort-handler

器件型号:TMS570LC4357

您好、是否有一个未定义指令中止处理程序示例可用? 我导致了一个未定义的指令异常(目的是为了测试原因)、并且我有一个汇编代码处理程序、该处理程序在异常时按预期被调用。 我想弄清楚发生未定义指令的地址。 目前我查看的是 LR (R14_UND)、该指令地址不正确。 如果我查看包含我预期的指令地址的 R14_USER 寄存器。 在处理程序中、我的 CPSR 模式= 11011 (未定义)符合预期。

如何确定在这个未定义的指令异常处理程序中发生故障的指令?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mike:

    导致未定义指令异常的地址可通过 R14或 R14_UND 计算:

    如果指令为32位:地址为 R14-0x4

    2、如果指令是16位:地址是 R14-0x2

    我的示例:禁用 VFP 后、我使用调用一个浮点指令来触发此错误。 导致 UNDEF 的指令为 vmov (...) 在0x00004294 (反汇编窗口)

    R14和 R14_UND 为0x4294+0x4=0x4298 (寄存器窗口)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。 我在 R14或 R14_UND 中看不到正确的地址。 我尝试执行随机 RAM 地址、导致未定义指令异常:

     uint32_t transferAddress =(uint32_t) 0x0800FFFF;    //未定义指令中止
     ((((void (*)(void ))转让地址)();

    请参见下面的地址 x11C4D4。 但是、在我的 R14和 R14_UND 中有0x08011BB4。

    在我的 R14_USR 中有0x0011C4D8、这是导致故障的正确指令。 如果在我的中断处理程序中、我切换到系统模式、那么我可以读取 R14 (R14_USR)寄存器以获取地址、但它似乎没有像我预期的那样或在您的示例中发生的那样存储在 R14_und 中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现、如果我通过在 C 代码中执行此行来导致一个未定义的指令
    _asm (" UDF #0");
    我最终会进入未定义的指令处理程序、并且 LR 和 LR_UND 确实保存了正确的地址、并且我不需要切换到系统模式。
    我不确定导致未定义指令异常的原因是什么
    uint32_t 传输地址=(uint32_t) 0x0800FFFF; //未定义的指令中止
    ((((void (*)(void ))转让地址)();
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mike:

    中止相关信息位于 CP15故障状态寄存器中。 其中包括 数据故障状态寄存 器(DFSR)、指令故障状态寄存器(IFSR)、相关的数据故障和触发故障辅助故障状态寄存器(ADFSR 和 AIFSR)、数据故障地址寄存器(DFAR)、以及指令故障地址寄存器(IFAR)。 当然、由于您正在实施指令故障、因此您对 IFSR、AIFSR 和 IFAR 寄存器最感兴趣。 从第4.3.2节开始、ARM Cortex-R5F TRM 中包含所有这些以及它们内的位编码的详细信息。ARM 网站上的 TRM 链接如下:  

    对于可下载的 PDF 版本:

    对于在线版本:  

    与这些寄存器中的信息一起、应该能够在 R14_abt 寄存器中捕获违规指令地址。  

    如果在导致异常的指令之后需要处理程序返回、TRM 还包括一个有关处理未定义指令的部分。 此说明位于 TRM 的第3.8.6节。