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.

[参考译文] RM46L430:在 IRQ 和 FIQ (RM46)中使用浮点寄存器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/700651/rm46l430-using-floating-point-registers-in-irq-and-fiq-rm46

器件型号:RM46L430

您好!

如果我在 FIQ 和 IRQ 中使用 FP 计算、并且 FIQ 中断 IRQ、那么我会得到错误的比较。
假设我在 IRQ 中有以下指令:

VCMPE.F32S16、S17
VMRSAPSR_nzcv、FPSCR 

我是否只需要保存寄存器 s0-S31、还是也必须保存寄存器 FPSCR?

我会使用此代码解决我的问题:

;FIQ 例程
VPUSH{s0-s15}
VPUSH{S16-S31}的开始

;FIQ

VPOP{S16-S31}
VPOP{s0-s15}中的 FP 计算
;FIQ 例程的结束 

这是否起作用?

谢谢!

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

    您好 Falk、

    如果您不保存这些寄存器、如果需要这些寄存器中的先前值、那么您可能会在从 IRQ/FIQ ISR 返回主代码后收到错误。 我不明白为什么 ISR 中会出现错误(FPSCR 标志)?

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

    你好!

    我成功解决了此 asm 文件的问题:

    区域 SVC_Area、代码、只读
    PRESERVE8
    
    导出_saveVfp
    导出_loadVfp
    
    _saveVfp
    
    VMRS r0、FPSCR
    推送{r0}
    VPUSH{s0-s15}
    VPUSH{S16-S31}
    
    BXLR
    
    _loadVfp
    
    VPOP{S16-S31}
    VPOP{s0-s15}
    VPOP{s0}
    、rSR 0r
    
    
    
    

    在使用 float 的中断内部、我在开头调用"_saveVfp ()"、在结尾调用"_loadVfp ()"
    它可以正常工作、但是否有更简单的解决方案?

    此致、

    福尔克

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

    感谢您发布您的解决方案。 它们看起来很好。

    如果启用了 VFP 并使用了浮点、则调用函数应在调用 ISR 时保存 VFP 寄存器的 S0~S15、并在程序退出 ISR 时恢复这些寄存器。 在 ISR 调用之前,其它寄存器(S16~S31和 FPSCR)不会被保留,如果它们的值需要被保留,调用函数必须将它们保存。

    我刚刚使用包含浮点运算的 RTI 比较0 ISR (IRQ)进行了测试。 我没有看到 ISR 保留了 VFP 寄存器。