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.

[参考译文] AM6442:R5F 外部中断

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1058989/am6442-r5f-external-interrupt

器件型号:AM6442

这适用于采用 MCU+SDK v08.01的 AM6442。

是否有任何示例显示如何设置 R5F 内核以通过 GPIO 引脚响应外部中断?

这是一个控制循环的快速中断、所以有什么提示可以确保 ISR 以最低延迟(FIQ 而不是 IRQ? ISR 函数和由链接器放置到 TCM 中的数据?) 非常感谢。

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

    您好 Steven、

    这是一个非 RTOS 应用程序还是 RTOS 应用程序?

    R5F VIM INTC 支持 IRQ 和 FIQ、而 HWI API 允许将中断指定为 IRQ 或 FIQ。

    下面记录了一个裸机(非 RTOS) GPIO 输入中断示例: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/08_01_00_36/exports/docs/api_guide_am64x/EXAMPLES_DRIVERS_GPIO_INPUT_INTERRUPT.html。 此示例使用 IRQ。

    HWI 记录在以下位置: https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/08_01_00_36/exports/docs/api_guide_am64x/KERNEL_DPL_HWI_PAGE.html

    FIQ 的限制记录如下:

    在进入中断回调函数之前、IRQ 和 FIQ 中断都通过调度程序。
          
    对于 IRQ 中断、VIM VIC 端口被缺省启用并且 CPU 直接分支至 ISR (IRQ 调度程序)地址。

    VIC 端口不支持 FIQ 的此功能、因此 R5F 必须读取 VIM MMR 才能在分支到发送器之前获取发送器地址。 但是、R5F FIQ 模式具有比 IRQ 更多的分组寄存器、因此需要在 ISR 中保存上下文的寄存器(使用的寄存器)较少。

    我无法在 SDK 中找到任何 R5F VIM/FIQ 用法示例。
           
    对于低延迟响应、我建议将中断调度程序代码/数据放置在 TCM 中、以及中断函数(回调)本身。 这可以使用链接器命令文件来实现。

    此致、
    弗兰克

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

    您好、Frank、

    谢谢、这些示例非常有用(不确定为什么我第一次错过了它们)。 我看到 FreeRTOS 和裸机都不支持在 FIQ 中断内保存/恢复 FPU。

    这是否意味着 FIQ 中断不支持浮点运算? 还是我们必须手动保存/恢复 FPU 上下文? 这是我们的主要用例之一-在低延迟中断中在 R5F 上运行的浮点控制代码。

    Steve

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

    您好 Steven、

    [引用 userid="187021" URL"~/support/processors-group/processors/f/processors-forum 1058989/am6442-r5f-external-interrupt/3920260#3920260]FIQ 中断中是否不支持浮点运算? 或者我们只需手动保存/恢复 FPU 上下文?

    FIQ 中断处理程序使用 TI-clang ARM 编译器"interrupt"关键字。 以下网址对此进行了说明: https://software-dl.ti.com/codegen/docs/tiarmclang/compiler_tools_user_guide/compiler_manual/c_cpp_language_implementation/attributes/function_attributes.html?highlight=interrupt#interrupt

    如果中断的上下文和 FIQ ISR 都使用浮点寄存器、则必须在 FIQ ISR 中手动保存/恢复浮点寄存器。

    这将需要与 SDK 处理 IRQ 的方式类似的 FIQ 中断处理、即在调用 C IRQ 发送程序之前调用汇编语言 ISR、以保存寄存器。

    此致、
    弗兰克

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

    您好、Frank、

    好的、这是有道理的、因为我们必须在其他平台上执行同样的操作。

    SDK 是否包含执行此操作的任何函数? 提出这样的要求:如果 TI 已经拥有用于在 TI 处理器上保存/恢复 FPU 寄存器的 API、我们就不会重新发明轮子。

    Steve

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

    您好、Steve、

    我无法找到用于此目的的函数。 但是、请参阅以下文件、了解可合并到 FIQ ISR 中的代码:

    • FREE-RTOS  : sources\kernel\freertos\portable\TI_arm_clang\arm_cr5F\portasc.S
    • 无 RTOS    : \sources\kernel\nortos\DPL\R5\Hwip_armv7r_handlers\nortos_asm.S

    例如、此代码:

    Fullscreen
    1
    2
    3
    4
    5
    6
    #if ENABLE_FPU_SAVE_RESTORE
    FMRX R0, FPSCR
    VPUSH {D0-D15}
    /* VPUSH {D16-D31} */
    PUSH {R0}
    #endif
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    也许可以将代码制作到汇编宏中。

    此致、
    弗兰克

x 出现错误。请重试或与管理员联系。