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.

[参考译文] AM263P4:FIQ 中断已中断主循环中的代码、而不保存 s0-S31 寄存器的上下文

Guru**** 2874300 points

Other Parts Discussed in Thread: AM263P4

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1628042/am263p4-fiq-interrupt-has-been-interrupting-code-in-main-loop-and-not-saving-the-context-of-the-s0-s31-registers

器件型号: 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

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

    您好、请注意、该专家目前因节假日而离职。 他们会尽快回复你。 谢谢你。

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

    尊敬的 Austin:

    Im 对此、我将在一些测试后提供一些反馈。

    此致、
    Shaunak

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

    感谢您发送编修。   

    -克里斯  

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

    尊敬的 Austin/Chris:

    根据您的描述和 SDK 代码审核、我们怀疑 FIQ 处理程序的编译器生成的序言和尾声代码在您的手动 FPU 上下文保存/恢复函数执行之前和之后可能正在使用 FPU 寄存器。 这将解释为什么 D0-D15 寄存器看起来可以单独正确保存/恢复、但 s0-S31 寄存器(这只是相同 d0-D15 寄存器的不同视图)出现损坏。

    以下是可疑事件序列:
    1、FIQ 触发→硬件保存 PC/CPSR
    2、编译器生成的序言代码执行→可能使用 FPU 寄存器作为暂存空间
    3. Hwip_save_fpu_context () 保存已经损坏的 FPU 状态
    4. ISR 体以浮点运算执行
    5. Hwip_restore_fpu_context () 恢复损坏状态
    6、编译器生成的尾声代码执行→可能会进一步损坏 FPU 寄存器
    7.返回主循环→看到不正确的 FPU 寄存器值

    这与 IRQ 处理程序不同、IRQ 处理程序完全在汇编语言 (HwiP_armv7r_Handlers_nortos_asm.S:49) 中实现、并在执行任何 C 代码或编译器生成的代码之前手动保存 FPU 上下文。

    但我不确定并且还需要一些信息来验证上述情况是否属实:

    1.反汇编 FIQ 处理程序:请生成 HwiP_Fiq_handler 函数的反汇编列表、以查看实际的编译器生成的代码

    2.编译器版本和标志:您正在使用什么编译器和版本(TI ARM Clang、GCC 等)? 您是否在使用 SDK 默认值之外的任何特殊编译器标志?

    3.在修改 FIQ 处理程序实现之前、您是否可以尝试将__attribute__(target(“general-regs-only"))“)属性添加到 FIQ 处理程序函数中? 这会告知编译器避免在生成的代码中使用 FPU 寄存器。

    此致、
    Shaunak