Other Parts Discussed in Thread: AM263P4
器件型号: AM263P4
团队、
我们的客户对 AM263P4 MCU 有如下疑问:
“简而言之、我们发现 FIQ 中断在主循环中中断了代码、而没有保存 s0-S31 寄存器的上下文。 我们已将 EN_SAVE_RESTORE_FPU_context 设置为在内核/DPL/HwiP.h 中定义、从而在 FIQ 处理程序中启用以下函数调用:
/*保存 FPU 上下文、在 FIQ 处理程序中使用*/
静态内联 void Hwip_save_FPU_context (void)
{
__ASM____Volatile _ (“FMRX R0、FPSCR““\n\t":“:::“内存“);
__ASM____Volatile _ (“VPUSH {D0-D15}““\n\t":“:::“内存“);
__ASM____Volatile__ (“Push {R0}““\n\t":“::::“内存“);
}
/*恢复 FPU 上下文、在 FIQ 处理程序中使用*/
静态内联 void Hwip_restore_FPU_context (void)
{
__ASM____Volatile__ (“POP {R0}““\n\t":“::::“内存“);
__ASM____Volatile__ (“VPOP{D0-D15}““\n\t":“:::“内存“);
__ASM____Volatile _ (“VMSR FPSCR, R0““\n\t":“:::“内存“);
}
但是、我们注意到主循环中有一个点、在这个点中、一行有多个 FPU 指令(一些 vldr 和一个 vcmp.f32)、而 FIQ 会在其中一些指令之间中断代码。 然后、FIQ 执行一些浮点运算并在不恢复 s0-S31 寄存器的情况下返回。 这会导致主循环出现意外行为。
我们已经查看了中断前后的 VFP 寄存器以及 D0-D15 寄存器被正确恢复、但 s0-S31 寄存器没有。 我们假设 s0-S31 寄存器直接映射到 d0-D15 的高/低 32 位、因此它们也会恢复、但没有恢复。 我们是否缺少一个步骤来使其正常工作? 在进行上下文恢复后、我们是否需要“刷新“s0-s31 寄存器?
CY、
CY