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.

[参考译文] TMS320F28075:通过 FPU、TMU (R4H 至 R7H、XAR3?)保存 ISR 寄存器

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1030949/tms320f28075-isr-register-save-with-fpu-tmu-r4h-to-r7h-xar3

器件型号:TMS320F28075

您好!

我们得到一个 FPU 溢出(PIE 12.7)中断、并想知道它可能来自何处。

寄存器保存是否有问题? 生成的代码是

       cpu_timer0_isr ():
01484e:  761B       ASP          
01484f:  FFF0       按        RB
014850:  0005       推        入 AR1H:AR0H
014851:  ABBD       MOVL        *SP++,XT
014852:  AABD       MOVL        * SP++、XAR2
014853:  A8BD       MOVL        *SP++,XAR4
014854:  A0BD       MOVL        *SP++,XAR5
014855:  C2BD       MOVL        *SP++,XAR6
014856:  C3BD       MOVL        *SP++,XAR7
014857:  E20000BD   MOV32       *SP++,STF
014859:  E20300BD   MOV32       *SP++,R0H
01485b:  E20301BD   MOV32       * SP++,R1H
01485d:  E20302BD   MOV32       * SP++,R2H
01485f:  E20303BD   MOV32       * SP++,R3H
014861:  E6300600   SETFLG      RNDF32=1、RNDF64=1
014863:  FF69       SPM         #0
014864:  2942       CLRC        OVM|PAGE0
014865:  5616       CLRC        AMODE

我知道表3-4。 在 SPRU430F 中保存寄存器对和用于保存上下文的 SP 位置。

R4H 到 R7H 的情况如何? 编译器是否未使用它们?
XAR3有何作用? TMU 有任何问题?

还有其他原因吗?

编译器标志为:

-v28 -ml -mt --cla_support=cla1 --tmu_support=tmu0 --vcu_support=vcu2 -O2 --include_path="C:/ti/ccsv7/tools/compiler/ti-cgt-c2000_16.9.6.LTS/include --include_path="C:/workspace/firmware/duc/rtos/include --include_path="C:/workspace/firmware/duc/device_support/f2837xs/common/include --include_path="C:/workspace/firmware/duc/test_rtos_f2837xs_launchpad --include_path="C:/workspace/firmware/duc/device_support/f2837xs/headers/include --cuse_remote_ines=-cuse_remote_remote_remote_inese-dages=-cuse-dagese-ine_remote_inese-inese-inese-ci-cludiag_inese-ci-clus-inese-inese-inese-ci-clus-ci-clus-inese-inese-inese-

谢谢、此致、

