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.

[参考译文] TMDSRM48HDK:FPU 异常处理

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/856315/tmdsrm48hdk-exception-handling-for-fpu

器件型号:TMDSRM48HDK
主题中讨论的其他器件:HALCOGEN

我已启用 FPU 并将 FPU 异常路由到 VIM Ch 47作为 FIQ (也已尝试 IRQ)。 我已启用辅助控制寄存器8-13中 FPU 的异常传播。 我在我的应用程序中启用 interrupts _enable_interrupt_()、然后我执行一个 FPU 操作、如 div 为零。 我没有得到中断。 我是否错过了任何步骤?  

其他中断、如 gionification、可以正常工作。

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

    查看此主题是否有助于:

    此致、Sunil

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

    谢谢、Sunil。 这对我没有帮助。

    我不使用 RTOS 或 UDIV 汇编代码进行除法。 我确定正在执行零分频、因为我在执行除法时看到 FPSCR 中的 DZC 位被置位。 反汇编显示:

     VLDR S0、[PC、#12]
     VLDR S2、[PC、#12]
     VDIV.F32 S1、S0、S2

    在 Jean-Marc 从您共享的线程中提供的示例项目中、为什么使用下面的代码设置辅助控制寄存器中的 DZC 位?

     MRC P15、#0、R3、C1、c0、#0
     ORR R3、R3、#0x80000
     MCR P15、#0、R3、C1、c0、#0

    由于 DZC 是位9、我希望得到如下所示的0x200掩码。

     MRC P15、#0、R3、C1、c0、#0
     ORR R3、R3、#0x00200
     MCR P15、#0、R3、C1、c0、#0

    以上都没有为我设置 DZC (位9)。

    我使用下面的代码启用 DZC 位、我看到 DZC 位按预期设置

           MRC  P15、    0、      r0、        C15、 c0、  0  r
           ORR  r0、     r0     、#0x000200     
           MCR  P15、    0、      r0、        C15、 c0、  0  

    我不确定 C1与 C15、但使用 C1不会设置 DZC 位。

    我启用 DZC 位的方法是否正确?

    我是否需要额外做什么来将 VIM 通道47设置为 FIQ 或 IRQ。

    我使用设置 vimInit()中的 VIM 通道

    vimRAM->ISR[47]=(t_isrFuncptr)&myFpuInterHandler。

    在 vimInit()之后,我使用_enable_interrupt_()启用中断

    还有事吗?

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

    Guy、

    我只在该另一个线程上发布、以指出需要在 C15辅助控制寄存器中设置 DZC 使能控制、以便 FPSCR.DZC 状态标志引起一个中断请求被生成。 Cortex R4/5 TRM 包含用于读取和写入该寄存器的示例汇编指令:

    MRC P15、0、 ,C15,c0,0;读取辅助控制寄存器
    MCR P15、0、 、C15、c0、0;写入辅助控制寄存器

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

    Cortex TRM 是我使用下面的方法(复制的)写入 C15寄存器时遵循的方法。 这本质上是一个读取-修改-写入、因此您可以看到我使用屏蔽0x200进行读取、修改(对应于 DZC 的位9)、然后将其写回。

           MRC  P15、    0、      r0、        C15、 c0、  0  
           ORR  r0、     r0     、#0x000200     
           MCR  P15、    0、      r0、        C15、 c0、  0  

    我确信上述操作正常、正如我在上一篇文章中所述、因为我看到寄存器窗口中启用了寄存器位。 我询问了 Jean-Marc 方法、因为他使用屏蔽0x80000对 C1寄存器进行了寻址、并建议也启用 DZC 位。

    因此、让我澄清一下我的问题/情况:

    我已启用上述汇编代码的 DZC 异常。

    我相信我已经通过前面描述的步骤在 RM48中启用了中断。

    当我除以零时、我仍然没有获得任何中断、这就是为什么我要问是否还有其他需要检查的东西。  

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

    您好!

    JM 建议的方法允许您在零分频条件下生成未定义指令异常。 这通常是在您不想生成 CPU 中断的情况下完成的。

    我已经尝试启用一个在零分频条件下生成的中断、它运行正常。 我将在此处附加一个 CCS 项目文件以供参考。 在 HALCoGen 设置中、您可能缺少针对 FPU 中断请求的中断管理器(VIM)中的使能。

    e2e.ti.com/.../4212.FPU_5F00_DBZ.zip