您好、是否有一个未定义指令中止处理程序示例可用? 我导致了一个未定义的指令异常(目的是为了测试原因)、并且我有一个汇编代码处理程序、该处理程序在异常时按预期被调用。 我想弄清楚发生未定义指令的地址。 目前我查看的是 LR (R14_UND)、该指令地址不正确。 如果我查看包含我预期的指令地址的 R14_USER 寄存器。 在处理程序中、我的 CPSR 模式= 11011 (未定义)符合预期。
如何确定在这个未定义的指令异常处理程序中发生故障的指令?
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.
您好、是否有一个未定义指令中止处理程序示例可用? 我导致了一个未定义的指令异常(目的是为了测试原因)、并且我有一个汇编代码处理程序、该处理程序在异常时按预期被调用。 我想弄清楚发生未定义指令的地址。 目前我查看的是 LR (R14_UND)、该指令地址不正确。 如果我查看包含我预期的指令地址的 R14_USER 寄存器。 在处理程序中、我的 CPSR 模式= 11011 (未定义)符合预期。
如何确定在这个未定义的指令异常处理程序中发生故障的指令?
感谢您的回复。 我在 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 中。
尊敬的 Mike:
中止相关信息位于 CP15故障状态寄存器中。 其中包括 数据故障状态寄存 器(DFSR)、指令故障状态寄存器(IFSR)、相关的数据故障和触发故障辅助故障状态寄存器(ADFSR 和 AIFSR)、数据故障地址寄存器(DFAR)、以及指令故障地址寄存器(IFAR)。 当然、由于您正在实施指令故障、因此您对 IFSR、AIFSR 和 IFAR 寄存器最感兴趣。 从第4.3.2节开始、ARM Cortex-R5F TRM 中包含所有这些以及它们内的位编码的详细信息。ARM 网站上的 TRM 链接如下:
与这些寄存器中的信息一起、应该能够在 R14_abt 寄存器中捕获违规指令地址。
如果在导致异常的指令之后需要处理程序返回、TRM 还包括一个有关处理未定义指令的部分。 此说明位于 TRM 的第3.8.6节。