弗兰克

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

    您好、Frank、

    我在  编译器标志中看不到--float_support=fpu32。 这是原因吗?

    -Shantanu

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

    您好、Shantanu、

    我不认为这是原因。 很抱歉、我在使用--fpu32和--tmu0选项时从 CCS 复制了编译器标志。 看起来--tmu0表示--fpu32 (当--tmu0打开时,我无法关闭--fpu32,请参阅屏幕截图,但在我复制的标志列表中,--fpu32消失)。

    无论如何、生成的代码在两种情况下是相同的(通过将 R0H 保存到 R3H 等)、我对其他寄存器的问题仍然相同。

    谢谢、此致、

    弗兰克

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

    您好、Frank、

    是的、您是正确的标志。 FPU 溢出中断发生在 LVF 标志的情况下、该标志仅由数学运算触发。  

    理想情况下、XAR3应在上下文保存期间保存、我们需要调查其原因。  通常不会保存 R4H 至 R7H。  

    但是、如果产生的中断是12.7、则需要跟踪 STF 寄存器并确定生成中断的确切点。 您能否单步执行代码并让我知道生成中断的确切时间点?

    -Shantanu

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

    您好、Shantanu、

    感谢您的支持。 我们将尝试重现错误、似乎很难捕捉到。

    您是否有关于寄存器保存的新闻?

    谢谢、此致、

    弗兰克

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

    您好、Frank、

    高优先级中断使用快速上下文保存、因此只保存基本寄存器。 这可能是您观察到保存的寄存器数量较少的原因。 您能否尝试将其设为低优先级中断并让我知道您观察到的内容?

    -Shantanu

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

    您好、Shantanu、

    我不知道如何使它成为低优先级中断、C28xx CPU 上的 IMHO 对于屏蔽的中断只有一个级别。 确保存在不同级别的寄存器保存: 如果我使用汇编程序、我自己负责保存未自动保存的寄存器(SPRU430F 中的表3.4)、如果 C-ISR 没有调用任何其他函数、编译器可能会决定不保存未使用的寄存器。 但是、一旦 ISR 中有任何函数调用(如我的示例中所示)、我认为编译器可能使用的所有寄存器都必须保存。

    谢谢、此致、

    弗兰克

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

    您好、Shantanu、

    感谢您提供的有趣链接。 IMHO、PIE / PIEIER 事件和优先级不会影响 CPU/FPU 寄存器的保存/恢复。

    但我尝试了#pragma 中断(CPU_timer0_ISR、LPI | HPI)、实际上、保存/恢复是不同的、详细信息如下所示。 FPU 手动 SPRUHS1B 指出、将 R0H 保存/恢复到影子寄存器中/从影子寄存器中恢复到 R7H、这适用于无法嵌套的高优先级 ISR (HPI)。 遗憾的是、#pragma 不会阻止用户程序嵌套。 好的、编译器手册 SPRU514P 中有一条警告。

    但在本例中、我们需要嵌套 ISR、因此默认设置 LPI 是正确的设置(在堆栈上保存 FPU 寄存器)。

    因此、我仍然想知道 R4H 到 R7H 和 XAR3 (以及 TMU?)是什么情况。 如果编译器从未使用它们、一切都很好、我们必须搜索其他原因。 否则、运行如此多程序是一个奇迹...

    谢谢、此致、

    弗兰克

    以下是高优先级和低优先级 ISR 的分解:

    HPI:

    013da6:  761B       ASP          
    013da7:  0005       按        AR1H:AR0H
    013da8:  ABBD       MOVL        * SP++、XT
    013da9:  AABD       MOVL        * SP++、XAR2
    013daA:  A8BD       MOVL        *SP++,XAR4
    013dab:  A0BD       MOVL        *SP++,XAR5
    013dac:  C2BD       MOVL        *SP++,XAR6
    013DAD:  C3BD       MOVL        * SP++、XAR7
    013dae:  FFF0       按        RB
    013daf:  E6700600   保存        RNDF32=1、RNDF64=1
    013db1:  FF69       SPM         #0
    013db2:  2942       CLRC        OVM|PAGE0
    013db3:  5616       CLRC        AMODE
    013db4:  761F0030   MOVW        DP、#0x30

    (笑声)

    013e7b:  E562       restore      
    013e7c:  FFF1       POP         RB
    013e7d:  C5BE       MOVL        XAR7、*--SP
    013e7e:  C4BE       MOVL        XAR6、*--SP
    013e7f:  83BE       MOVL        XAR5、*- SP
    013e80:  8ABE       MOVL        XAR4、*--SP
    013e81:  86BE       MOVL        XAR2、*- SP
    013e82:  87BE       MOVL        XT、*- SP
    013e83:  0003       POP         AR1H:AR0H
    013e84:  7617       NASP         
    013e85:  7602       IRET         

    LPI:

    013da6:  761B       ASP          
    013da7:  FFF0       按        RB
    013da8:  0005       按        AR1H:AR0H
    013da9:  ABBD       MOVL        *SP++,XT
    013daA:  AABD       MOVL        * SP++、XAR2
    013dab:  A8BD       MOVL        *SP++,XAR4
    013dac:  A0BD       MOVL        *SP++,XAR5
    013DAD:  C2BD       MOVL        * SP++、XAR6
    013dae:  C3BD       MOVL        * SP++、XAR7
    013daf:  E20000BD   MOV32       * SP++,STF
    013db1:  E20300BD   MOV32       * SP++,R0H
    013db3:  E20301BD   MOV32       * SP++,R1H
    013db5:  E20302BD   MOV32       * SP++,R2H
    013db7:  E20303BD   MOV32       * SP++,R3H
    013db9:  E6300600   SETFLG      RNDF32=1、RNDF64=1
    013dbb:  FF69       SPM         #0
    013dbc:  2942       CLRC        OVM|PAGE0
    013dbd:  5616       CLRC        AMODE
    013dbe:  761F0030   MOVW        DP、#0x30

    (笑声)

    013e85:  E2A03BE   MOV32       R3H、*- SP、UNCF
    013e87:  E2AFE02BE   MOV32       R2H、*- SP、UNCF
    013e89:  E2A01BE   MOV32       R1H、*- SP、UNCF
    013e8b:  E2A00BE   MOV32       R0H、*- SP、UNCF
    013e8d:  E28000BE   MOV32       STF、*--SP
    013e8f:  C5BE       MOVL        XAR7、*- SP
    013e90:  C4BE       MOVL        XAR6、*- SP
    013e91:  83BE       MOVL        XAR5、*- SP
    013e92:  8ABE       MOVL        XAR4、*--SP
    013e93:  86BE       MOVL        XAR2、*- SP
    013e94:  87BE       MOVL        XT、*- SP
    013e95:  0003       POP         AR1H:AR0H
    013e96:  3B30       SETC        INTm|DBGM
    013e97:  FFF1       POP         RB
    013e98:  7617       NASP         
    013e99:  7602       IRET

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

    弗兰克、

     我想知道这是否是优化的函数。 您能否将优化级别恢复为关闭、而不针对代码大小进行优化? 如果编译器检测到 XAR3未被使用、它可能不会保存它。  

    -Shantanu

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

    Shantanu、

    如果 ISR 中有函数调用、我认为这不能是操作错误(-Ox 标志)的函数。 这些函数可以使用编译器实际不知道的不同优化(例如、在库中)进行编译。

    谢谢、此致、

    弗兰克